无法读取javascript中未定义的属性“推送”

时间:2021-07-01 18:06:36

标签: javascript debugging

我不明白代码的问题出在哪里,我试图调试它,结果我无法正确读取未定义的“推送”,还显示 acc 未定义,有人可以向我解释代码,因为它让我感到困惑

const multiplyOddByTwo = (arr) => {
  return arr.reduce((acc, curr) => {
    if (curr % 2 == 0) {
      acc.push(curr);
    } else {
      acc.push(curr * 2)
    }
  }, [])
}

console.log(multiplyOddByTwo([1, 2, 3]));

3 个答案:

答案 0 :(得分:0)

首先,错误信息并没有说push是未定义的,而是说push被调用的对象是未定义的,即acc是未定义的。 (您在编辑问题时更正了这一点)。

给予 reduce 的回调应该返回累积值,因此它可以用于下一个迭代,或用于最终值(以防万一这是最后一次迭代)。您的回调函数不返回任何内容,因此默认 undefined 值被隐式返回。这将在下一次迭代中成为 acc 的值,因此您会在第二次迭代中得到错误。

更正:

const multiplyOddByTwo = (arr) => {
  return arr.reduce((acc, curr) => {
    if (curr % 2 == 0) {
      acc.push(curr);
    } else {
      acc.push(curr * 2)
    }
    return acc; // <----
  }, [])
}

console.log(multiplyOddByTwo([1, 2, 3]));

代码说明

代码构建了一个新数组。它以 [] 开头,作为 reduce 的最后一个参数给出。

然后为输入数组中的每个值调用 reduce 回调:

该回调将使用多个参数进行调用。前两个在这里命名为 acccurracc 是正在填充的数组,因此它在回调的第一次调用中为 [],而 curr 是输入数组中当前迭代的值。

curr % 2 除以 2 得到余数,因此 curr 为偶数时为 0,而 curr 为奇数时为 1(或 -1)。如果偶数,我们只想将值复制到新数组中:

acc.push(curr)

如果是奇数,我们想把值加倍(这是赋值):

acc.push(curr * 2)

然后这个扩展数组被返回(这个丢失了),所以它会在下一次迭代中被传递。

这里是示例数组 [1, 2, 6] 的所有迭代:

<头>
acc 当前 结果
[] 1 2 [2]
[2] 2 2 [2, 2]
[2, 2] 6 6 [2, 2, 6]

当所有迭代完成后,回调中返回的最后一个值将成为 reduce 调用的返回值,在本例中为 [2, 2, 6]。

答案 1 :(得分:0)

您忘记返回 acc

const multiplyOddByTwo = (arr) => {
  return arr.reduce((acc, curr) => {
    if (curr % 2 == 0) {
      acc.push(curr);
    } else {
      acc.push(curr * 2)
    }
    return acc;
  }, [])
}

console.log(multiplyOddByTwo([1, 2, 3]));

参见 Array.prototype.reduce() 文档,它需要一个带有累加器和当前值的 reducer 函数,您应该返回累加器以减少它。

供参考Array.prototype.reduce()

答案 2 :(得分:0)

const multiplyOddByTwo = (arr) => {
  return arr.reduce((acc, curr) => {
    if (curr % 2 == 0) {
      acc.push(curr);
    } else {
      acc.push(curr * 2)
    }
    // the callback should return accumulator. Earlier it was returning undefined. 
    return acc;
  }, []) // [] is the initial value, after that returned value will be used
}

console.log(multiplyOddByTwo([1, 2, 3]));
相关问题