Как оставить в массиве уникальные значения?
Массивы и структуры данных
Уникальные значения в массиве оставляют через `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.