Создать новый объект из огромного массива объектов - PullRequest
0 голосов
/ 23 апреля 2020

Я получаю огромный массив с сервера (содержит более 2000 объектов). структура этого массива выглядит следующим образом:

const arr = [
{code: 'A', text:'blabla', codeParent:'-'},
{code: 'B', text:'blabla', codeParent:'-'},
{code: 'C', text:'blabla', codeParent:'-'},
{code: 'D', text:'blabla', codeParent:'-'},
{code: '01', text:'blabla', codeParent:'B'},
{code: '02', text:'blabla', codeParent:'C'},
{code: '03', text:'blabla', codeParent:'D'},
{code: '04', text:'blabla', codeParent:'A'},
{code: '05', text:'blabla', codeParent:'A'},
{code: '06', text:'blabla', codeParent:'B'},
...
]

Объект, который я хочу создать, выглядит следующим образом:

const obj = {
A: [array of all object with codeParent 'A'],
B: [array of all object with codeParent 'B'],
C: [array of all object with codeParent 'C'],
D: [array of all object with codeParent 'D']
}

Кто-нибудь знает лучший способ получить этот результат?

1 Ответ

1 голос
/ 23 апреля 2020

Предполагая пару вещей о вашем выводе, которые не совсем понятны из вашего объяснения, но, похоже, имеют место из вашего примера вывода:

  1. Вывод сопоставляется свойством codeParent
  2. Вы пропускаете элементы, которые имеют codeParent: '-'

Затем вы можете просто перебирать большой массив и заполнять выходной объект, как go:

let result = {};
for (item of arr) {
    let parent = item.codeParent;
    if (parent !== '-') {
        let destArray = obj[parent];
        // if no array yet for this code, create one
        if (!destArray) {
           destArray = [];
           obj[parent] = destArray;
        }
        // add the new item to the destination array
        destArray.push(item);
    }
}
console.log(result);

Некоторые люди предпочитают использовать .reduce() для этого:

let result = arr.reduce((obj, item) => {
    let parent = item.codeParent;
    if (parent !== '-') {
        let destArray = obj[parent];
        // if no array yet for this code, create one
        if (!destArray) {
           destArray = [];
           obj[parent] = destArray;
        }
        // add the new item to the destination array
        destArray.push(item);
    }
    return obj;    
}, {});

Обратите внимание, что у каждого l oop есть немного больше кода, потому что я пытаюсь только поискать obj[item.codeParent] один раз для каждой итерации, а не несколько раз, а также пытаться найти только свойство codeParent в item.codeParent один раз. Вы могли бы сделать это с меньшим количеством кода, подобного этому, и немного менее эффективным:

let result = arr.reduce((obj, item) => {
    if (item.codeParent !== '-') {
        if (!obj[item.codeParent]) {
            obj[item.codeParent] = [];
        }
        obj[item.codeParent].push(item);
    }
    return obj;    
}, {});

Обратите внимание, что это выглядит obj[item.codeParent] 2 или 3 раза в каждой итерации, тогда как предыдущие две версии ищут его 1 или 2 раза .

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