Search code examples
javascriptarraysobjectunderscore.jslodash

Group By and Sum using Underscore/Lodash


I have JSON like this:

[
  {
     platformId: 1,
     payout: 15,
     numOfPeople: 4
  },
  {
     platformId: 1,
     payout: 12,
     numOfPeople: 3

  },
  {
     platformId: 2,
     payout: 6,
     numOfPeople: 5

  },
  {
     platformId: 2,
     payout: 10,
     numOfPeople: 1
  },

]

And I want to Group it by platformId with sum of payout and numOfPeople.

I.e. in result I want JSON like this:

[
  "1": {
     payout: 27,
     numOfPeople: 7
   },

  "2": {
     payout: 16,
     numOfPeople: 6
  }
] 

I tried to use underscore.js's _.groupBy method, and it groups fine, but how I can get the SUM of objects properties values like I demonstrated above?


Solution

  • You can do this without Underscore:

    var result = data.reduce(function(acc, x) {
      var id = acc[x.platformId]
      if (id) {
        id.payout += x.payout
        id.numOfPeople += x.numOfPeople
      } else {
        acc[x.platformId] = x
        delete x.platformId
      }
      return acc
    },{})
    

    But why would you want an object with numeric keys? You could convert it back to a collection:

    var toCollection = function(obj) {
      return Object.keys(obj)
        .sort(function(x, y){return +x - +y})
        .map(function(k){return obj[k]})
    }
    
    toCollection(result)
    

    Note that objects are mutated, so you may to clone them first if you want to maintain the original data.