前端小白一枚,有一段 js 在树结构中通过子节点去查找它所有的父节点的代码片段,看到有不解的地方,百思不得其解,希望有大佬能路过帮忙解答一下,代码如下:
var data2= [{
id: 1,
label: '一级 1',
children: [{
id: 4,
label: '二级 1-1',
children: [{
id: 10,
label: '三级 1-1-2',
children: [{
id: 20,
label: '四级 1-1-2-1'
}]
}]
}]
}];
function getParentId(list,id) {
for (let i in list) {
if(list[i].id === id){
return [list[i]];
}
if(list[i].children){
let node = getParentId(list[i].children, id);
console.log(node);
if(node !== undefined){
return node.concat(list[i]);
}
}
}
}
getParentId(data2, 20);
打印结果:
疑问:
在 node 为 [20] 时,会走到它下面的判断中,最后通过 concat 能得到 [20, 10],但是不明白 4 和 1 是什么时候拿到的,而且都已经在 node !== undefined 的判断语句中将代码 return 了,它又是在什么时候进入的循环呢?
整体的执行顺序其实是
在data2[0]中查找id=20,没有
-> 尝试查找data2[0].children
-> 在data2[0].children中查找id=20,没有
->-> 尝试在data2[0].children[0].children中查找id=20
->-> 在data2[0].children[0].children中查找id=20,没有
->->-> 尝试在data2[0].children[0].children[0].children中查找id=20
->->-> 在data2[0].children[0].children[0].children中找到了id=20,返回行
->-> 尝试成功,拼接,返回行
-> 尝试成功,拼接,返回行
查找成功,拼接,返回行
实在不明白就看一下递归的基本知识吧。