Как можно сгруппировать объекты по общему свойству, если такое есть?
У меня приходит масив с объектами:
const arr = [
{
prop1: 'test-1',
propText: 'test'
},
{
prop1: 'test-2',
propText: 'test'
},
{
prop1: 'test-3',
propText: 'test'
},
{
prop1: 'test-4',
propText: 'test'
},
{
prop1: 'test-5',
propText: 'test'
},
{
prop1: 'test-6'
},
{
prop1: 'test-7'
},
{
prop1: 'test-8'
},
{
prop1: 'test-9',
propText: 'test 2'
},
{
prop1: 'test-10',
propText: 'test 2'
}
]
Как можно его промапить что бы получить на выходе объект с сгруппированными объектами по общему свойству и с сохранением порядка, если такое свойство null/undefined то возвращать просто объект :
const resultObj = {
test: {
1: {
prop1: 'test-1',
propText: 'test'
},
2: {
prop1: 'test-2',
propText: 'test'
},
3: {
prop1: 'test-3',
propText: 'test'
},
4: {
prop1: 'test-4',
propText: 'test'
},
5: {
prop1: 'test-5',
propText: 'test'
}
},
6: {
prop1: 'test-6'
},
7: {
prop1: 'test-7'
},
8: {
prop1: 'test-8'
},
test2: {
9: {
prop1: 'test-9',
propText: 'test2'
},
10: {
prop1: 'test-10',
propText: 'test2'
}
}
}
Я проюовал группировать через reduce, но не получаеться возвращать объект если его не нужно группировать:
arr.reduce((objectsByKeyValue, obj) => {
const value = obj['propText'];
if(value) {
objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj);
}, {});
Ответы (1 шт):
Автор решения: vp_arth
→ Ссылка
Ключи объекта никогда не гарантировали порядок. Это unsorted hashmap.
Так что сохранить порядок, не меняя структуры не выйдет.
const arr = [{prop1: 'test-1', propText: 'test'}, {prop1: 'test-2', propText: 'test'}, {prop1: 'test-3', propText: 'test'}, {prop1: 'test-4', propText: 'test'}, {prop1: 'test-5', propText: 'test'}, {prop1: 'test-6'}, {prop1: 'test-7'}, {prop1: 'test-8'}, {prop1: 'test-9', propText: 'test 2'}, {prop1: 'test-10', propText: 'test 2'} ];
let id = 0;
const res = arr.reduce((acc, el) => {
if (el.propText) {
if (!acc[el.propText]) acc[el.propText] = {};
acc[el.propText][++id] = el;
} else {
acc[++id] = el;
}
return acc;
}, {});
console.log(res);