@SoffTeam

Объединить объекты в нескольких массивах по общему ключу?

Есть массив со следующими объектами:

[
 { "_id": 1, "one": 7, "two": 5 },
 { "_id": 2, "one": 6, "two": 3 },
 { "_id": 3, "one": 4, "two": 7 },
 { "_id": 4, "one": 15, "two": 2 }
]


Есть меньший массив с большим кол-вом дополнительных данных, объекты совпадают ключами _id:

[
 { "_id": 1, "next": 22, "gen": 54 },
 { "_id": 3, "next": 6, "gen": 3 }
]


Требуется добавить данные из объектов 2го массива в объекты 1го. Если совпадения _id нет, то значения указать 0

Итоговый требуемый массив выглядит так:
[
 { "_id": 1, "one": 7, "two": 5, "next": 22, "gen": 54  },
 { "_id": 2, "one": 6, "two": 3, "next": 0, "gen": 0 },
 { "_id": 3, "one": 4, "two": 7, "next": 6, "gen": 3 },
 { "_id": 4, "one": 15, "two": 2, "next": 0, "gen": 0 }
]
  • Вопрос задан
  • 245 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Из малого сделать "словарь", где ключ _id (чтобы удобнее искать). Пройти по большому массиву, дописывая дефолтные поля с нулями. Если в "словаре" нашёлся соотв. id, то взять поля из него:
const arrBig = [
  { _id: 1, one: 7, two: 5 },
  { _id: 2, one: 6, two: 3 },
  { _id: 3, one: 4, two: 7 },
  { _id: 4, one: 15, two: 2 },
];

const arrSmall = [{ _id: 1, next: 22, gen: 54 }, { _id: 3, next: 6, gen: 3 }];

const key = '_id';
const dictSmall = arrSmall.reduce((acc, c) => {
  acc[c[key]] = c;
  return acc;
}, {});

const template = { next: 0, gen: 0 };
const addKeys = Object.keys(template);

const result = arrBig.map(item => {
  const nuItem = { ...item, ...template };
  const addendum = dictSmall[item[key]];
  if (addendum) {
    addKeys.forEach(key => (nuItem[key] = addendum[key]));
  }
  return nuItem;
});
/* [
  {"_id":1,"one":7,"two":5,"next":22,"gen":54},
  {"_id":2,"one":6,"two":3,"next":0,"gen":0},
  {"_id":3,"one":4,"two":7,"next":6,"gen":3},
  {"_id":4,"one":15,"two":2,"next":0,"gen":0}
] */
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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