Задать вопрос
@lexstile

Как из двух массивов объектов сделать один, объединив элементы с одинаковыми id?

Есть два массива:

const ListA = [
    {
        id: 234324, // равен ListB[0].uid
        a: 111,
    },
    {
        id: 123213,
        a: 222,
    },
    {
        id: 4565465, // равен ListB[1].uid
        a: 333,
    },
];

const ListB = [
    {
        uid: 234324, // равен ListA[0].id
        b: 111,
    },
    {
        uid: 4565465, // равен ListA[2].id
        b: 222,
    },
    {
        uid: 33243,
        b: 333,
    },
];

Нужно получить новый массив, если id элемента первого массива совпадает с uid элемента второго, эти элементы следует объединить в один:

const ListAB = [
    {
        id: 234324,
        a: 111,
        b: 111, // добавляем из второго массива с id === uid
    },
    {
        id: 4565465,
        a: 333,
        b: 222, // добавляем из второго массива с id === uid
    },
    {
        id: 123213,
        a: 222,
    },
    {
        id: 33243, // меняем имя свойства uid на id
        b: 333,
    },
];
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
  • Skypro
    JavaScript-разработчик с нуля
    9 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const idsA = new Set(ListA.map(n => n.id));
const objB = Object.fromEntries(ListB.map(({ uid, ...n }) => [ uid, (n.id = uid, n) ]));
const ListAB = ListA.map(n => ({ ...n, ...objB[n.id] }));
ListB.forEach(({ uid }) => idsA.has(uid) || ListAB.push(objB[uid]));

или

const ListAB = [...ListB.reduce((acc, { uid: id, ...n }) => {
  Object.assign(acc.set(id, acc.get(id) || { id }).get(id), n);
  return acc;
}, new Map(ListA.map(n => [ n.id, {...n} ]))).values()];
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы