如果不匹配任何选定的ID,则从嵌套树中删除对象

问题描述 投票:0回答:1

我有一个选定的数组

this.selectedArray = ["1:Tree", "2:PT", "5:PT - DD", "11:PT - C", "3:SAC", "7:SAC - DR", "6:SAC - DDE"]

和带有孩子的树结构:

this.root =    
{"children": [
   {"children": [
     {
      "children": [],
      "id": 12,
      "name": "PT - D"
    },
    {
      "children": [
        {
          "children": [],
          "id": 8,
          "name": "PT-33"
        },
        {
          "children": [],
          "id": 10,
          "name": "PT-62"
        },
        {
          "children": [],
          "id": 9,
          "name": "PT-52"
        }
      ],
      "id": 4,
      "name": "PT - 32"
    },
    {
      "children": [
        {
          "children": [],
          "id": 11,
          "name": "PT - C"
        }
      ],
      "id": 5,
      "name": "PT - DD"
    }
  ],
  "id": 2,
  "name": "PT"
},
{
  "children": [
    {
      "children": [],
      "id": 7,
      "name": "SAC - DR"
    },
    {
      "children": [],
      "id": 6,
      "name": "SAC - DE"
    }
  ],
  "id": 3,
  "name": "SAC"
}
],
 "id": 1,
 "name": "Tree"
}

如果node.Id +':'+ node.name与this.selectedArray中的任何项目都不匹配,我想从树中删除该节点。

我在寻找一种算法时遇到麻烦,该算法将允许我删除与从深度嵌套树中选择的this.selected中的任何项都不匹配的所有对象数据。

这里是代码:

 setSearchResult(selectedArray) {
    if (!!selected) {
        let this.tree = JSON.parse(JSON.stringify(this.root));
        this.topLevelGroups = this.removeFromTree(this.tree, selectedArray, null, null);
    }
}

removeFromTree(parent, selectedArray, grandParent, idx) {
    let { name, id, children } = parent;
    let parentId = id + ':' + name;
    if (!!selectedArray) {
        if (!selectedArray.includes(parentId)) {
            if (grandParent) {
                grandParent.children.splice(idx, 1);
            } 
            else return null;
        }
        if (!!parent && !!children) {
            for (let i = 0; i < children.length; i++) {
                this.removeFromTree(children[i], selectedArray, parent, i);
            }
        }
    }
    return this.tree.children;
  }

我认为问题在于执行具有this.slice的代码后,它将返回并且不会进入其兄弟状态。有什么建议吗?

我有一个选定的数组this.selectedArray = [“ 1:Tree”,“ 2:PT”,“ 5:PT-DD”,“ 11:PT-C”,“ 3:SAC”,“ 7:SAC -DR“,” 6:SAC-DDE“]和带有子树的树结构:this.root = {” children“:[{” ...

javascript tree traversal dfs postorder
1个回答
0
投票

一个简单的递归过滤器函数,因为您在selectedArray中使用了字符串,因此可以轻松地使用Set进行测试一个节点。

© www.soinside.com 2019 - 2024. All rights reserved.