PassFront
  1. PassFront
  2. База знаний
  3. Массивы и структуры данных

Как оставить в массиве уникальные значения?

Массивы и структуры данных

Уникальные значения в массиве оставляют через `new Set` (`[...new Set(arr)]`) — самый простой способ, или `filter` с проверкой первого вхождения.

Через Set (лучший способ)

Set хранит только уникальные значения:

const arr = [1, 2, 2, 3, 3, 3];
const unique = [...new Set(arr)]; // [1, 2, 3]
// или Array.from(new Set(arr))

Просто, эффективно (O(n)).

Через filter + indexOf

Оставить элемент, если его первое вхождение — текущий индекс:

const unique = arr.filter((item, index) => arr.indexOf(item) === index);

Работает, но O(n²) (indexOf внутри filter).

Через reduce

const unique = arr.reduce((acc, item) =>
  acc.includes(item) ? acc : [...acc, item], []);

Тоже O(n²).

Уникальность объектов по свойству

Set по ссылке не убирает дубли-объекты. По ключу — через Map:

const uniqueById = [
  ...new Map(users.map((u) => [u.id, u])).values()
];

Сравнение способов

  • `[...new Set(arr)]` — простейший, O(n), для примитивов. Рекомендуется.
  • filter + indexOf — O(n²), читаемо, но медленно на больших данных.
  • Map по ключу — для объектов (по id).

Нюанс с Set

Set использует SameValueZero: NaN считается равным NaN (в отличие от indexOf).

Коротко для собеседования

Уникальные значения: [...new Set(arr)] — простейший и эффективный (O(n), для примитивов) — рекомендуется. Альтернатива — filter((x, i) => arr.indexOf(x) === i) (O(n²)). Для объектов по свойству — через Map ([...new Map(arr.map(x => [x.id, x])).values()]). Set убирает дубли за O(n) и корректно обрабатывает NaN.

Другие вопросы раздела