我有一个恰好是for循环的递归函数
function deepFindGroup(groupName, currentGroup) {
console.log("Testing");
for (e in currentGroup) {
if (currentGroup[e].intName == groupName) {
console.log(currentGroup[e]["Members"]);
return currentGroup[e]["Members"];
} else if (currentGroup[e]["Members"]) {
return deepFindGroup(groupName, currentGroup[e]["Members"]);
}
}
}
似乎我无法通过有意义的退货声明处理所有可能性。例如,如果currentGroup [e] .intName不等于groupName,并且该分支的子节点没有成员属性(在这种情况下它根本就没有子节点)。它最终返回undefined。我能想到的唯一解决方案就是制作一个全局变量,我试图避免这种情况。
编辑: 该函数应该返回树中的给定分支。树由包含“成员”的对象(具有intName属性)组成,“成员”本身可以是包含其他成员的对象。成员也可以包含任何内容但仍具有intName。
看起来像这样:
Gengroup_1--intName: Gengroup_1
|
--Members-- nochild -- intName: nochild
|
--Gengroup_2--intName: Gengroup2
|
--Members-- object -- intName: object
|
-- anotherObject -- intName: anotherObject
答案 0 :(得分:1)
如果一个分支没有产生查找,您的函数将不会尝试多个分支。即使找不到匹配也会返回。相反,它应该允许for
循环继续,以便可以通过另一个分支完成新的搜索。
假设找到的值永远不会是undefined
本身,你可以这样做:
function deepFindGroup(groupName, currentGroup) {
var result;
console.log("Testing");
for (var e in currentGroup) {
if (currentGroup[e].intName == groupName) {
console.log(currentGroup[e]["Members"]);
return currentGroup[e]["Members"];
} else if (currentGroup[e]["Members"]) {
// Don't return before you have looked at the result:
result = deepFindGroup(groupName, currentGroup[e]["Members"]);
if (result !== undefined) return result;
}
}
}
还要确保声明变量。您没有声明e
,因此它是全局的,因此函数作用域的不同递归实例将更改相同的e
变量,从而导致不稳定的行为。
答案 1 :(得分:1)
在输入函数时定义result
,在找到某些内容时停止迭代:
function deepFindGroup(groupName, currentGroup) {
var result = null;
for (e in currentGroup) {
if (currentGroup[e].intName === groupName) {
result = currentGroup[e]["Members"];
} else if (currentGroup[e]["Members"]) {
result = deepFindGroup(groupName, currentGroup[e]["Members"]);
}
if (result || result === undefined) break;
}
return result;
}
var group = {
one: {
intName: 'one',
Members: {
one_one: {
intName: 'one_one',
}
}
},
two: {
intName: 'two',
Members: {
two_one: {
intName: 'two_one',
Members: {}
}
}
}
}
console.log(deepFindGroup('one', group)) // -> {one_one: {intName: 'one_one'}}
console.log(deepFindGroup('one_one', group)) // -> undefined (members are undefined)
console.log(deepFindGroup('two_one', group)) // -> {}
console.log(deepFindGroup('two_two', group)) // -> null

请注意,当匹配群组的currentGroup[e]["Members"]
为undefined
时,您会得到undefined
,因此结果为undefined
或{{1} }}或array
意味着在成员中,如果未找到whatever
,则匹配该组。