Объединить объекты и поместить в массив - JavaScript / React - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть несколько объектов в массиве.Каждому из них назначен labelId.Если идентификатор метки совпадает, то мне нужно объединить объекты, поместив некоторые значения в массив нового объединенного объекта.

[
    {
        field: "legalName",
        isOpened: false,
        label: "Legal Name",
        labelId: 1,
        value: "John Doe"
    },
    {
        field: "homeAddress1",
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        value: "2343 Main Street"
    },
    {
        field: "homeAddress2",
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        value: "New York, NY"
    }
]

Как я хочу, чтобы это выглядело

[
    {
        isOpened: false,
        label: "Legal Name",
        labelId: 1,
        values:
            [
                {field: "legalName", value: "John Doe"}
            ]
    },
    {
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        values:
            [
                {field: "homeAddress1", value: "2343 Main Street"},
                {field: "homeAddress2", value: "New York, NY"}
            ]
    }
]

Я удаляю поле и значение из исходного объекта и помещаю его в массив значений для всех объектов, независимо от того,имеют одинаковый labelId.

Код до сих пор -

personalInfoArray.forEach(info => {
    personalInfoArray.forEach(info2 => {
        if ((info.labelId === info2.labelId) && (info.field !== info2.field)) {
            info.values = [
                {field: info.field, value: info.value},
                {field: info2.field, value: info2.value}
            ]

        }
    })
})

Я перебираю один и тот же массив дважды, чтобы определить, имеет ли объект одинаковый labelId, в случае успеха - создать массив.Проблема в том, что я не удаляю свойства, а другой объект все еще существует.Если у них нет одинакового labelId, ничего не происходит.

Спасибо

1 Ответ

0 голосов
/ 26 ноября 2018

Это подход, использующий функцию Array.prototype.reduce для группировки объекта по labelId и функцию Object.values для извлечения сгруппированных объектов.

let arr = [{    field: "legalName",    isOpened: false,    label: "Legal Name",    labelId: 1,    value: "John Doe"  },  {    field: "homeAddress1",    isOpened: false,    label: "Home Address",    labelId: 2,    value: "2343 Main Street"  },  {    field: "homeAddress2",    isOpened: false,    label: "Home Address",    labelId: 2,    value: "New York, NY"  }],
    result = Object.values(arr.reduce((a, {labelId, field, isOpened, label, value}) => {
      (a[labelId] || (a[labelId] = {isOpened, label, labelId, values: []})).values.push({field, value});
      return a;
    }, Object.create(null)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...