Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 850
WelcomeTo Avatar asked Jul 30 '14 21:07

WelcomeTo


1 Answers

Here's a Lodash solution to this kind of problem. It's similar to Underscore, but with some more advanced features.

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

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

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

const ans = _(data)
  .groupBy('platformId')
  .map((platform, id) => ({
    platformId: id,
    payout: _.sumBy(platform, 'payout'),
    numOfPeople: _.sumBy(platform, 'numOfPeople')
  }))
  .value()

console.log(ans);
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
like image 88
DSav Avatar answered Oct 03 '22 05:10

DSav