鱼C论坛

 找回密码
 立即注册
查看: 3051|回复: 5

[已解决]对这段js递归函数有疑惑 请大家帮我看一下

[复制链接]
发表于 2020-10-28 22:14:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
<script>
        var data = [{
            id: 1,
            name: '家电',
            goods: [{
                id: 11,
                gname: '冰箱',
                goods: [{
                    id: 111,
                    gname: '海尔'
                }, {
                    id: 112,
                    gname: '美的'
                }, ]
            }, {
                id: 12,
                gname: '洗衣机'
            }]
        }, {
            id: 2,
            name: '服饰'
        }];

        //11111111111111111111111111111111111
        function getID(json, id) {
            var o = {};
            json.forEach(function(item) {
                if (item.id == id) {
                    o = item;
                    return o;
                } else if (item.goods && item.goods.length > 0) {
                   //困惑点--------------------------------------------------------------------------------------------
                    getID(item.goods, id);
                }
            });
            return o;
        };

        //222222222222222222222222222222222222
         function getID(json, id) {
            var o = {};
            json.forEach(function(item) {
                if (item.id == id) {
                    o = item;
                    return o;
                } else if (item.goods && item.goods.length > 0) {
                    //困惑点--------------------------------------------------------------------------------------------
                    o = getID(item.goods, id);
                }
            });
            return o;
        };
        console.log(getID(data, 1));
        console.log(getID(data, 2));
        console.log(getID(data, 11));
        console.log(getID(data, 12));
    </script>
大佬帮我看一下 1和2里面的困惑点 为什么一定要用递归函数来更新一下o对象才能获取到最里面的值 我用断点发现o = item;这句已经把里面的值给了对象o了 但是打印不出来
最佳答案
2020-10-29 09:25:18
由return o来一层层的接住 全部退出最外面的return才返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-28 23:23:08 | 显示全部楼层
1是错的 2是对的
return o;这句在最后面就行 前面的return o;是多余的
o = item;是为了最后可以return o
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 08:49:50 | 显示全部楼层
kogawananari 发表于 2020-10-28 23:23
1是错的 2是对的
return o;这句在最后面就行 前面的return o;是多余的
o = item;是为了最后可以return o
...

function getID(json, id) {
            var o = {};
            json.forEach(function(item) {
                if (item.id == id) {
                    o = item;
                } else if (item.goods && item.goods.length > 0) {
                    //困惑点--------------------------------------------------------------------------------------------
                    o = getID(item.goods, id);
                }
            });
            return o;
        };

大佬, o = getID(item.goods, id);为什么要接收这个递归函数来更新o对象呢。  我断点发现o = item;这一句不是已经能把获取的内容添加到o对象里面了 最后通过return o;返回了一下就获取成功了 但最后打印就是不显示内层数组的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 09:21:12 | 显示全部楼层
骑乌龟的小蜗牛 发表于 2020-10-29 08:49
function getID(json, id) {
            var o = {};
            json.forEach(function(item) {
let data = [{
    id: 1,
    name: '家电',
    goods: [{
        id: 11,
        gname: '冰箱',
        goods: [{
            id: 111,
            gname: '海尔'
        }, {
            id: 112,
            gname: '美的'
        }, ]
    }, {
        id: 12,
        gname: '洗衣机'
    }]
}, {
    id: 2,
    name: '服饰'
}];

const wrapper = function(){
    let cengshu = 0
    function getID(json, id) {
        console.log(`进入第${++cengshu}层`)
        let o = {};
        json.forEach(function(item) {
            if (item.id == id) {
                o = item;
            } else if (item.goods?.length) {
                o = getID(item.goods, id);
            }
        });
        console.log(`退出第${cengshu--}层`)
        return o;
    };
    return getID
}

const getID = wrapper()
console.log(getID(data, 1));
console.log(getID(data, 2));
console.log(getID(data, 11));
console.log(getID(data, 12));
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-29 09:25:18 | 显示全部楼层    本楼为最佳答案   
由return o来一层层的接住 全部退出最外面的return才返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 09:29:32 | 显示全部楼层
kogawananari 发表于 2020-10-29 09:25
由return o来一层层的接住 全部退出最外面的return才返回

谢谢大佬解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-30 16:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表