我有一棵这样的树
var datas = {
'tree': [
{
'name': 'name1',
'tree': [
{'name': 'name2'},
{'name': 'name3'},
{
'name': 'name4',
'tree': [
{'name': 'name5'},
{'name': 'name6'}
]
},
{'name': 'name7'}
]
},
{
'name': 'name8',
'tree': [
{'name': 'name9'}
]
}
]
}
我想找到指定ID的所有父母
例如在树形演示中,如果我查找“ name5”,我想找到“ name1,name4,name5”
我写了这段代码,但结果错误,我得到了其他元素的ID,而不仅仅是父元素
这是我的代码
keys: string[];
pathFound: boolean = false;
getLevel(event: iEventBase, id: string, path: string[]): void {
if (this.pathFound) return;
event.content.forEach((key) => {
if (key.id == id) {
if(!path){
path = [];;
}
path.push(key.id);
this.keys = path;
this.pathFound = true;
return;
}
if (key.type === "page") {
if(!path){
path = [];
}
path.push(key.id);
this.getLevel(key, id, path);
}
})
}
}
this.getLevel(state.mainEvent.content.page, event.id, null);
答案 0 :(得分:2)
您可以使用递归方法来检查名称,然后在数组中返回名称,或者通过再次调用该函数来返回对象的路径。
function find(array, name) {
var result;
array.some(o => {
var temp;
if (o.name === name) {
return result = [name];
}
temp = find(o.tree || [], name);
if (temp) {
return result = [o.name, ...temp];
}
});
return result;
}
var datas = { tree: [{ name: 'name1', tree: [{ name: 'name2' }, { name: 'name3' }, { name: 'name4', tree: [{ name: 'name5' }, { name: 'name6' }] }, { name: 'name7' }] }, { name: 'name8', tree: [{ name: 'name9' }] }] };
console.log(find(datas.tree, 'name5'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
也许您可以采用递归方法解决此问题。这里的基本思想是从树中向下查找一个节点,该节点的名称与您要为其寻找父节点的节点名称相匹配(即name5
)。
一旦找到这样的节点,则返回一个数组,将节点的相应父级名称附加到该数组,直到递归完全展开为止。
因此,可以执行以下操作:
var datas = {
'tree': [
{
'name': 'name1',
'tree': [
{'name': 'name2'},
{'name': 'name3'},
{
'name': 'name4',
'tree': [
{'name': 'name5'},
{'name': 'name6'}
]
},
{'name': 'name7'}
]
},
{
'name': 'name8',
'tree': [
{'name': 'name9'}
]
}
]
}
function findParents(node, searchForName) {
// If current node name matches the search name, return
// empty array which is the beginning of our parent result
if(node.name === searchForName) {
return []
}
// Otherwise, if this node has a tree field/value, recursively
// process the nodes in this tree array
if(Array.isArray(node.tree)) {
for(var treeNode of node.tree) {
// Recursively process treeNode. If an array result is
// returned, then add the treeNode.name to that result
// and return recursively
const childResult = findParents(treeNode, searchForName)
if(Array.isArray(childResult)) {
return [ treeNode.name ].concat( childResult );
}
}
}
}
console.log( findParents(datas, 'name5') )