← Все вопросы

Set в JavaScript — зачем он нужен и как использовать?

Задан 1 месяц назад539 просмотров2 ответа
5

Наткнулся на new Set() в коде и не понял, чем это лучше обычного массива. Гуглил «js set», но толком не разобрался.

У меня задача — из массива убрать повторы, чтобы остались только уникальные значения. Говорят, Set для этого идеален. Объясните, как он работает и где реально пригождается?

2 ответа

10
✓ Принятый ответ — помог автору

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 посчитает разными, ведь это разные ссылки.

4

Дополню про объекты — это частая ловушка:

const s = new Set();
s.add({ id: 1 });
s.add({ id: 1 });
console.log(s.size);  // 2, а не 1!

Set сравнивает по ссылке, а это два разных объекта в памяти. Для чисел, строк и булевых всё работает как ожидаешь, а вот для объектов «уникальность по содержимому» сам Set не даст — придётся сравнивать вручную.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект