Сравните ключ в объекте в массиве с другим ключом в массиве объект в другом и объедините их вместе, если значения равны - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть два массива:

var array1 = [
  { id: 1, name: 'Name 1' },
  { id: 2, name: 'Name 2' },
  ...
];

var array2 = [
  { someId: '1', someField: 'Some Value 1' },
  { someId: '2', someField: 'Some Value 2' },
  ...
];

array1 будет иметь объекты, поступающие из бэкэнда партиями по 30. Как только я получу пакет, я извлекаю Ids из этого массива и вызываю другой API, чтобы получить array2 для этих идентификаторов.

В конце концов, я хочу такой массив:

var array3 = [
  { id: 1, name: 'Name 1', someOtherField: 'Some Value 1' },
  { id: 2, name: 'Name 2', someOtherField: 'Some Value 2' },
  ...
];

Я мог бы сделать что-то вроде этого:

ids = array1.map(item => item.id);
var resultingArray = array2.map((item, index) => {
  return array1[index].someOtherField = item.someField
});

Но так как у меня есть элементы array1 в пакетах, было бы трудно правильно поддерживать индексы.

Как мне это сделать?

Ответы [ 2 ]

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

Вы можете объединить оба массива и использовать Array.reduce() с некоторыми деструктурирующими , чтобы получить и id и someId как id, и хранить все в словаре(POJO).Мы получаем массив, используя Object.values() в словаре:

const array1 = [{ id: 1, name: 'Name 1' }, { id: 2, name: 'Name 2' }];

const array2 = [{ someId: '1', someField: 'Some Value 1' }, { someId: '2', someField: 'Some Value 2' }];

const result = Object.values(
  // combine both arrays
  [...array1, ...array2]
  // use destructuring to get someId/id as id, and the rest of objects' props
  .reduce((r, { someId, id = someId, ...rest }) => ({
    ...r, // spread the previous accumulator
    [id]: { id, ...r[id], ...rest } // add the current object, with the id, props, and previous data if any
  }), {})
);

console.log(result);
0 голосов
/ 08 ноября 2018

Создание таблицы поиска для array2 идентификаторов:

 const ids = new Map(array2.map(el => [el.id, /*to*/ el]));

Затем добавить данные из array1 так же просто, как:

 for(const el of array2) {
   if(ids.has(el.id)) {
      // Merge properties
     Object.assign(ids.get(el.id), el);
   } else {
     // Add to Map and array
     array1.push(el);
     ids.set(el.id, el);
  }
}
...