使用reduce对对象数组求和返回NaN

22

我有类似于以下代码:

var temp = [ { "y": 32 }, { "y": 60 }, { "y": 60 } ];
var reduced = temp.reduce(function(a, b) {
  return a.y + b.y;
});

console.log(reduced); // Prints NaN

为什么它打印出NaN而不是152

7
解释这个问题 - 当你返回第一个数后,变量 a 的类型将会是一个数字(Number) - 它没有 y 属性。 - Jaromanda X
检查 reduce 函数的回调参数,它们是什么? - passion
1
这个回答解决了你的问题吗?Javascript 对象数组的 reduce - Sebastian Simon
2个回答

46

您可以使用起始值,然后仅从数组中添加一个值。

var temp=[{"name":"Agency","y":32,"drilldown":{"name":"Agency","categories":["APPS & SI","ERS"],"data":[24,8]}},{"name":"ER","y":60,"drilldown":{"name":"ER","categories":["APPS & SI","ERS"],"data":[7,53]}},{"name":"Direct","y":60,"drilldown":{"name":"Direct","categories":["APPS & SI","ERS"],"data":[31,29]}}];

var reduced = temp.reduce(function (r, a) {
        return r + a.y;
        //    ^^^ use the last result without property
    }, 0);
//   ^^^ add a start value
console.log(reduced) // r


一行代码 const reduced = temp.length ? temp.reduce((r, a) => { return r + a.y; }, 0) : 0; - webmaster
@网站管理员,更短的写法是对于空数组,它采用reduce的起始值:const reduced = temp.reduce((r, { a }) => r + a, 0); - Nina Scholz

10
简单解决方案:将集合映射为整数集合,然后将其缩减。
var temp=[{"name":"Agency","y":32,"drilldown":{"name":"Agency","categories":["APPS & SI","ERS"],"data":[24,8]}},{"name":"ER","y":60,"drilldown":{"name":"ER","categories":["APPS & SI","ERS"],"data":[7,53]}},{"name":"Direct","y":60,"drilldown":{"name":"Direct","categories":["APPS & SI","ERS"],"data":[31,29]}}];

var reduced = temp
                .map(function(obj) { return obj.y; })
                .reduce(function(a, b) { return a + b; });

console.log(reduced);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接