あなたは近かったです。あなたはちょうど子供の長さをどこかに保管しなければなりませんでした。
目的のレベルより1レベル低い値に達すると、関数は子の長さを返します。
ツリーの上位にあるすべてのノードは、子ノードから収集された値をゼロに加算し、ルートノードに達するまでそれを戻します。
var getNumNodesAtLevel = function(node, curr, desired) {
if (curr === (desired - 1))
return node.children.length;
var count = 0;
node.children.forEach(function(child) {
count += getNumNodesAtLevel(child, curr + 1, desired);
});
return count;
};
このアプローチの問題点は、所望のレベルは、ツリーの深さよりも大きいか、またはそれがゼロである場合(ルートレベル、1を返すべき)場合0が返されることです。
これを解決するには、クロージャを行い、問題のある値をチェックすることができます。
また、毎回手動で開始レベルを送信する必要はありません。
var test = {
children : [
{ children : [ { children : [ ] } ] },
{ children : [ ] },
{ children : [ { children : [ ] } ] }
]
};
var getNumNodesAtLevel = (function() {
var getNumNodesAtLevel = function(node, curr, desired) {
if (curr === (desired - 1))
return node.children.length;
var count = 0;
node.children.forEach(function(child) {
count += getNumNodesAtLevel(child, curr + 1, desired);
});
return count;
};
return function(root, desired) {
if (desired === 0)
return 1;
var count = getNumNodesAtLevel(root, 0, desired);
if (count === 0)
return null; // you could throw an error here
return count;
};
}());
console.log(getNumNodesAtLevel(test, 0)); // 1
console.log(getNumNodesAtLevel(test, 1)); // 3
console.log(getNumNodesAtLevel(test, 2)); // 2
console.log(getNumNodesAtLevel(test, 3)); // null
console.log(getNumNodesAtLevel(test, 4)); // null
あなたのforEachの呼び出しは、実際に電話をかけるとは別に何もしていません。 –
JSONはオブジェクトの意味論的な説明に過ぎません。それがオブジェクト形式であれば、単なるオブジェクトです。 –
あなたの最初のコメントは何を意味しますか? – user3044874