鍍金池/ 問答/HTML/ js遞歸問題,請指教

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: '交易明細(xì)',
          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
    }
  ];

這是一份獲取到的數(shù)據(jù),對象下有子級,需要根據(jù)id找出對應(yīng)的那個對象。

開始動手寫,如下:

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) { //如果有子級繼續(xù),遍歷下一級

          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) { //如果有子級繼續(xù),遍歷下一級

              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))

好像能夠根據(jù)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))

遞歸一下,最后成這個樣子,能夠?qū)崿F(xiàn)效果,但是我想把result封到函數(shù)里面,但是定義在里面最后return出來的值就為null了,原因也知道就是循環(huán)的時候又執(zhí)行findId函數(shù)把result = null了。現(xiàn)在就像問一下如何才能把結(jié)果對象放到函數(shù)里面,不用在函數(shù)外面定義result

回答
編輯回答
賤人曾
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
}

調(diào)用就用你那個對象調(diào)用就ok了findId(list,3)

clipboard.png

2018年6月3日 23:20