我有一个对象数组,让我们说[{x:2, y:3}, {x:5, y:4}]
并在其上调用reduce((c, n) => c.y + n.y);
。它显然会返回7
。
但是,如果数组包含单个对象,让我们说[{x:2, y:4}]
相同的reduce调用将返回对象本身{x:2, y:4}
。
这是正常行为吗?我是否有义务检查结果是否是对象而不是之后的数字?
答案 0 :(得分:12)
是的,当你没有传递累加器的初始值(总是应该)时,这是reduce
的正常行为。除了具有两个对象的数组之外,您的代码在任何数组上都无法正常工作。
转到
arr.reduce((acc, el) => acc + el.y, 0)
答案 1 :(得分:3)
当您未提供初始值(reduce
的第二个参数)时,它是预期的行为。来自MDN:
如果数组为空且未提供
initialValue
,则会抛出TypeError
。如果数组只有一个元素(无论位置如何)并且没有提供initialValue
,或者如果提供了initialValue
但是数组为空,那么将返回而不调用>的独奏值callback
。
它附带以下建议:
提供初始值通常更安全,因为有三个可能的输出没有
initialValue
。
所以写:
reduce((c, n) => c.y + n.y, { y: 0 });
答案 2 :(得分:2)
您是否已将累加器初始化为{ y : 0}
如果没有,那么它将返回原始对象。
let sum = data.reduce((c, n) => {
return { "y" : c.y + n.y };
}, { y : 0 });
答案 3 :(得分:2)
那是因为redux函数可以多接1个参数 - 默认值,如果没有指定,则需要数组的第1个值。这就是为什么它不止一个的原因。
但是,如果你这样做
let a = [{x:5, y:4}].reduce((c, n) => c + n.y, 0);
console.log(a)

它总结了财产。
答案 4 :(得分:1)
注意:如果未提供initialValue,reduce将从索引1开始执行回调函数,跳过第一个索引。如果提供了initialValue,它将从索引0开始。
如果数组为空并且未提供initialValue,则抛出TypeError。如果数组只有一个元素(无论位置如何)并且没有提供initialValue,或者如果提供了initialValue但是数组为空,则将返回solo值而不调用callback。
提供初始值通常更安全,因为有三个可能的输出没有initialValue,如下例所示。