当console.log打印出正确的结果时,我不知道为什么这个小东西会返回“undefined”。 Thx提前。
App.Presentation.prototype.getLeaf = function(leafSlug, tree) {
for (var key in tree.content) {
if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
console.log(tree.content[key]) // this works Correct
return tree.content[key]; // this returns undefined :<
} else {
this.getLeaf(leafSlug, tree.content[key]);
}
}
};
我在控制台中这样称呼它:
Presentation.getLeaf("chpl", Presentation.tree);
得到这个结果:
(来自console.log
的第一个结果)
Object {type: "leaf", alias: "Chpl bla bla bla", slug: "chpl", group: "", order: ""…}
alias: "Chpl bla bla bla"
group: ""
html: "<img src='bg.png' />"
order: ""
parent: "chpl"
slug: "chpl"
type: "leaf"
__proto__: Object
(来自return
的下一个结果)
undefined
Presentation.tree
是一个包含解析为对象的JSON的变量。
答案 0 :(得分:1)
如果tree.content
没有您的条件为真的密钥,那么您的函数永远不会return
,所以您可以返回undefined
。
即使某些递归调用可能log
某些东西,它们的结果也不会在任何地方使用。您还需要从调用函数返回递归调用的结果!将else-branch更改为
var res = this.getLeaf(leafSlug, tree.content[key]);
if (res)
return res;
答案 1 :(得分:0)
你没有从递归调用中返回任何内容。这里可能还有其他注意事项,但在某些时候你会想要返回递归调用的结果,例如:
App.Presentation.prototype.getLeaf = function(leafSlug, tree) {
for (var key in tree.content) {
if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
console.log(tree.content[key]) // this works Correct
return tree.content[key]; // this returns undefined :<
} else {
return this.getLeaf(leafSlug, tree.content[key]);
}
}
}
答案 2 :(得分:0)
解决。正确的重复搜索嵌套对象的树应该如下所示:
Presentation.prototype.getLeaf = function(leafSlug, tree) {
var tempReturn;
for (var key in tree.content) {
if (tree.content[key].type === 'leaf' && tree.content[key].slug === leafSlug) {
return tree.content[key];
} else {
if (tree.content[key] instanceof Object && tree.content[key].hasOwnProperty('content')) {
tempReturn = this.getLeaf(leafSlug, tree.content[key]);
if (tempReturn) { return tempReturn }
}
}
}
return false;
};
不必在找不到任何内容时调用this.getLeaf(leafSlug, tree.content[key]);
,而是必须将此调用的结果分配给变量tempReturn = this.getLeaf(leafSlug, tree.content[key]);
,检查是否返回了某些内容if (tempReturn)
,如果是,则返回该结果{{1 }}
我还添加了对分支结束的测试,以便不在{ return tempReturn }
元素上调用递归:
undefined