骑乌龟的小蜗牛 发表于 2020-10-28 22:14:50

对这段js递归函数有疑惑 请大家帮我看一下

<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了 但是打印不出来

kogawananari 发表于 2020-10-28 23:23:08

1是错的 2是对的
return o;这句在最后面就行 前面的return o;是多余的
o = item;是为了最后可以return o

骑乌龟的小蜗牛 发表于 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;返回了一下就获取成功了 但最后打印就是不显示内层数组的内容

kogawananari 发表于 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));

kogawananari 发表于 2020-10-29 09:25:18

由return o来一层层的接住 全部退出最外面的return才返回

骑乌龟的小蜗牛 发表于 2020-10-29 09:29:32

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

谢谢大佬解答{:5_109:}
页: [1]
查看完整版本: 对这段js递归函数有疑惑 请大家帮我看一下