简体   繁体   English

深度嵌套的对象数组,查找并删除具有特定 ID 的 Object

[英]Deep nested Array of Objects, find and remove Object with specific ID

I am trying to find an Object by ID and remove it.我正在尝试通过 ID 查找 Object 并将其删除。 (Of course if this object has subTasks all Objects hanging on this tree are removed too). (当然,如果这个 object 有子任务,那么挂在这棵树上的所有对象也会被删除)。 I have a structure like this (For example), which can grow very big and deep:我有一个这样的结构(例如),它可以变得非常大和深:

[
  {
    "id": 0,
    "lane": 0,
    "name": "Task A",
    "start": 0,
    "end": 10000,
    "subTasks": [
      {
        "id": "0.1",
        "lane": 0,
        "name": "Subtask",
        "start": 0,
        "end": 10000,
        "class": "danger",
        "sublane": 0,
        "subTasks": [
          {
            "id": "0.1.1",
            "name": "Subtask",
            "start": 0,
            "end": 10000,
            "subTasks": [
              {
                "id": "0.1.1.1",
                "name": "Subtask",
                "start": 0,
                "end": 10000,
                "subTasks": [
                  {
                    "id": "0.1.1.1.1",
                    "name": "Subtask",
                    "start": 0,
                    "end": 10000
                  },
                  {
                    "id": "0.1.1.1.2",
                    "name": "Subtask",
                    "start": 0,
                    "end": 10000
                  }
                ]
              },
              {
                "id": "0.1.1.2",
                "name": "Subtask",
                "start": 0,
                "end": 10000
              }
            ]
          },
          {
            "id": "0.1.2",
            "name": "Subtask",
            "start": 0,
            "end": 10000
          },
          {
            "id": "0.1.3",
            "name": "Subtask",
            "start": 0,
            "end": 10000
          }
        ]
      },
      {
        "id": "0.2",
        "name": "Subtask",
        "start": 0,
        "end": 10000
      }
    ],
    "class": "danger",
    "sublane": 0
  },
  {
    "id": 1,
    "lane": 2,
    "name": "Task B",
    "start": 15000,
    "end": 25000,
    ],
    "class": "success",
    "sublane": 0
  }
]

Now I want to remove the ID = 0.1.1.1.1 for example, but it should work with every other Object the same way, no matter how deep it is nested.现在我想删除 ID = 0.1.1.1.1 例如,但它应该以同样的方式与其他所有 Object 一起工作,无论它嵌套多深。

For finding and editing Im using this dfs algorithm:使用此 dfs 算法查找和编辑 Im:

   edit: function (name, start, end) {
        for (let obj of gantt.items()) {
            result = dfs(obj, id);
            if (result) {
                result.name = name;
                result.start = start;
                result.end = end;
            }
        }
    
      dfs: function (obj, targetId) {
            if (obj.id === targetId) {
                return obj;
            }
            if (obj.subTasks) {
                for (let item of obj.subTasks) {
                    let check = dfs(item, targetId);
                    if (check) {
                        return check;
                    }
                }
            }
            return null;
        },

But how can I remove/delete the specific Object?但是如何删除/删除特定的 Object?

Kind of recursive filter:递归过滤器的种类:

 const data = [{"id":"0","lane":0,"name":"Task A","start":0,"end":10000,"Subtask":[{"id":"0.1","lane":0,"name":"Subtask","start":0,"end":10000,"class":"danger","sublane":0,"Subtask":[{"id":"0.1.1","name":"Subtask","start":0,"end":10000,"Subtask":[{"id":"0.1.1.1","name":"Subtask","start":0,"end":10000,"Subtask":[{"id":"0.1.1.1.1","name":"Subtask","start":0,"end":10000},{"id":"0.1.1.1.2","name":"Subtask","start":0,"end":10000}]},{"id":"0.1.1.2","name":"Subtask","start":0,"end":10000}]},{"id":"0.1.2","name":"Subtask","start":0,"end":10000},{"id":"0.1.3","name":"Subtask","start":0,"end":10000}]},{"id":"0.2","name":"Subtask","start":0,"end":10000}],"class":"danger","sublane":0},{"id":"1","lane":2,"name":"Task B","start":15000,"end":25000,"class":"success","sublane":0}]; const removeById = (arr, targetId) => arr.reduce((acc, obj) => (obj.id === targetId)? acc: [...acc, {...obj, ...(obj.Subtask && { Subtask: removeById(obj.Subtask, targetId) }) } ], []); console.log(removeById(data, "0.1"));
 .as-console-wrapper{min-height: 100%;important: top: 0}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM