Search This Blog

2021/08/25

Group By using Underscore.js

Suppose you want to do group by on object array then we can use underscore.js

 I have object array x which has keys amount,date & valid.I want to do sum of amount based on date key and use only those record which are valid as 1.

Here is example code

var _ = require('underscore');
var x=[
    {
        "date":"2021-04-14",
        "amount":1300,
        "valid":1
    },
    {
        "date":"2021-05-14",
        "amount":700,
        "valid":0
    },
    {
        "date":"2021-06-13",
        "amount":2300,
        "valid":1
    },
    {
        "date":"2021-07-10",
        "amount":1000,
        "valid":0
    },
    {
        "date":"2021-07-10",
        "amount":1300,
        "valid":1
    },
    {
        "date":"2021-04-14",
        "amount":1700,
        "valid":1
    }
]
x = x.filter((m)=>{
    return m.valid==1
})
console.log("Filtered",x);
 
var grouped = _.groupBy(x, 'date');
console.log("group by date:",grouped);
 
var result=[];
for (const key in grouped) {
    var sum = grouped[key].reduce((accumulator,a)=>{
            return  accumulator + a.amount          
    },0);
 
    result.push({
        "date":key,
        "amount":sum
    })
}
console.log("result:",result);

Output:

Filtered [
  { date: '2021-04-14', amount: 1300, valid: 1 },
  { date: '2021-06-13', amount: 2300, valid: 1 },
  { date: '2021-07-10', amount: 1300, valid: 1 },
  { date: '2021-04-14', amount: 1700, valid: 1 }
]
group by date: {
  '2021-04-14': [
    { date: '2021-04-14', amount: 1300, valid: 1 },
    { date: '2021-04-14', amount: 1700, valid: 1 }
  ],
  '2021-06-13': [ { date: '2021-06-13', amount: 2300, valid: 1 } ],
  '2021-07-10': [ { date: '2021-07-10', amount: 1300, valid: 1 } ]
}
result: [
  { date: '2021-04-14', amount: 3000 },
  { date: '2021-06-13', amount: 2300 },
  { date: '2021-07-10', amount: 1300 }
]