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));