let arr_of_obj = [{
emp_name: 'Mark',
date: new Date('2018/05/01')
},
{
emp_name: 'Mark',
date: new Date('2018/05/02')
},
{
emp_name: 'John',
date: new Date('2018/04/05')
},
{
emp_name: 'John',
date: new Date('2018/03/22')
},
{
emp_name: 'Mark',
date: new Date('2018/05/06')
}
];
console.log('initial array', arr_of_obj);
const max_items = arr_of_obj.map((o, i) => {
return {
ord: i,
emp_name: o.emp_name,
date: o.date
};
}).sort((a, b) => b.date - a.date).reduce((l, r) => {
if (!Array.isArray(l)) {
if (l.emp_name === r.emp_name) return l.date > r.date ? [l] : [r];
return [l, r];
}
const last = l.slice(-1)[0];
if (last.emp_name === r.emp_name) {
if (last.date < r.date) l[l.length - 1] = r;
} else l.push(r);
return l;
});
max_items.forEach(o => arr_of_obj[o.ord] = {
emp_name: o.emp_name,
date: o.date,
max: true
});
console.log('max items', max_items);
console.log('updated array', arr_of_obj);
Создает второй массив, который содержит только элементы max, вместе с их исходным индексом массива.
[
{ ord: 4, emp_name: 'Mark', date: 2018-05-06T07:00:00.000Z },
{ ord: 2, emp_name: 'John', date: 2018-04-05T07:00:00.000Z }
]
Наконец, выполните итерацию по нему и обновите массивиндексы в исходном массиве.Это сохраняет порядок оригинала.Я бы также рекомендовал разбить функцию Reduction на отдельную функцию для удобства чтения, но она работает для этого примера.