簡體   English   中英

深度嵌套的對象數組,查找並刪除具有特定 ID 的 Object

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

我正在嘗試通過 ID 查找 Object 並將其刪除。 (當然,如果這個 object 有子任務,那么掛在這棵樹上的所有對象也會被刪除)。 我有一個這樣的結構(例如),它可以變得非常大和深:

[
  {
    "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
  }
]

現在我想刪除 ID = 0.1.1.1.1 例如,但它應該以同樣的方式與其他所有 Object 一起工作,無論它嵌套多深。

使用此 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;
        },

但是如何刪除/刪除特定的 Object?

遞歸過濾器的種類:

 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