有如下遞歸函數(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}`)
第一個版本我運行了一下,沒有發(fā)現(xiàn)你說的問題,返回的就是預期結(jié)果,不是undefined
:
第二個版本需要注意的點是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
}
}
};
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。