递归函数过早退出循环

时间:2019-03-29 19:36:32

标签: javascript recursion

我有一个名为nestedEvenSum的函数,该函数以一个object作为参数,并循环遍历object,试图查找偶数的值。找到偶数时,会将其添加到变量sum中。这是我的代码:

function nestedEvenSum (obj) {
  let sum = 0;
  function inner(obj) {
      for (let i in obj) {
        if (typeof obj[i] === "number" && 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。由于某种原因,递归inner()调用第二个键(b)的展开后,for循环退出。我不确定为什么for循环不会继续使用其余三个键。如果有人能指出我正确的方向,我将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:2)

不要在循环内返回。那将退出您的递归。相反,您需要再次调用该函数,这与返回它是不同的。

function nestedEvenSum (obj) {
  let sum = 0;
  function inner(obj) {
      for (let i in obj) {
        if (typeof obj[i] === "number" && 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));

答案 1 :(得分:2)

除了对象的false返回语句之外,您还可以使用一个函数并为嵌套对象添加函数的返回结果。

function nestedEvenSum(obj) {
    let sum = 0;
    for (let i in obj) {
        if (typeof obj[i] === "number" && obj[i] % 2 === 0) sum += obj[i];
        if (obj[i] && 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));