问题描述
情况
我有要过滤和重新排列的复杂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 (将#修改为@)