Skip to content Skip to sidebar Skip to footer

How To Get Sum Of An Array Object Keys In Underscore.js?

I have the following array: var items = [ {price1: 100, price2: 200, price3: 150}, {price1: 10, price2: 50}, {price1: 20, price2: 20, price3: 13}, ] I need to get object

Solution 1:

Not very pretty, but I think the fastest method is to do it like this

_(items).reduce(function(acc, obj) {
  _(obj).each(function(value, key) { acc[key] = (acc[key] ? acc[key] : 0) + value });
  return acc;
}, {});

Or, to go really over the top (I think it will can be faster than above one, if you use lazy.js instead of underscore):

_(items).chain()
  .map(function(it) { return _(it).pairs() })
  .flatten(true)
  .groupBy("0") // groups by the first index of the nested arrays.map(function(v, k) { 
    return [k, _(v).reduce(function(acc, v) { return acc + v[1] }, 0)]     
  })
  .object()
  .value()

Solution 2:

For aggregating I'd recommend reduce:

_.reduce(items, function(acc, o) {
    for (var p in acc) acc[p] += o[p] || 0;
    return acc;
}, {price1:0, price2:0, price3:0});

Or better

_.reduce(items, function(acc, o) {
    for (var p in o)
        acc[p] = (p in acc ? acc[p] : 0) + o[p];
    return acc;
}, {});

Solution 3:

Js from hell:

var names = _.chain(items).map(function(n) {  return _.keys(n);  }).flatten().unique().value();    
console.log(_.map(names, function(n) {              
      return  n + ': ' + eval((_.chain(items).pluck(n).compact().value()).join('+')); 
}).join(', '));  

jsfiddle

Post a Comment for "How To Get Sum Of An Array Object Keys In Underscore.js?"