Попробуйте использовать reduce
метод для группировки по date
свойству:
let arr = [
{ id: 222, date: 'apr 1', todo: 'nothing' },
{ id: 222, date: 'apr 2', todo: '' },
{ id: 222, date: 'apr 3', todo: 'swim' },
{ id: 222, date: 'apr 4', todo: 'run' },
{ id: 222, date: 'apr 1', todo: '' },
{ id: 222, date: 'apr 2', todo: 'jump' },
{ id: 222, date: 'apr 3', todo: '' },
{ id: 222, date: 'apr 4', todo: '' }
];
const result = arr.reduce((a, { id, date, todo}) => {
a[date] = a[date] || { id, date, todo};
if (a[date].todo.length === 0 )
a[date].todo = todo;
return a;
}, {})
console.log(Object.values(result));
или вы можете хранить все todo
в массиве:
const result = arr.reduce((a, { id, date, todo}) => {
a[date] = a[date] || { id, date, todo:[]};
a[date].todo.push(todo);
return a;
}, {})
ОБНОВЛЕНИЕ:
Обновлено вывод:
let arr = [
{ id: 222, date: 'apr 1', todo: 'nothing' },
{ id: 222, date: 'apr 2', todo: '' },
{ id: 222, date: 'apr 3', todo: 'swim' },
{ id: 222, date: 'apr 4', todo: 'run' },
{ id: 222, date: 'apr 1', todo: '' },
{ id: 222, date: 'apr 2', todo: 'jump' },
{ id: 222, date: 'apr 3', todo: '' },
{ id: 222, date: 'apr 4', todo: '' }
];
const result = arr.reduce((a, { id, date, todo}) => {
a[id] = a[id] || { id };
let key = date.split(' ').pop();
a[id]['date' + key] = date;
a[id]['todo' + key] = (todo.length > 0) ? todo : a[id]['todo' + key];
return a;
}, {})
console.log(Object.values(result));
ОБНОВЛЕНИЕ 1:
let arr = [
{ id: 222, date: 'apr 1', todo: 'nothing' },
{ id: 222, date: 'apr 2', todo: '' },
{ id: 222, date: 'apr 3', todo: 'swim' },
{ id: 222, date: 'apr 4', todo: 'run' },
{ id: 222, date: 'apr 1', todo: '' },
{ id: 222, date: 'apr 2', todo: 'jump' },
{ id: 222, date: 'apr 3', todo: '' },
{ id: 222, date: 'apr 4', todo: '' }
];
const groupedById = Object.values(arr.reduce((a, { id, date, todo}) => {
a[id] = a[id] || { id };
a[id][date] = a[id][date] || {date};
if (todo.length > 0 && !a[id][date]['todo'])
a[id][date]['todo'] = todo;
return a;
}, {}));
const result = groupedById.reduce((a, {id, ...rest})=> {
let count = 0;
for (const key in rest) {
count++;
a['date' + count] =rest[key].date;
a['todo' + count] =rest[key].todo;
}
a[id] = id;
return a;
}, {})
console.log(result);