[英]Javascript implement deep filtering in nested json data
我有以下数据结构
tasks = [{
id: 1,
name: "task1",
subtasks: [
{
id: 4,
name: "task2",
subtasks: [{
id: 11,
name: "task to remove",
completed: false
}]
},
{
id: 6,
name: "task to remove",
subtasks: []
},
{
id: 7,
name: "parent task to keep",
subtasks: [{
id: 11,
name: "task to keep",
completed: true
}]
}
]
},
{
id: 44,
name: "task to keep",
subtasks: [{
id: 55,
name: "task to keep",
completed: true
},
{
id: 66,
name: "task to delete",
completed: false
}
]
}
]
由于嵌套级别不受限制,只有叶任务才完成标志,而我只需要过滤掉已完成的任务,并将其与父母联系在一起。
我看着lodash,但似乎没有深层过滤器。 我现在正在考虑使用树遍历过滤掉任务。
有没有一种简单的方法可以用lodash实现类似的东西?
您想要一个lodash解决方案。 我相信这个递归函数可以解决问题。
function completed (task) {
// if it is a leaf node, just return true when it is completed
if (_.has(task,'completed')) {
return task.completed;
}
// if it has subtasks, then use our filter on all the subtasks ...
if (_.has(task,'subtasks')) {
task.subtasks = _.filter(task.subtasks, completed);
// ... and only return true if there are subtasks left after filtering
return task.subtasks.length;
}
}
console.log(_.filter(tasks,completed));
好吧,您想要的东西可以通过响应函数来实现,但是(因为您需要简单的解决方案),这是一个使用JSON.parse
作为第二个参数的回调的解决方案,我们将从字符串中解析它; 但是,请注意,轻松并不总是意味着高效!
//your data tasks = [{ id: 1, name: "task1", subtasks: [{ id: 4, name: "task2", subtasks: [{ id: 11, name: "task to remove", completed: false }] }, { id: 6, name: "task to remove", subtasks: [] }, { id: 7, name: "parent task to keep", subtasks: [{ id: 11, name: "task to keep", completed: true }] } ] }, { id: 44, name: "task to keep", subtasks: [{ id: 55, name: "task to keep", completed: true }, { id: 66, name: "task to delete", completed: false } ] } ] //solution var finalTasks = JSON.parse(JSON.stringify(tasks), (k, v) => { if (Array.isArray(v)) { return v.filter(u => u); } else if (typeof v === "object" && !(v.subtasks && v.subtasks.length) && !v.completed) { return undefined; } return v; }); console.log(finalTasks);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.