Удалить дубликаты из массива объектов в JavaScript

Удалить дубликаты из массива объектов в JavaScript

removeDuplicates () принимает массив объектов и возвращает новый массив без каких-либо дублирующих объектов (на основе свойства id).

 const allTests = [ {name: 'Test1', id: '1'}, {name: 'Test3', id: '3'}, {name: 'Test2', id: '2'}, {name: 'Test2', id: '2'}, {name: 'Test3', id: '3'} ]; function removeDuplicates(array) { let uniq = {}; return array.filter(obj ={amp}gt; !uniq[obj.id] {amp}amp;{amp}amp; (uniq[obj.id] = true)) } removeDuplicates(allTests); 

Ожидаемый результат:

 [ {name: 'Test1', id: '1'}, {name: 'Test3', id: '3'}, {name: 'Test2', id: '2'} ]; 

Сначала мы устанавливаем значение переменной uniq для пустого объекта.

Далее мы фильтруем массив объектов. Фильтр создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

 return array.filter(obj ={amp}gt; !uniq[obj.id] {amp}amp;{amp}amp; (uniq[obj.id] = true)); 

Выше мы используем функцию короткого замыкания {amp}amp;{amp}amp;. Если левая часть {amp}amp;{amp}amp; имеет значение true, тогда она возвращает значение справа от {amp}amp;{amp}amp;. Если левая сторона ложна, она возвращает то, что находится слева от {amp}amp;{amp}amp;.

Для каждого объекта (obj) мы проверяем uniq для свойства, называемого значением obj.id (в этом случае на первой итерации оно проверяет свойство ‘1’.) Мы хотим противоположность того, что возвращает (либо true или ложь) именно поэтому мы используем! в! uniq [obj.id]. Если uniq уже имеет свойство id, он возвращает true, что означает ложь (!), Указывающую функции фильтра НЕ добавлять этот объект. Однако, если он не находит свойство obj.id, он возвращает значение false, которое затем оценивается как true (!) И возвращает все справа от {amp}amp;{amp}amp; или (uniq [obj.id] = true). Это истинное значение, говорящее методу фильтра добавить obj к возвращаемому массиву, а также добавляет свойство {1: true} в uniq. Это гарантирует, что любой другой экземпляр obj с тем же идентификатором не будет добавлен снова.

§

Вот решение, использующее новую функцию фильтра JavaScript, которая довольно проста. Допустим, у вас есть такой массив.

Функция фильтра позволит вам создать новый массив, используя функцию обратного вызова один раз для каждого элемента в массиве. Таким образом, вы можете настроить уникальный массив следующим образом.

В этом случае ваш уникальный массив будет проходить через все значения в дублирующем массиве. Переменная elem представляет значение элемента в массиве (mike, james, james, alex), позиция — это позиция с 0 индексами в массиве (0,1,2,3 …) и duplicatesArray. Значение indexOf (elem) — это просто индекс первого вхождения этого элемента в исходном массиве. Итак, поскольку элемент ‘james’ дублируется, когда мы перебираем все элементы в duplicatesArray и помещаем их в uniqueArray, при первом обращении к james наше значение pos равно 1, а наш indexOf (elem) равно 1, так что Джеймса выталкивают в uniqueArray. Во второй раз, когда мы нажимаем на Джеймса, наше значение «pos» равно 2, а indexOf (elem) по-прежнему равен 1 (потому что он находит только первый экземпляр элемента массива), поэтому дубликат не передается. Поэтому наш uniqueArray содержит только уникальные значения.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector