js递归问题,请指教

let list = [
      {
      id: '1',
      title: '人员管理',
      checked: true,
      children: [{
        id: '5',
        title: '厂家管理',
        checked: true,
        children: [{
          id: '6',
          title: '添加厂家',
          checked: true,
        },
        {
          id: '7',
          title: '操作',
          checked: true,
        }]
      },
      {
        id: '8',
        title: '会员管理',
        checked: true,
        children: [{
          id: '9',
          title: '交易明细',
          checked: true,
        },
        {
          id: '10',
          title: '启用/禁用',
          checked: false,
        }]
      }]
    }, 
    {
      id: '2',
      title: '交易查询',
      checked: true,
      children: [{
        id: '11',
        title: '操作',
        checked: false,
      }, {
        id: '12',
        title: '操作2',
        checked: true,
      }]
    }, 
    {
      id: '3',
      title: '测试测试',
      checked: true
    }
  ];

这是一份获取到的数据,对象下有子级,需要根据id找出对应的那个对象。

开始动手写,如下:

function findIDobj(Arr,ID) {
      let result = null;
      for (let i = 0; i < Arr.length; i++) {//遍历第1级

        if (Arr[i].id == ID) {
          result = Arr[i]; //符合条件就赋值
        }

        if (Arr[i].children) { //如果有子级继续,遍历下一级

          for (let j = 0; j < Arr[i].children.length; j++) { //遍历第2级
            if (Arr[i].children[j].id == ID) {
              result = Arr[i].children[j];
            }

            if (Arr[i].children[j].children) { //如果有子级继续,遍历下一级

              for (let k = 0; k < Arr[i].children[j].children.length; k++) {//遍历第3级
                if (Arr[i].children[j].children[k].id == ID) {
                  result = Arr[i].children[j].children[k];
                }
              }
            }
          }
        }
      }
      return result
    }
    console.log(findIDobj(list,9))

好像能够根据id找到对象,但是这1大托代码看着就low啊。
再改改,如下:

    let result = null;

    function findId(Arr, ID) {
      
      for (let i = 0; i < Arr.length; i++) {
        if (Arr[i].id == ID) {
          result = Arr[i]
        }
        if (Arr[i].children) {
          findId(Arr[i].children, ID)
        }
      }
      return result
    }

    console.log(findId(list, 9))

递归一下,最后成这个样子,能够实现效果,但是我想把result封到函数里面,但是定义在里面最后return出来的值就为null了,原因也知道就是循环的时候又执行findId函数把result = null了。现在就像问一下如何才能把结果对象放到函数里面,不用在函数外面定义result

阅读 1.4k
1 个回答
function findId(Arr, ID) {
  var _result = null;
  for (let i = 0; i < Arr.length; i++) {
    //console.log(Arr[i], Arr[i].id == ID)
    if (Arr[i].id == ID) return Arr[i];
    if (Arr[i].children) _result = findId(Arr[i].children, ID)
    if (_result != null) return _result;
  }
  return _result
}

调用就用你那个对象调用就ok了findId(list,3)

clipboard.png

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