首页 > 解决方案 > 无法读取 javascript 中未定义的属性“推送”

问题描述

我不明白代码的问题在哪里,我试图调试它,但我无法正确读取未定义的“推送”,这也表明 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]));

标签: javascriptdebugging

解决方案


首先,错误信息并没有说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为输入数组中的每个值调用回调:

将使用几个参数调用该回调。前两个被命名为acccurrhere。acc是正在填充的数组,因此它[]在回调的第一次调用中,并且curr是来自输入数组的当前迭代值。

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

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]。


推荐阅读