Javascript减少一个空数组

时间:2014-04-29 08:15:51

标签: javascript arrays ecmascript-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);
});

结果

""

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

4 个答案:

答案 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;
}, []);