Разбить массив объектов на подмассивы JS
Господа знатоки помогите с задачей. Дан массив
let persons = [
{name : "Mike" , age : 13},
{name : "Aron" , age : 27},
{name : "Mike" , age : 30},
{name : "Aron" , age : 20},
{name : "Aron" , age : 100},
{name : "Mike" , age : 80},
{name : "Nick" , age : 45}
];
мне нужно его разбить на подмассивы на выходе должно получится
[{name: 'Mike', age: 13}, {name: 'Mike', age: 30}, {name: 'Mike', age: 80}]
[{name: 'Aron', age: 27}, {name: 'Aron', age: 20}, {name: 'Aron', age: 100}]
[{name : "Nick" , age : 45}]
Ответы (3 шт):
Автор решения: entithat
→ Ссылка
let persons = [{
name: "Mike",
age: 13
},
{
name: "Aron",
age: 27
},
{
name: "Mike",
age: 30
},
{
name: "Aron",
age: 20
},
{
name: "Aron",
age: 100
},
{
name: "Mike",
age: 80
},
{
name: "Nick",
age: 45
}
];
console.log(
persons.reduce((a, c) => {
let idx = a.findIndex(e => e[0].name === c.name);
if (idx !== -1) a[idx].push(c);
else a.push([c]);
return a;
}, [])
);
Автор решения: vsemozhebuty
→ Ссылка
Ещё вариант, при больших массивах может быть быстрее за счёт того, что не нужно обыскивать создаваемый массив, но это нужно проверять (промежуточная структура и её преобразование могут скушать память и время, так что выигрыша может и не быть). Ещё одно различие в том, что тут создаются копии элементов, но это может быть и не нужно)
let persons = [
{name : "Mike" , age : 13},
{name : "Aron" , age : 27},
{name : "Mike" , age : 30},
{name : "Aron" , age : 20},
{name : "Aron" , age : 100},
{name : "Mike" , age : 80},
{name : "Nick" , age : 45}
];
const persons2 = Object.values(persons.reduce(
(acc, person) => {
const name = person.name;
acc[name] ??= [];
acc[name].push({ ...person });
return acc;
},
{},
));
console.log(persons2);
Автор решения: Pavel Nazarian
→ Ссылка
let persons = [
{name : "Mike" , age : 13},
{name : "Aron" , age : 27},
{name : "Mike" , age : 30},
{name : "Aron" , age : 20},
{name : "Aron" , age : 100},
{name : "Mike" , age : 80},
{name : "Nick" , age : 45}
];
let result = []
let names = Array.from(new Set(persons.map(el => el.name )))
names.forEach((el, index) =>{
result[index] = persons.filter(elem => elem.name == el )
})
console.log(result)