#javascript #recursion
#javascript #рекурсия
Вопрос:
У меня есть вызываемая функция, nestedEvenSum
которая принимает object
в качестве параметра и перебирает object
, пытаясь найти значения, которые являются четными числами. Когда она находит четное число, она добавляет его к переменной sum
. Вот мой код:
function nestedEvenSum (obj) {
let sum = 0;
function inner(obj) {
for (let i in obj) {
if (typeof obj[i] === "number" amp;amp; obj[i] % 2 === 0) sum = obj[i];
if (typeof obj[i] === 'object') return inner(obj[i]);
}
}
inner(obj);
return sum;
}
Я передаю своей функции следующий объект:
var obj2 = {
a: 2,
b: {b: 2, bb: {b: 3, bb: {b: 2}}},
c: {c: {c: 2}, cc: 'ball', ccc: 5},
d: 1,
e: {e: {e: 2}, ee: 'car'}
};
и мой цикл продолжает возвращаться 6
вместо 10
. По какой-то причине цикл for завершается после рекурсивных inner()
вызовов unwind для второго ключа (b). Я не уверен, почему цикл for не продолжается с тремя оставшимися ключами. Если бы кто-нибудь мог указать мне правильное направление, я был бы признателен. Спасибо!
Комментарии:
1.
return
Инструкция внутри цикла приводит к тому, что цикл не выполняет итерацию по всем свойствам объекта.
Ответ №1:
Не возвращайтесь внутрь вашего цикла. Это приведет к завершению вашей рекурсии. Вместо этого вам нужно снова ВЫЗВАТЬ функцию, что не то же самое, что вернуть ее.
function nestedEvenSum (obj) {
let sum = 0;
function inner(obj) {
for (let i in obj) {
if (typeof obj[i] === "number" amp;amp; obj[i] % 2 === 0) sum = obj[i];
if (typeof obj[i] === 'object') inner(obj[i]);
}
}
inner(obj);
return sum;
}
var obj2 = {
a: 2,
b: {b: 2, bb: {b: 3, bb: {b: 2}}},
c: {c: {c: 2}, cc: 'ball', ccc: 5},
d: 1,
e: {e: {e: 2}, ee: 'car'}
};
console.log(nestedEvenSum(obj2));
Ответ №2:
Помимо инструкции false return для объектов, вы могли бы взять одну функцию и добавить возвращаемый результат функции для вложенных объектов.
function nestedEvenSum(obj) {
let sum = 0;
for (let i in obj) {
if (typeof obj[i] === "number" amp;amp; obj[i] % 2 === 0) sum = obj[i];
if (obj[i] amp;amp; typeof obj[i] === 'object') sum = nestedEvenSum(obj[i]);
}
return sum;
}
var obj2 = { a: 2, b: { b: 2, bb: { b: 3, bb: { b: 2 } } }, c: { c: { c: 2 }, cc: 'ball', ccc: 5 }, d: 1, e: { e: { e: 2 }, ee: 'car' } };
console.log(nestedEvenSum(obj2));