как правильно сформировать массив по определенным ключам JS
У меня есть массив.
[
{
headerName: 'name1',
field: 'name1',
id = 1
},
{
headerName: 'name2',
field: 'name2',
id = 2
},
{
headerName: 'name3',
field: 'name3',
id = 2
},
{
headerName: 'name4',
field: 'name4',
id = 1
},
{
headerName: 'name5',
field: 'name5',
id = 2
}
]
Определенно у меня встречаются одинаковый ключ id, как можно сгруппировать по id, в результате получив несколько массивов в зависимости от количества разных id
[
{
headerName: 'name1',
field: 'name1',
id = 1
},{
headerName: 'name4',
field: 'name4',
id = 1
}
],
[
{
headerName: 'name2',
field: 'name2',
id = 2
},
{
headerName: 'name3',
field: 'name3',
id = 2
},
{
headerName: 'name5',
field: 'name5',
id = 2
}
]
Пробую реализовать через reduce, получается полная неразбериха, уже запутался.
const result = arr.reduce((acc, obj) => {
let index = acc.findIndex((elm) => {return elm.id == obj.id});
if(index == -1){ return acc.concat(Object.assign({}, obj) };
return acc
}, [])
Ответы (4 шт):
Автор решения: ΝNL993
→ Ссылка
Что-то типа такого?:
const input = [
{
headerName: 'name1',
field: 'name1',
id: 1
},
{
headerName: 'name2',
field: 'name2',
id: 2
},
{
headerName: 'name3',
field: 'name3',
id: 2
},
{
headerName: 'name4',
field: 'name4',
id: 1
},
{
headerName: 'name5',
field: 'name5',
id: 2
}
]
function sortById(arr) {
let output = []
for (let e of arr) {
if(output.some(r => r[0].id === e.id)) {
output.filter(r => r[0].id === e.id)[0].push(e)
} else {
output.push([e])
}
}
return output
}
console.log(sortById(input))
Автор решения: Ein
→ Ссылка
let arr = [
{
headerName: 'name1',
field: 'name1',
id: 1
},
{
headerName: 'name2',
field: 'name2',
id: 2
},
{
headerName: 'name3',
field: 'name3',
id: 2
},
{
headerName: 'name4',
field: 'name4',
id: 1
},
{
headerName: 'name5',
field: 'name5',
id: 2
}
];
let result = arr.reduce((all, el) => {
// проверяем есть ли в объекте массив под нужым id
// если нет, кладём пустой массив
all[el.id] = all[el.id] || [];
// кладём элемент в массив
all[el.id].push(el);
return all;
}, {});
// достаём из объекта масивы с элементами
result = Object.values(result);
console.log(result);
Автор решения: Dmitry Kozlov
→ Ссылка
Сначала преобразуем в объект, где ключами будет id, потом объект преобразуем в массив, перебирая ключи
const sourceArray = [
{
headerName: 'name1',
field: 'name1',
id: 1
},
{
headerName: 'name2',
field: 'name2',
id: 2
},
{
headerName: 'name3',
field: 'name3',
id: 2
},
{
headerName: 'name4',
field: 'name4',
id: 1
},
{
headerName: 'name5',
field: 'name5',
id: 2
}
];
// Преобразуем в объект, группируя по id
const destinationObject = {}
sourceArray.forEach((entry) => {
if (!destinationObject[entry.id]) {
destinationObject[entry.id] = [];
}
destinationObject[entry.id].push(entry);
});
console.log(destinationObject);
// Получаем массив сгруппированных записей
const destinationArray = [];
Object.keys(destinationObject).forEach((key) => {
destinationArray.push(destinationObject[key]);
});
console.log(destinationArray);
Автор решения: Sergey Glazirin
→ Ссылка
Можно преобразовать массив так
const arr = [{
headerName: 'name1',
field: 'name1',
id: 1
},
{
headerName: 'name2',
field: 'name2',
id: 2
},
{
headerName: 'name3',
field: 'name3',
id: 2
},
{
headerName: 'name4',
field: 'name4',
id: 1
},
{
headerName: 'name5',
field: 'name5',
id: 2
}
];
// получаем список уникальных id
const idArray = [...new Set(arr.map(item => item.id))];
// через метод map() преобразуем элементы массива в отфильтрованные по этому элементу массив
const result = idArray.map(id => arr.filter(item => item.id === id));
console.log(result);