Преобразование массива плоских данных во вложенный объект в Javascript - PullRequest
0 голосов
/ 22 сентября 2018

Если 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...