js递归无法返回数据

        const tree = {
            id:"root",
            children:[
                {id:1,children:['id1']},
                {id:2,children:['id2']},
                {id:3,children:['id3']},
                {id:4,children:[
                    {id:5,children:['id4的id5']}
                ]},
                {id:6,children:[
                    {id:7,children:[
                        {id:8,children:['id4的id5']}
                    ]}
                ]}
            ]
        }



        function search(id,arr){
            let asd = {};
            arr.forEach((val,ind,arr)=>{
                if(!val.id) {asd = 'meiyou';return}    
                if(val.id == id){
                    asd['id'] = val.id;
                    asd['children'] = val.children;
                    console.log(asd); // 这里打印的值是正确的
                    return;
                }else{
                    search(id,val.children);
                }
            });
            return asd;
        }

        var result = search(5,tree.children);
        console.log(result); // 为空{}

数组的 第一层可以正常返回,更深一点的就返回时{},求问正确答案

阅读 3.9k
3 个回答

不能把变量asd定义在函数search里面,这样的话每次递归都会把asd重新赋值为{}search函数写的也有问题,请参考下面的代码

    const tree = {
        id:"root",
        children:[
            {id:1,children:['id1']},
            {id:2,children:['id2']},
            {id:3,children:['id3']},
            {id:4,children:[
                {id:5,children:['id4的id5']}
            ]},
            {id:6,children:[
                {id:7,children:[
                    {id:8,children:['id4的id5']}
                ]}
            ]}
        ]
    }


    // 将变量定义在外面
    let asd = {}
    
    function search(id,arr){
        arr.forEach((val,ind,arr)=>{
            if(val.id && val.id == id){
                asd['id'] = val.id;
                asd['children'] = val.children;
                console.log(asd); // 这里打印的值是正确的
            }else{
                if(val.children){
                    search(id,val.children);
                }
            }
        });
        return asd;
    }

    var result = search(5,tree.children);
    console.log(result); // 为{id: 5, children: Array(1)}

问题还是有点多,不要在forEach的回调函数里面return,因为那没有意义,那是个回调函数,并不会阻止forEach继续执行。
如果id没有重复,不需要全部节点遍历完,因为那也没有意义。

        function search(id, node) {
            if (node.children) {
                for (let nc of node.children) {
                    if (nc.id === id) {
                        return nc;
                    } else {
                        let same = search(id, nc);
                        if (same) return same;
                    }
                }
            }
            return null;
        }


        var result = search(5, tree);
        console.log('result', result); // 为空{}

因为你第二层往后的 asd 是内层的局部变量,当你 return 时,外层 并拿不到这个值。

你可以把 asd 放在 search 函数外面,作为全局变量;
当然更好的做法是,在 search 里面带值一起返回

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题