How To Group And Sort Object Array?
I've got an object array which I have to group and sort: [ { id: 123, group: 'abc', metadata: { name: 'tom' }, date: ISODate('2019-07-08T20:33:40.475Z')
Solution 1:
Use reduce
to group the values, and sort
to sort them, using map
as well due to the nested array structure.
const arr = [{id:123,group:'abc',metadata:{name:'tom'},date:"2019-07-08T20:33:40.475Z"},{id:456,group:'def',metadata:{name:'bob'},date:"2019-07-08T20:33:40.475Z"},{id:789,group:'def',metadata:{name:'bob'},date:"2019-07-10T20:33:40.475Z"},{id:234,group:'ghi',metadata:{name:'frank'},date:"2019-07-10T20:33:40.475Z"},{id:567,group:'abc',metadata:{name:'tom'},date:"2019-07-10T20:33:40.475Z"}];
const res = Object.values(arr.reduce((a, { group, ...r }) => {
(a[group] = a[group] || []).push({ group, ...r });
return a;
}, {})).map(e => e.sort(({ date: a }, { date: b }) =>newDate(a) - newDate(b)));
console.log(res);
.as-console-wrapper { max-height: 100%!important; top: auto; }
(I've taken out the ISODate
function and just kept the string date to make the snippet executable.)
Solution 2:
I would suggest to use lodash.
var ISODate = function(str) { return str };
var data = [
{
id: 123,
group: 'abc',
metadata: {
name: 'tom'
},
date: ISODate("2019-07-08T20:33:40.475Z")
},
{
id: 456,
group: 'def',
metadata: {
name: 'bob'
},
date: ISODate("2019-07-08T20:33:40.475Z")
},
{
id: 789,
group: 'def',
metadata: {
name: 'bob'
},
date: ISODate("2019-07-10T20:33:40.475Z")
},
{
id: 234,
group: 'ghi',
metadata: {
name: 'frank'
},
date: ISODate("2019-07-10T20:33:40.475Z")
},
{
id: 567,
group: 'abc',
metadata: {
name: 'tom'
},
date: ISODate("2019-07-10T20:33:40.475Z")
}
]
console.log(
_.mapValues(
_.groupBy(data, 'group'),
function(item) { return _.orderBy(item, ['date'], ['asc']) }
)
)
Post a Comment for "How To Group And Sort Object Array?"