Javascript 如果嵌套树中的对象没有';无法匹配任何选定的id

Javascript 如果嵌套树中的对象没有';无法匹配任何选定的id,javascript,tree,traversal,depth-first-search,postorder,Javascript,Tree,Traversal,Depth First Search,Postorder,我有一个选定的数组 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" },

我有一个选定的数组

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中的任何项都不匹配,我想从树中删除该节点

我很难找到一个算法,该算法允许我删除与此中任何项都不匹配的所有对象数据。从深度嵌套树中选择

代码如下:

 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;
  }
setSearchResult(selectedArray){
如果(!!选中){
让this.tree=JSON.parse(JSON.stringify(this.root));
this.topLevelGroups=this.removeFromTree(this.tree,selectedArray,null,null);
}
}
从树中移除(父级、选定阵列、祖父母、idx){
设{name,id,children}=parent;
让parentId=id+':'+name;
如果(!!选择阵列){
如果(!selectedArray.includes(parentId)){
如果(祖父母){
祖父母。儿童。剪接(idx,1);
} 
否则返回null;
}
如果(!!家长和孩子){
for(设i=0;i

我认为问题在于执行了包含this.slice的代码后,它将返回,而不会返回到它的同级。有什么建议吗

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


您可以采用非置换的方法,通过尊重子元素来减少数组

此解决方案将所需
id
的哈希表作为键,将
name
作为所选
数组的拆分值

因此,只包括已知节点

const
筛选器=(r,{children=[],…o})=>{
if(nodes[o.id]!==o.name)返回r;
children=children.reduce(过滤器,[]);
r、 推(childrence.length?{…o,children}:o);
返回r;
},
所选=[“1:Tree”、“2:PT”、“5:PT-DD”、“11:PT-C”、“3:SAC”、“7:SAC-DR”、“6:SAC-DDE”],
节点=选定。减少((r,s)=>{
var[k,v]=s.split(“:”);
r[k]=v;
返回r;
}, {}),
tree={children:[{children:[[{children:[][],id:12,name:“PT-D”},{children:[],id:8,name:“PT-33”},{children:[],id:10,name:“PT-62”},{children children:[],id:9,name:“PT-52”},id:4,name:“PT-32”},{children children children:[{children 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”},
结果=tree.children=tree.children.reduce(过滤器,[]);
console.log(结果);

.as控制台包装{最大高度:100%!重要;顶部:0;}
节点是否在所选数组中排序?请添加所需结果。所选数组未排序。所需结果是与所选数组中的任何项匹配的任何节点。id+':'+node.name。谢谢,您知道是否可以使用递归DFS方法吗?如果可能,希望稍微修改上述尝试的DFS解决方案n在问题中,子对象的构建是dfs。您想删除空的子对象吗?或者您的问题的目标是什么?如果子对象与所选阵列的任何项目都不匹配,我想从父对象中删除子对象。我想知道您是否知道这一点。我一直在尝试解决此问题,但无法解决。相反,我求助于使用dfs来解决此问题搜索树并将匹配的节点及其父节点/父节点输出到上面选择的阵列,然后再次循环树以删除不匹配的项。谢谢。我不理解这个问题,因此没有回答。
const tags = new Set(selectedArray);

function filterArray ({ children, id, name }) {
    const tag = `${id}:${name}`;
    if (tags.has(tag)) {
        return {
            id,
            name,
            children: children.map(filterArray).filter((child) => child !== null)
        };
    }
    return null;
}


const output = filterArray(root);
console.log(JSON.stringify(output, null, 4));