-2

console.logが正しい結果を出力するときに、この小さなことが「未定義」を返す理由がわかりません。事前にt​​hx。

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条件が true のキーがない場合、関数はreturn何も実行しないため、返されますundefined

そして、再帰呼び出しのいくつかがlog何かをしたとしても、それらの結果はどこにも使用されません。呼び出し元の関数からも再帰呼び出しの結果を返す必要があります! else-branch を次のように変更します

var res = this.getLeaf(leafSlug, tree.content[key]);
if (res)
    return res;
于 2013-02-06T08:55:50.537 に答える
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 に答える
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 に答える