javascript - 无法读取 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]));
解决方案
首先,错误信息并没有说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
为输入数组中的每个值调用回调:
将使用几个参数调用该回调。前两个被命名为acc
和curr
here。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]。
推荐阅读
- react-native - react-native 上传图片 react-native-fetch-blob
- mysql - phpmyadmin 与 azure 中国
- kdb - 如何在 kdb 中使用类型“c”和“C”
- python - 在 Pandas Dataframe 中访问感兴趣的行之前和之后的行
- c++ - 这是我的 .h 文件的一些错误,当我在其中包含我的类模板时显示 [Error] unterminated #ifndef
- pycharm - 如何使用 Pycharm 找出谁在特定行上进行了最后一次更改
- angularjs - 无法在 AngularJs 中获取选定的单选按钮值
- r - RMarkdown 图以 101% 的宽度和高度插入 Word
- openshift - 小贩数据访问错误
- jenkins - Jenkins + (yarn or npm) - 如何从命令行设置内部版本号