-2

我不知道为什么当 console.log 打印正确的结果时这个小东西会返回“未定义”。提前谢谢。

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 的变量。

4

3 回答 3

1

如果tree.content在你的条件为真的地方没有键,你的函数永远不会return有任何东西,所以你会回来undefined

即使某些递归调用可能log有所作为,它们的结果也不会在任何地方使用。您还需要从调用函数返回递归调用的结果!将 else 分支更改为

var res = this.getLeaf(leafSlug, tree.content[key]);
if (res)
    return res;
于 2013-02-06T08:55:50.537 回答
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]);    
        }
    }
}
于 2013-02-06T08:55:02.683 回答
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)内容,如果是,则返回该结果{ return tempReturn }

我还添加了针对分支结束的测试,以不调用undefined元素上的递归:

if (tree.content[key] instanceof Object && tree.content[key].hasOwnProperty('content')) {...}
于 2013-02-06T12:33:03.577 回答