当我减少数组时,我试图将数字设为零,但我不清楚这个函数的行为
[].reduce(function(previousValue, currentValue){
return Number(previousValue) + Number(currentValue);
});
结果
TypeError: Reduce of empty array with no initial value
似乎如果数组是空的我无法减少它
[""].reduce(function(previousValue, currentValue){
return Number(previousValue) + Number(currentValue);
});
结果
""
如果数组中唯一的元素是空字符串,则检索空字符串
答案 0 :(得分:175)
The second parameter 是初始值。
[].reduce(function(previousValue, currentValue){
return Number(previousValue) + Number(currentValue);
}, 0);
或使用ES6:
[].reduce( (previousValue, currentValue) => previousValue + currentValue, 0);
答案 1 :(得分:20)
这两种行为均符合the spec。
除非您明确提供初始"累积"否则您不能reduce
一个空数组。 value作为第二个参数:
如果没有提供initialValue,那么previousValue将等于 数组中的第一个值和currentValue将等于 第二。如果数组不包含任何元素,则为TypeError 未提供initialValue。
如果数组至少有一个元素,则提供初始值是可选的。但是,如果未提供,则将数组的第一个元素用作初始值,reduce
继续通过调用回调来处理其余的数组元素。在您的情况下,数组只包含一个元素,因此该元素成为初始值和最终值,因为没有更多元素可以通过回调处理。
答案 2 :(得分:0)
在您的示例中,必须先定义先前的值,因为它等同于将值分配给变量previousval
let previousvalue = 0; is different from let previousvalue;
答案 3 :(得分:0)
我自己刚遇到这个问题,想用一个更简单但现代的 JavaScript 示例给出答案。
JavaScript 的数组 reduce 函数遍历数组(此处为 list
)并通过计算数组中的每个项(此处为 sum
)将其减少为新结果(此处为 value
)累加器(此处为 acc
):
const sum = list.reduce((acc, value) => acc + value);
大多数reduce操作更喜欢对初始累加器(第二个参数,也称为初始值)进行操作。在我们的示例中,它甚至是强制性的,因为否则求和运算将不起作用。我们想将我们的值与初始值为 0 相加:
const sum = list.reduce((acc, value) => acc + value, 0);
reduce 函数的初始值是它的第二个参数(这里是 0
)。因此,如果您遇到错误:
TypeError: Reduce of empty array with no initial value
这只是意味着你必须为你的reduce操作提供一个初始(空)数组,因为如果你提供一个空数组(这里list
)开始,它不起作用并抱怨这个错误。为了修复它,提供一个空数组作为第二个参数:
const exponentials = list.reduce((acc, value) => {
acc = acc.concat(value * value);
return acc;
}, []);