Javascript 减少空数组

问题描述 投票:0回答:5

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

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

结果

""

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

javascript arrays ecmascript-5
5个回答
327
投票

第二个参数为初始值。

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

或使用 ES6:

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

31
投票

这两种行为均符合规范

您不能

reduce
空数组,除非您明确提供初始“累积”值作为第二个参数:

如果没有提供initialValue,则 previousValue 将等于 数组中的第一个值和 currentValue 将等于 第二。如果数组不包含元素,则为 TypeError 未提供初始值。

如果数组至少有一个元素,则提供初始值是可选的。但是,如果未提供,则数组的第一个元素将用作初始值,并且

reduce
通过调用回调继续处理数组的其余元素。在您的情况下,数组仅包含一个元素,因此该元素成为初始值和最终值,因为没有更多元素要通过回调处理。


2
投票

我自己也遇到了这个问题,并想用一个更简单但更现代的 JavaScript 示例来给出答案。

JavaScript 的数组归约函数迭代数组(此处为

list
),并通过使用累加器(此处为
sum
)计算数组中的每个项目(此处为
value
),将其缩减为新结果(此处为
acc
) :

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

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

0
投票

在您的示例中,必须首先定义前一个值,因为它相当于为变量 previousValue 赋值

let previousValue = 0;
不同于
let previousValue;


0
投票

[].reduce(function (total, curr) {returntotal + curr;},0); 我已修复添加 0 默认值

© www.soinside.com 2019 - 2024. All rights reserved.