Lodash — Как объединить два массива объектов на основе ключа?

#javascript #typescript #lodash

#javascript #typescript #Lodash

Вопрос:

Я пытаюсь объединить два массива объектов с помощью Lodash. У меня есть эти два массива, и я использую оператор concat таким образом:

  var array1 = [{ id: 1, name: 'doc1' }, { id: 2, name: 'doc2' }];
 var array2 = [{id:1, name:'doc1'}, {id:3, name:'doc3'}, {id:4, name:'doc4'}];

 var array3 = _.concat(array1, array2);
  

Я хотел бы получить такой массив

  [{id:1, name:'doc1'}, {id:2, name:'doc2'}, {id:3, name:'doc3'}, {id:4, name:'doc4'}]]
  

Но с помощью функции concat я получаю такой массив:

   [{ id: 1, name: 'doc1' }, { id: 1, name: 'doc1' }, { id: 2, name: 'doc2' }, { id: 3, name: 'doc3' }, { id: 4, name: 'doc4' }]]
  

Я хочу избежать повторения объекта с тем же идентификатором…Какой оператор я могу использовать?

Ответ №1:

Вы можете получить результат, используя merge keyBy функции и Lodash .

 var array1 = [{id:1, name:'doc1'}, {id:2, name:'doc2'}];
var array2 = [{id:1, name:'doc1'}, {id:3, name:'doc3'}, {id:4, name:'doc4'}];

var merged = _.merge(_.keyBy(array1, 'id'), _.keyBy(array2, 'id'));
var values = _.values(merged);
console.log(values);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>  

Ответ №2:

Используется _.unionBy() для объединения двух массивов и удаления дубликатов, имеющих одно и то же уникальное поле ( id в данном случае). Методы объединения Lodash создают массив уникальных значений. _.unionBy() Метод принимает итерацию, которая вызывается для каждого элемента каждого массива для генерации критерия, по которому вычисляется уникальность.

 const array1 = [{id:1, name:'doc1'}, {id:2, name:'doc2'}];
const array2 = [{id:1, name:'doc1'}, {id:3, name:'doc3'}, {id:4, name:'doc4'}];

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

Ответ №3:

У вас есть uniqWith в Lodash, который позволяет вам это сделать: https://lodash.com/docs#uniqWith

 var array1 = [{id:1, name:'doc1'}, {id:2, name:'doc2'}];
var array2 = [{id:1, name:'doc1'}, {id:3, name:'doc3'}, {id:4, name:'doc4'}];

var values = _.uniqWith([...array1, ...array2], _.isEqual);
console.log(values);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>