Как группировать массив данных в JavaScript
Есть массив данных в JavaScript. Надо группировать их по свойству. Например, есть массив сотрудников:
employees = [
{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 222,
name: 'Oleg',
salary: 3000,
date: '2020-01-01'
},
{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 333,
name: 'Anya',
salary: 3000,
date: '2020-01-02'
},
{
id: 444,
name: 'Arman',
salary: 5000,
date: '2020-01-01'
}
]
Теперь их надо группировать, типа:
obj = {
'2020-01-01' : {
111: {
"salary": 5000
},
}
}
Ответы (2 шт):
Автор решения: Андрей Солуянов
→ Ссылка
Если просто как получить подобную структуру. То можно так.Используя этот принцип можно в цикле перебрать все employees.Просто об этом в вопросе речь вроде не шла.
employees = [
{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 222,
name: 'Oleg',
salary: 3000,
date: '2020-01-01'
},
{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 333,
name: 'Anya',
salary: 3000,
date: '2020-01-02'
},
{
id: 444,
name: 'Arman',
salary: 5000,
date: '2020-01-01'
}
]
let date = employees[0].date;
let id = employees[0].id;
let salary = employees[0].salary;
obj = {
[date] : {
[id]: {
"salary": salary
},
}
}
console.log(obj)
Автор решения: renich
→ Ссылка
Если по двум параметрам группировать, то можно так. Если больше, то переписал бы в рекурсивное построение дерева с последующим заполнением.
let employees = [{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 222,
name: 'Oleg',
salary: 3000,
date: '2020-01-01'
},
{
id: 111,
name: 'Ivan',
salary: 5000,
date: '2020-01-01'
},
{
id: 333,
name: 'Anya',
salary: 3000,
date: '2020-01-02'
},
{
id: 444,
name: 'Arman',
salary: 5000,
date: '2020-01-01'
}
];
let groupResult = employees.reduce((obj, item) => {
obj[item.date] = obj[item.date] || {};
(obj[item.date][item.id] = obj[item.date][item.id] || []).push({
id: item.id,
name: item.name,
date: item.date,
salary: item.salary
});
return obj;
}, {});
console.log(groupResult);