如何使用lodash 问题

问题描述

情况

我有要过滤和重新排列的复杂JSON数据。我的数据是项目的深层嵌套。每个项目都有task_lists,其中包含tasks,每个任务都有assignees。每个受让人都有一个id

所以我的JSON树的结构大致是 ,例如:项目→任务列表→任务→分配者→id

我设法过滤和重新排列了数据–但是我不知道我的处理方式是否过于复杂或是否是最佳实践。

我想要实现的结果

我的目标是当前用户的任务列表。因此,我想将具有特定ID的用户分配给的所有任务。我想摆脱不必要的数据并重新排列JSON结构,因为我想在需要某种非常平坦结构的另一个vue组件中使用结果。

最终结果应如下所示:

{
  "id": 1,"title": "Aufgabe P1 A1","due_date_datetime": "2024-08-20 00:00:00","created_at_datetime": "2020-07-30 15:29:24","description_html": "<p><a href=\"https://www.xyz.de/\">https://www.xyz.de/</a></p>\n"
} 

代码示例

由于JSON非常大且可读性很差,因此很难在StackOverflow上提供代码示例。我准备了a CodeSandbox to illustrate the problem。我首先显示原始JSON数据,然后在下面显示过滤后的任务。 JSON是通过文件projects.json导入的。

到目前为止我尝试过的事情

我的第一种方法是使用多个循环:

if (!this.projects || !this.user.id) return null;

this.projects.forEach((project) => {
  project.task_lists.data.forEach((tasklist) => {
    tasklist.tasks.data.forEach((task) => {
      const assignees = task.assignees.data;
      if (assignees.length > 0) {
        assignees.forEach((assignee) => {
          if (assignee.id === this.user.id) {
            this.tasks.push(task);
          }
        });
      }
    });
  });
});

此刻,我使用 lodash ,因为我认为它对于过滤和重新排列可能更方便易读:

if (!this.projects || !this.user.id) return null;

// get tasklists from projects
let tasks = _.flatten(_.map(this.projects,"task_lists.data"));

// flatten tasklists to tasks
tasks = _.flatten(_.map(tasks,"tasks.data"));

// get tasks the current user is asssigned to
tasks = _.filter(tasks,task => {
  return task.assignees.data.some(e => e.id === this.user.id);
});

// rearrange data
const tasksCleaned = [];
_.forOwn(tasks,(item) => {
  tasksCleaned.push(
    {
      id: item.id,title: item.title,due_date_datetime: item.due_date.datetime,created_at_datetime: item.created_at.datetime,description_html: item.description.html,},);
});

return tasksCleaned;

问题

这种方法实用吗?请注意,我无法从正在使用的API中获得较小的JSON。看来步骤太多而且太复杂。什么是优雅的方式?性能如何?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)