减少一个空数组

当我减少数组时,我试图得到数字零,但是我不能清楚地理解函数的行为

[].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);
});

结果

""

如果数组中的唯一元素是空字符串,则检索空字符串

98808 次浏览

第二个参数 用于初始值。

[].reduce(function(previousValue, currentValue){
return Number(previousValue) + Number(currentValue);
}, 0);

或使用 ES6:

[].reduce( (previousValue, currentValue) => previousValue + currentValue, 0);

这两种行为都是根据 说明书

除非显式地提供一个初始的“累积”值作为第二个参数,否则不能使用空数组 reduce:

如果没有提供 initialValue,那么 previousValue 将等于 数组中的第一个值,currentValue 将等于 如果数组不包含任何元素并且 未提供 initialValue。

如果数组至少有一个元素,则提供初始值是可选的。但是,如果没有提供数组元素,那么数组的第一个元素将用作初始值,而 reduce将通过调用您的回调继续处理数组元素的其余部分。在您的示例中,数组只包含一个元素,因此该元素将成为初始值和最终值,因为没有更多的元素需要通过回调进行处理。

在您的示例中,必须首先定义上一个值,因为它等效于将一个值赋给一个变量 previousValue

let previousValue = 0; 不同于 let previousValue;

我自己碰到了这个问题,想用一个更简单更现代的 JavaScript 示例来回答这个问题。

JavaScript 的 array reduce 函数迭代一个数组(这里是 list) ,并通过累加器(这里是 acc)计算数组中的每个项(这里是 value) ,将其减少到一个新的结果(这里是 sum) :

const sum = list.reduce((acc, value) => acc + value);

大多数将操作 更喜欢简化为对初始累加器(第二个参数,也称为初始值)进行操作。在我们的示例中,它甚至是强制的,因为否则 sum 操作将无法工作。我们想用初始值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;
}, []);