JavaScript: удаление дублей
удаляем дубли в списке с помощью JavaScript

Допустим, Вы получили перечень контактов, некоторые из которых могут дублироваться. Необходимо получить список, включающий только уникальные контакты (адреса электронной почты).
const contacts = [
{ name: "Mandy", email: "mandy@email.com" },
{ name: "Alysse", email: "alice@email.com" },
{ name: "Mandi", email: "mandy@email.com" },// Duplicate
];
const nbaContacts = [
{ name: "Lebron", personal_email: "lebron@email.com" },
{ name: "Irving", personal_email: "irving@email.com" },
{ name: "Levron", personal_email: "lebron@email.com" }, //duplicate
]
Создадим функцию removeDuplicates
, в которой с помощью метода map
соберем в массив emails
все электронные адреса из полей email
(массив contacts
) и personal_email
(массив nbaContacts
). После этого с помощью new Set(emails)
избавимся от дублей, создадим новый массив contacts
и, перебрав значения uniqueEmails.forEach
заполним его только уникальными значениями.
function removeDuplicates(elements: Array<any>, key: string) {
let emails = elements.map(p => p[key]);
let uniqueEmails = Array.from(new Set(emails));
let contacts = [];
uniqueEmails.forEach((value) => {
let contact = elements.find(p => p[key] === value);
uniqueContacts.push(contact)
})
return contacts
}
В приведенном выше варианте применены распространенные конструкции: map
, Set()
, foreach
.
Но есть и другой, более продвинутый способ.
Теперь объявим uniqueEmails
, который будет содержать только уникальные значения. Затем с помощью фильтрации переберем элементы входящего массива, используя elm[key]
для получения правильного значения. Если в uniqueEmails
адрес отсутствует (!uniqueEmails.has(value))
, он попадает в массив, а фильтр возвращает true
. В противном случае возвращается false
, указывающий на необходимость удаления элемента.
function removeDuplicates(elements: Array<any>, key: string) {
const uniqueEmails = new Set();
return elements.filter(elm => {
const value = elm[key];
const isDuplicate = !uniqueEmails.has(value);
uniqueEmails.add(value);
return !isDuplicate;
});
}
Еще больше информации о методе map
читайте на MDN.
Спасибо за внимание.