JS树搜索失败

时间:2017-11-08 12:00:28

标签: javascript

我有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,我无法找到我错过父对象的位置。

1 个答案:

答案 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 }));