javascript - 对于数组完成之前的每个循环中断
问题描述
我有一个简单的函数查看数组中的对象。如果它没有找到基于属性的匹配项,它会检查它是否有子项,然后检查每个子项的属性值。
它似乎通过第一个带有孩子的对象按预期工作,但是它没有达到第三层。
对象是这样的:
data = [{
title: 'Home',
route: '/reports/home',
},
{
title: 'Layer 2',
children: [
{ title: 'Title 1', route: '/reports/title1' },
{ title: 'Title 2', route: '/reports/title2' },
],
},
{
title: 'Layer 3',
children: [
{ title: 'Title 3', route: '/reports/title3' },
{ title: 'Title 4', route: '/reports/title4' },
],
}];
lookUpTitle = navGroup => {
for (let item of navGroup) {
if (item.route && item.route.toLowerCase() === '/reports/title3') {
console.log(item.title)
return item.title;
} else {
if (item.children) {
return this.lookUpTitle(item.children);
}
}
}
};
lookUpTitle(data)
我只是像上面那样调用函数并传入数组。
我可以很好地找到 Title 2,但如果我正在寻找 Title 3 或 4,该函数将不会迭代到数组中的第三个对象。我错过了什么?
解决方案
怎么了
为了理解循环停止的原因,让我们一步一步地写出发生了什么:
item
取第一个对象的值。(标题 = 主页)。if
条件不满足且不item
包含children
item
取第二个对象的值。if
条件不满足但item
包含children
- 该函数返回函数调用的结果,
lookUpTitle()
因此循环停止。 - 返回第 1 步,但使用第二个对象的子值。
因此,如果对象不满足if
条件并包含,则循环将始终停止children
。
如何修复它
为了修复它,我们必须跟踪递归结果。检查是否通过递归调用找到结果lookUpTitle()
。如果没有,继续循环,如果找到,可以返回。此方法假定您只希望找到第一个结果,而不是所有现有结果。
lookUpTitle = navGroup => {
for (let item of navGroup) {
if (item.route && item.route.toLowerCase() === '/reports/title3') {
return item.title;
} else {
if (item.children) {
var res = this.lookUpTitle(item.children);
if(res != undefined)
return res;
}
}
}
};
推荐阅读
- xml - 如何向 wsdl 文件/soap api 添加基本身份验证?
- keycloak - Keycloak 通过分片创建领域
- haskell - foldl/foldr 不会命中 stackoverflow
- caching - TYPO3 缓存预热与爬虫不工作
- google-sheets - 如何从任何块 html 元素导入谷歌表格?
- c# - 在 openTK 中旋转图像
- python - 使用 beautifulsoup 提取网页中所有 url 中的公司名称和其他信息
- objective-c - iOS:静态框架和动态框架?
- python - py-abac pdp 实现也因正确的“规则”匹配而失败
- java - 在主题的特定分区中发送消息