Set в JavaScript — зачем он нужен и как использовать?
Наткнулся на new Set() в коде и не понял, чем это лучше обычного массива. Гуглил «js set», но толком не разобрался.
У меня задача — из массива убрать повторы, чтобы остались только уникальные значения. Говорят, Set для этого идеален. Объясните, как он работает и где реально пригождается?
2 ответа
Set — это коллекция уникальных значений. Главная фишка: одинаковые элементы в нём не дублируются, второй такой же просто игнорируется.
Создаём и добавляем:
const s = new Set();
s.add(1);
s.add(2);
s.add(2); // дубликат — не добавится
console.log(s.size); // 2
console.log(s.has(2)); // true
s.delete(1);
Теперь твоя задача — убрать повторы из массива. Это делается в одну строку, потому что Set можно создать прямо из массива, а потом развернуть обратно через спред:
const arr = [1, 2, 2, 3, 3, 3, 4];
const unique = [...new Set(arr)];
console.log(unique); // [1, 2, 3, 4]
Перебрать Set можно обычным for...of:
for (const value of new Set(['a', 'b', 'a'])) {
console.log(value); // a, b
}
Где ещё реально полезен:
- быстрая проверка «есть ли элемент» —
has()работает быстрее, чемincludes()на большом массиве; - подсчёт количества уникальных значений;
- хранение «уже виденных» элементов, чтобы не обрабатывать дважды.
Важный нюанс: уникальность определяется по ===. Поэтому два разных объекта-литерала с одинаковыми полями Set посчитает разными, ведь это разные ссылки.
Дополню про объекты — это частая ловушка:
const s = new Set();
s.add({ id: 1 });
s.add({ id: 1 });
console.log(s.size); // 2, а не 1!
Set сравнивает по ссылке, а это два разных объекта в памяти. Для чисел, строк и булевых всё работает как ожидаешь, а вот для объектов «уникальность по содержимому» сам Set не даст — придётся сравнивать вручную.