繁体   English   中英

Javascript 减少一个空数组

[英]Javascript Reduce an empty array

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

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

结果

""

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

第二个参数是初始值。

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

或使用 ES6:

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

这两种行为都符合规范

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

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

如果数组至少有一个元素,则提供初始值是可选的。 但是,如果未提供,则使用数组的第一个元素作为初始值,并通过调用回调来reduce数组的其余元素。 在您的情况下,数组仅包含一个元素,因此该元素成为初始值和最终值,因为没有更多元素要通过回调处理。

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

let previousvalue = 0;
is different from
let previousvalue;

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

JavaScript 的数组 reduce 函数遍历一个数组(这里是list ),并通过使用累加器(这里是acc )计算数组中的每个项目(这里是value )来将其缩减为一个新结果(这里是sum ):

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM