I have this array with objects:
var data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907411282', unix_date: '1547013214' },
{ number: '31907514691', unix_date: '1547015155' },
{ number: '31907514691', unix_date: '1547015232' },
{ number: '31907514691', unix_date: '1547016134' },
{ number: '31907514691', unix_date: '1547016443' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
How I can remove duplicate objects with newer date and get new array like this:
var new_data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907514691', unix_date: '1547015155' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
I can't understand how to do all procedure. Thanks
UPDATE
I try this construction:
- firstly we need group and sort objects
- second step is get first object from grouped and push to new array
Code:
var data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907411282', unix_date: '1547013214' },
{ number: '31907514691', unix_date: '1547019134' },
{ number: '31907514691', unix_date: '1547015232' },
{ number: '31907514691', unix_date: '1547016134' },
{ number: '31907514691', unix_date: '1547016443' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
var new_data=[];
var groupByNumber=groupBy(data, 'number');
for(i in groupByNumber){
var sort_arr=groupByNumber[i].sort(compare)
new_data.push(sort_arr[0])
}
console.log(new_data)
function compare(a, b) {
let comparison = 0;
if (a.unix_date > b.unix_date) {
comparison = 1;
} else if (a.unix_date < b.unix_date) {
comparison = -1;
}
return comparison;
}
function groupBy(xs, key) { //group by key
return xs.reduce(function(rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
};
Maybe it can be more elegant
UPDATE 2
@miroslav-glamuzina give more elegance way:
let filtered = data.reduce((acc, item) => {
if (!acc.some((e, i) => {
if (item.number === e.number) {
if (item.unix_date < e.unix_date) {
acc.splice(i, 1, item);
}
return true;
}
})) {
acc.push(item);
}
return acc;
}, []);