yuumatov
@yuumatov
FrontEnd разработчик, минималист

Как сформировать массив объектов исходя из 2-х других массивов объектов?

Есть 2 массива объектов.
Первый (данные пришли с бека):

[
    {
        "id": 55,
        "name": "region",
        "value": "1",
    },
    {
        "id": 56,
        "name": "age",
        "value": "2",
    }
]

Второй (данные которые мы добавили или изменили на клиенте):

[
    {
        "name": "range",
        "value": "Год"
    },
    {
        "name": "region",
        "value": "11"
    },
    {
        "name": "age",
        "value": "22"
    }
]

Нужно дополнить второй массив объектов, данными (добавить параметр ID объекту) из первого, чтобы получилось так:

[
    {
        "name": "range",
        "value": "Год"
    },
    {
        "id": 55,
        "name": "region",
        "value": "11"
    },
    {
        "id": 56,
        "name": "age",
        "value": "22"
    }
]
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Сначала из первого массива сделаем объект, где значениями будут его элементы, а ключами - значения их, элементов, свойства name:

const obj1 = Object.fromEntries(arr1.map(n => [ n.name, n ]));

Затем можно собрать новый массив:

const newArr2 = arr2.map(n => ({ ...obj1[n.name], ...n }));

Или обновить существующий:

arr2.forEach(n => {
  const obj = obj1[n.name];
  if (obj) {
    n.id = obj.id;
  }
});

UPD. Вынесено из комментариев:

можно ли исключить объекты у которых не изменился value? То есть что бы этих объектов не было в итоговом массиве.

const newArr2 = arr2.reduce((acc, n) => (
  obj1[n.name]?.value !== n.value && acc.push({ ...obj1[n.name], ...n }),
  acc
), []);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
GreyCrew
@GreyCrew
Full-stack developer
Есть ещё вариант:

const combinedArray = [
    ...array2,
    ...array1.filter(a1 => !array2.some(a2 => a2.name === a1.name))
].map(obj => ({
    ...obj,
    ...(array1.find(a1 => a1.name === obj.name) || {})
}));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы