鍍金池/ 問答/C++  HTML/ 遞歸函數(shù)如何返回正確值?

遞歸函數(shù)如何返回正確值?

有如下遞歸函數(shù),無法返回正確的結(jié)果:

const navItems = [
      {
        name: 'name1',
        label: '人事管理',
        items: [
          {
            name: 'name2',
            label: '員工管理',
            items: [
              {
                name: 'name3',
                label: '員工管理-0',
                items: [
                  {
                    name: 'name4',
                    label: '員工管理-0-0',
                    items: '',
                  },
                  {
                    name: 'name5',
                    label: '員工管理-0-1',
                    items: '',
                  },
                ],
              },
              {
                name: 'name6',
                label: '員工管理-1',
                items: '',
              },
            ],
          },
          {
            name: 'name7',
            label: '部門管理',
            items: [
              {
                name: 'name8',
                label: '部門管理1',
                items: '',
              },
              {
                name: 'name9',
                label: '部門管理2',
                items: '',
              },
            ],
          },
          {
            name: 'name10',
            label: '職位管理',
            items: [
              {
                name: 'name11',
                label: '職位管理1',
                items: '',
              },
              {
                name: 'name12',
                label: '職位管理2',
                items: '',
              },
            ],
          },
        ],
      },
    ];

const navName = 'name12';    

const getSelectedLabel = (navItems, navName) => {
  let selectedLabel;
  const findSelectedLabel = (items, name) => {
    items.forEach((item) => {
      if (item.name === name) {
        selectedLabel = item.label;
      } else if (item.items && Array.isArray(item.items)) {
        findSelectedLabel(item.items, name);
      }
    });
  };
  findSelectedKey(navItems, navName);
  return selectedLabel;
};

想要通過遞歸函數(shù),根據(jù)name值找到對應的label值,但是函數(shù)先返回了undefined,再執(zhí)行到了賦值,應該怎么修改才對?
還有我本來寫的是不要嵌套外層函數(shù):

const findSelectedLabel = (items, name) => {
    items.forEach((item) => {
      if (item.name === name) {
        return item.label;
      } else if (item.items && Array.isArray(item.items)) {
        findSelectedLabel(item.items, name);
      }
    });
  };

findSelectedLabel(navItems, navName)

直接找到后返回這個值,但是也是不對的...雖然函數(shù)走到了return這句話,但并沒有終止整個函數(shù),最后返回的還是undefined.

很多人說運行結(jié)果是對的,那是因為剛好name4在第一層里,如果使用navName = name12,就不對了...
還有使用for循環(huán)也不對...使用for循環(huán)以后,它只遞歸第一層,只會一層層往里遞歸,而不會進入for循環(huán)...

謝謝各位大神~

回答
編輯回答
命于你

forEach會把你的函數(shù)多封裝一層,自然無法return

const findSelectedLabel = (items, name) => {
  for (let i = 0; i != items.length; ++i) {
    const item = items[i]
    if (item.name === name) {
      return item.label
    } else if (item.items && Array.isArray(item.items)) {
      const label = findSelectedLabel(item.items, name)
      if (label) {
        return label
      }
    }
  }
}

const label = findSelectedLabel(navItems, navName)
console.log(`find ${navName} -> ${label}`)
2017年10月11日 16:34
編輯回答
尤禮

你的遞歸終止條件在哪里呢?

--------------------更新------------------------
請您先仔細了解一下forEach函數(shù)的用法,return不會終止這個函數(shù)的,223.

2017年12月22日 00:22
編輯回答
挽歌

第一個版本我運行了一下,沒有發(fā)現(xiàn)你說的問題,返回的就是預期結(jié)果,不是undefined

clipboard.png

clipboard.png

第二個版本需要注意的點是forEach循環(huán)是不能提前退出的,所以如果循環(huán)有提前退出的需求,老老實實用for,另外遞歸調(diào)用的結(jié)果也需要return

const findSelectedLabel = (items, name) => {
  for (let i = 0, len = items.length; i < len; i++) { // 使用for代替forEach
    let item = items[i]
    if (item.name === name) {
      return item.label;
    } else if (item.items && Array.isArray(item.items)) {
      let result = findSelectedLabel(item.items, name); // 遞歸的結(jié)果也要return
      if (result) return result
    }
  }
};
2018年6月10日 10:59