Добавить уникальные объекты в массив объектов в Javascript - PullRequest
0 голосов
/ 12 октября 2018

У меня есть массивы объектов, которые выглядят так:

const array1 = [{id: 1, name: "John"}, {id: 2, name: "Mary"}]

const array2 = [{id: 1, name: "John"}, {id: 3, name: "Phil"}, {id: 4, name: "Sarah"}]

Как добавить уникальные объекты из array2 to array1, чтобы они выглядели так:

const array1 = [{id: 1, name: "John"}, {id: 2, name: "Mary"}, {id: 3, name: "Phil"}, {id: 4, name: "Sarah"}]

Реализации Lodashразрешенный.Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Используя встроенные функции массива, вы можете получить желаемый результат следующим образом:

  • Конкатировать сначала оба массива, используя .concat()
  • Используйте .reduce() для создания результирующего объекта, имеющего идентификаторыв качестве ключей и значений, как соответствующий объект.Если объект уже добавлен, пропустите остальные с такими же идентификаторами.
  • Используйте Object.values(), чтобы получить массив объектов из результирующего объекта.

Демо:

const array1 = [{id: 1, name: "John"}, {id: 2, name: "Mary"}],
      array2 = [{id: 1, name: "John"}, {id: 3, name: "Phil"}, {id: 4, name: "Sarah"}];

const result = Object.values(
    array1.concat(array2).reduce((r, c) => (r[c.id] = r[c.id] || c, r),  {})
);
                   
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 12 октября 2018

Вы также можете сделать это в одну строку через собственный Объект карты и уменьшить :

const arr1 = [{id: 1, name: "John"}, {id: 2, name: "Mary"}]
const arr2 = [{id: 1, name: "John"}, {id: 3, name: "Phil"}, {id: 4, name: "Sarah"}]

const result = [...[...arr1, ...arr2]
   .reduce((r, c) => (r.set(c.id, c), r), new Map()).values()]

console.log(result)
0 голосов
/ 12 октября 2018

Вы можете использовать функцию _. UnionBy () для объединения уникальных объектов из массивов.

const array1 = [{id: 1, name: "John"}, {id: 2, name: "Mary"}];

const array2 = [{id: 1, name: "John"}, {id: 3, name: "Phil"}, {id: 4, name: "Sarah"}];


console.log(_.unionBy(array1, array2, 'id'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...