假设我有一个像这样的数组
let tree = [
{
id: 8,
level: 1,
children: [
{
id: 3,
level: 2,
children: [
{
id: 1,
level: 3,
children: []
},
{
id: 6,
level: 3,
children: [
{ id: 4, level: 4, children: [] },
{ id: 7, level: 4, children: [] }
]
}
]
},
{
id: 10,
level: 2,
children: [
{
id: 14,
level: 3,
children: [
{ id: 13, level: 4, children: [] }
]
}
]
}
]
}
]
我正在努力让所有孩子都达到指定水平。因此,在函数中,如果我提供的等级为3,则应该让那里的孩子以及那里的孩子的孩子(如果有的话)出现。
这是我到目前为止的功能。奇怪的是,它适用于第2级,但仅此而已。
function searchTree(node, level){
let resultArr = [];
if(node.children){
node.children.forEach( (n) => {
if(n.level === level){
resultArr.push(n);
}
searchTree(n, n.level);
})
}
return resultArr;
}
最佳答案
您至少有四个错误:
您没有传递resultArr,因此它无法累积结果。
即使您发现孩子的父母具有搜索级别,您仍会继续看他们的孩子-这是浪费时间。
您正在使用节点的级别而不是要搜索的级别进行递归调用。
您的代码不适用于第一级,因为您从不检查顶层节点,仅检查其子节点。
试试这个版本:
function searchTree(node, level, resultArr)
{
if (node)
{
if (node.level === level)
{
resultArr.push(node);
}
else if (node.children)
{
node.children.forEach((n) => {searchTree(n, level, resultArr);})
}
}
}
您也不需要将级别存储在节点中。您可以在进行递归调用时计算它(如果使用currentLevel进行调用,只需使用currentLevel + 1来调用子代)。