簡體   English   中英

JavaScript在嵌套的json數據中實現深度過濾

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM