20

I have code similar to this:

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

Why does it print NaN instead of 152?

Sebastian Simon
  • 18,263
  • 7
  • 55
  • 75
Akhilesh Kumar
  • 9,085
  • 13
  • 57
  • 95

2 Answers2

46

You could use a start value and the add only one value from the array.

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
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
  • one liner const reduced = temp.length ? temp.reduce((r, a) => { return r + a.y; }, 0) : 0; – webmaster Feb 28 '18 at 13:43
  • @webmaster, even shorter, it takes the start value of reduce for empty arrays: `const reduced = temp.reduce((r, { a }) => r + a, 0);` – Nina Scholz Feb 28 '18 at 13:53
9

short solution: map the collection to integers collection, and reduce it

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);
Chen
  • 2,958
  • 5
  • 26
  • 45