[英]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.