如何正确的使用递归?

需求是找到对应code第一次出现的位置,一下函数始终不能正确执行,大家帮忙改正下

let menus = [{
      code: 2,
      name: '222',
      children: [
        {
          code: 33,
          name: '222sa',
          children: [
            {
              code: 44,
              name: '22'
            }
          ]
        }
      ]
    },{
      code: 922,
      name: '922',
      children: [
        {
          code: 9222,
          name: '92222222dsadsa',
          children: [
            {
              code: 44222,
              name: '442222dsads'
            }
          ]
        }
      ]
    }]

    function digui(arr, code) {
      for(var i=0;i<arr.length;i++) {
        if(arr[i].code == code) {
          return arr[i]
        } else {
          if (arr[i].children) {
            digui(arr[i].children, code)
          }
        }
      }
    }

    console.log(digui(menus, 44222))
阅读 2.5k
4 个回答
function digui(arr, code) {
      for(var i=0;i<arr.length;i++) {
        if(arr[i].code == code) {
          return arr[i]
        } else {
          if (arr[i].children) {
            digui(arr[i].children, code)
          }
        }
      }
    }

你这个函数 仔细看一下 有一些情况下是没有返回值的(即 if (arr[i].children)的分支)。你应该取到子级递归的结果,如果找到了,就返回:

if (arr[i].children) {
    let result =  digui(arr[i].children, code)
    if (result) return result
}
let childCode = digui(item.children, code);
if (childCode) {
    return childCode
}

需要对递归函数返回值做一下处理

function findCode(arr, code) {
    arr = Array.isArray(arr) ? arr : [];
    var ret;
    for (var i = 0; i < arr.length; i++) {
        var obj = arr[i];
        var children = obj.children;
        if (obj.code === code) return obj;
        if (Array.isArray(children)) {
            ret = findCode(children, code);
            if (ret) break;
        }
    }
    return ret;
}
console.log(findCode(menus, 44222));
   function findCode(arr,code){
        let result;
        for(let i = 0;i < arr.length;i++){
            if(arr[i].code === code){
                result = arr[i];
            }else{
                if(arr[i].children){
                    result = findCode(arr[i].children,code);
                    if(result)break;
                }
            }
        }
        return result;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏