我有Javascript树结构
const tree = [
{id: 120 , children:[]},
{id: 110 , children:[
{id: 12 , children:[
{id: 3 , children:[]},
{id: 4 , children:[]}
]}
]},
{id: 10 , children:[
{id: 13 , children:[]}
]}
]
我有这个功能来找到给定节点的父节点
const _findParent = (tree, component, _parent) => {
let parent = null
// iterate
tree.forEach(node => {
if(node.id === component.id){
return _parent
}
parent = node. children ? _findParent(node.children, component, node) : parent
})
return parent
}
但它返回null,我无法找到我错过父对象的位置。
答案 0 :(得分:2)
基本上,您检查children
,但您的children
始终是一个真正值的数组。在这种情况下,您可以检查children
是否为数组。
Array#forEach
的使用不适用于在回调之外使用的返回值。
我建议使用Array#some
,它允许提前退出,如果找到一个节点,这是必要的。
然后我建议使用第二个变量来获取嵌套结果,如果是真的,则分配给parent
返回并退出迭代。
const _findParent = (tree, component, _parent) => {
let parent;
tree.some(node => {
var temp;
if (node.id === component.id) {
parent = _parent;
return true;
}
temp = Array.isArray(node.children) && _findParent(node.children, component, node);
if (temp) {
parent = temp;
return true;
}
});
return parent;
}
const tree = [{ id: 120, children: [] }, { id: 110, children: [{ id: 12, children: [{ id: 3, children: [] }, { id: 4, children: [] }] }] }, { id: 10, children: [{ id: 13, children: [] }] }];
console.log(_findParent(tree, { id: 4 }));
console.log(_findParent(tree, { id: 42 }));