Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как найти дубликаты в массиве

Короткий ответ

Элемент — дубликат, если он уже встречался раньше. Два объекта 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 — Коллекция уникальных значений.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.