Как найти дубликаты в массиве
Короткий ответ
Элемент — дубликат, если он уже встречался раньше. Два объекта Set хранят увиденное и повторы:
const items = ['a', 'b', 'a', 'c', 'b', 'a'];
const seen = new Set();
const duplicates = new Set();
for (const item of items) {
if (seen.has(item)) duplicates.add(item);
seen.add(item);
}
console.log([...duplicates]);Результат:
[
"a",
"b"
]Через filter
Короче: оставьте элементы, у которых первая позиция отличается от текущей:
const items = [1, 2, 3, 2, 4, 1];
const duplicates = items.filter((item, index) => items.indexOf(item) !== index);
console.log([...new Set(duplicates)].join(', '));Результат:
2, 1По полю объекта
Для объектов сравнивайте поле, которое должно быть уникальным:
const users = [
{ email: 'anna@example.com' },
{ email: 'oleg@example.com' },
{ email: 'anna@example.com' },
];
const seen = new Set();
const repeated = users.filter((user) => seen.has(user.email) || !seen.add(user.email));
console.log(repeated.map((user) => user.email).join(', '));Результат:
anna@example.comЧастая ошибка
Способ с filter() без итогового Set возвращает значение столько раз, сколько оно повторяется:
const items = [1, 1, 1];
console.log(items.filter((item, index) => items.indexOf(item) !== index).join(', '));Результат:
1, 1Функции из этого ответа
- Array.prototype.filter — Создаёт новый массив из элементов, прошедших проверку.
- Array.prototype.indexOf — Ищет значение в массиве и возвращает его индекс.
- Set — Коллекция уникальных значений.