[英]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.