我不明白代码的问题出在哪里,我试图调试它,结果我无法正确读取未定义的“推送”,还显示 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]));
答案 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
回调:
该回调将使用多个参数进行调用。前两个在这里命名为 acc
和 curr
。 acc
是正在填充的数组,因此它在回调的第一次调用中为 []
,而 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 函数,您应该返回累加器以减少它。
答案 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]));