Сделать из массива объектов массив массивов с уникальными значениями (объекты) на js
Есть массив объектов такого плана (для примера такой простенький):
let array = [
{ name: '1' },
{ name: '2' },
{ name: '4' },
{ name: '2' },
{ name: '3' },
{ name: '1' },
];
И на выходе нужно получить массив массивов такого плана:
result = [
[{ name: '1' }, { name: '1' }],
[{ name: '2' }, { name: '2' }],
[{ name: '3' }],
[{ name: '4' }]
];
То есть для одинаковых объектов (полная копия) создавать новый массив и туда их пушить.
С числами такое работает вот так у меня:
let result = [];
let array = [4,1,3,3,2,4];
array. forEach(function (a) {
a in this || result.push(this[a] = [])
this[a].push(a);
}, Object.create(null)); // [[4, 4], [1], [3, 3], [2]]
А вот с объектами не получается их вот так сгруппировать. Подскажите, как можно это реализовать?
Ответы (3 шт):
Автор решения: entithat
→ Ссылка
Группируем по ключу key. Смотрим есть ли объект с таким ключем в массиве и делаем вывод: либо добавить по индексу, либо в конец.
let array = [
{ name: '1' },
{ name: '2' },
{ name: '4' },
{ name: '2' },
{ name: '3' },
{ name: '1' },
];
const key = 'name';
console.log(
array.reduce((a,c) => {
const idx = a.findIndex(e => e.length > 0 && e[0][key] === c[key]);
return idx !== -1 ? (a[idx].push(c), a) : (a.push([c]), a);
}, [])
);
Автор решения: vsemozhebuty
→ Ссылка
Если набор ключей непредсказуем, но объекты совместимы с JSON, можно так:
let array = [
{ name: '1' },
{ name: '2' },
{ name: '4' },
{ name: '2' },
{ name: '3' },
{ name: '1' },
];
const result = Object.values(array.reduce(
(acc, item) => {
const id = JSON.stringify(item);
acc[id] ??= [];
acc[id].push(item);
return acc;
},
{},
));
console.log(result);
Автор решения: Artyom.Evsyukov
→ Ссылка
let array = [
{ name: "1" },
{ name: "2" },
{ name: "4" },
{ name: "2" },
{ name: "3" },
{ name: "1" },
];
let result = [];
array.forEach(function (obj) {
const name = obj.name;
name in this || result.push((this[name] = []));
this[name].push(obj);
}, Object.create(null));
console.log(result);