鱼C论坛

 找回密码
 立即注册
查看: 2735|回复: 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) {
  1. let data = [{
  2.     id: 1,
  3.     name: '家电',
  4.     goods: [{
  5.         id: 11,
  6.         gname: '冰箱',
  7.         goods: [{
  8.             id: 111,
  9.             gname: '海尔'
  10.         }, {
  11.             id: 112,
  12.             gname: '美的'
  13.         }, ]
  14.     }, {
  15.         id: 12,
  16.         gname: '洗衣机'
  17.     }]
  18. }, {
  19.     id: 2,
  20.     name: '服饰'
  21. }];

  22. const wrapper = function(){
  23.     let cengshu = 0
  24.     function getID(json, id) {
  25.         console.log(`进入第${++cengshu}层`)
  26.         let o = {};
  27.         json.forEach(function(item) {
  28.             if (item.id == id) {
  29.                 o = item;
  30.             } else if (item.goods?.length) {
  31.                 o = getID(item.goods, id);
  32.             }
  33.         });
  34.         console.log(`退出第${cengshu--}层`)
  35.         return o;
  36.     };
  37.     return getID
  38. }

  39. const getID = wrapper()
  40. console.log(getID(data, 1));
  41. console.log(getID(data, 2));
  42. console.log(getID(data, 11));
  43. 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-4-28 19:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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