JavaScript reduce对象数组返回对象

时间:2017-02-21 21:19:55

标签: javascript arrays reduce

我有一个对象数组,让我们说[{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}

这是正常行为吗?我是否有义务检查结果是否是对象而不是之后的数字?

5 个答案:

答案 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,如下例所示。