Вы были близки. Вы просто должны были где-то хранить детскую длину.
Как только один уровень меньше желаемого, функция возвращает длину детей.
Все узлы, расположенные выше в дереве, просто добавят значения, полученные от детей, в ноль и передают их до тех пор, пока не будет достигнут корневой узел.
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;
};
Проблема с этим подходом является то, что 0 будет возвращено, когда желаемый уровень больше, чем глубина дерева или когда оно равно нулю (корневой уровень, должен возвращать 1).
Чтобы исправить это, вы можете сделать закрытие и проверить наличие проблемных значений.
Также не обязательно посылать начальный уровень вручную каждый раз.
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