Преждевременный выход рекурсивной функции из цикла for

#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));