Вернуть уникальные значения массива
Реализуйте unique(arr), возвращающую новый массив, где каждое значение arr встречается ровно один раз, с сохранением порядка первого появления. unique([1, 2, 2, 3, 1]) возвращает [1, 2, 3]. Исходный массив изменять нельзя.
function unique(arr) {
// ваш код здесь
}
Допишите реализацию.
Передать массив в Set, который отбрасывает дубликаты, сохраняя порядок вставки, затем развернуть обратно: [...new Set(arr)]. Проверка принадлежности у Set использует SameValueZero, поэтому примитивы дедуплицируются корректно (и NaN считается равным самому себе). Это O(n) и никогда не изменяет вход.
- ✗Сортировать для дедупликации, разрушая исходный порядок первого появления
- ✗Считать, что
Setдедуплицирует объекты по значению — он делает это по ссылке - ✗Использовать
indexOfвнутри цикла, превращая задачу O(n) в O(n²)
- →Чем проверка принадлежности у
SetобрабатываетNaNиначе, чем===? - →Как дедуплицировать массив объектов по конкретному свойству?
Решение
Передать массив в Set (он отбрасывает дубликаты) и развернуть обратно в массив.
function unique(arr) {
return [...new Set(arr)];
}
Как это работает
Set хранит только различные значения и сохраняет порядок вставки. Передавая arr в конструктор Set, мы автоматически отбрасываем повторы, а спред [...] превращает результат обратно в массив. Исходный массив при этом не меняется.
Принадлежность в Set определяется по алгоритму SameValueZero, поэтому примитивы сравниваются корректно, а NaN считается равным самому себе (в отличие от ===). Каждый элемент обрабатывается один раз, что даёт сложность O(n).