Если filter1Prop всегда совпадает со значением соответствующего filter1ID, а filter2Prop всегда совпадает со значением соответствующего filter2ID,
У меня есть массив объектов со следующей структурой:
[{
filter1ID: 'FLTR1ID1',
filter1Prop: 'Property 1',
filter2ID: 'FLTR2ID1',
filter2Prop: 'Property 2',
},
{
filter1ID: 'FLTR1ID1',
filter1Prop: 'Property 1',
filter2ID: 'FLTR2ID2',
filter2Prop: 'Property 3',
}]
Это необходимо преобразовать, чтобы получить массив объектов со следующей структурой (дублирующиеся свойства объединяются):
[{
id: 'FLTR1ID1',
prop: 'Property 1',
filter2: [
{
id: 'FLTR2ID1',
prop: 'Property 2',
},
{
id: 'FLTR2ID2',
prop: 'Property 3',
},
],
}]
Я добился этого с помощью Array.prototype.reduce (), а затемКарта значений выходного объекта выглядит следующим образом:
const rowsToObject = rows => Object.values(rows.reduce((map, obj) => {
map[obj.filter1ID] = map[obj.filter1ID] || {
id: '',
prop: '',
filter2: {},
};
const filter1 = map[obj.filter1ID];
filter1.id = obj.filter1ID;
filter1.prop = obj.filter1Prop;
filter1.filter2[obj.filter2ID] = filter1.filter2[obj.filter2ID] || {
id: '',
prop: '',
};
const filter2 = filter1.filter2[obj.filter2ID];
filter2.id = obj.filter2ID;
filter2.prop = obj.filter2Prop;
return map;
}, Object.create(null))).map(result => ({
...result,
filter2: Object.values(result.filter2),
}));
Мне бы хотелось, чтобы я мог обрабатывать каждую запись из входного массива только один раз.
Есть ли способ избежать использования Array.prototype.map () в конце без необходимости выполнять операции поиска в массиве filter2?