Для чего нужен Set


В JavaScript объект Set представляет собой коллекцию уникальных значений. Он предназначен для хранения значений без дубликатов, и при этом его интерфейс предоставляет удобные методы для добавления, удаления, проверки наличия и итерации по элементам.

🔹 Основное назначение Set

Главная цель Set — исключение дубликатов из набора значений. Это делает Set особенно полезным в ситуациях, когда:

  • нужно гарантировать уникальность значений (например, ID, ключи, флаги);

  • необходима быстрая проверка наличия элемента;

  • требуется производительная альтернатива массивам, когда неважен порядок и нет повторов.

🔹 Создание Set

const set = new Set();
Можно инициализировать Set из массива:
const numbers = \[1, 2, 3, 2, 1\];
const uniqueNumbers = new Set(numbers); // Set {1, 2, 3}

🔹 Особенности Set

Хранит только уникальные значения.
При добавлении дубликатов они игнорируются:

<br/>const s = new Set();
s.add(1);
s.add(1);
console.log(s.size); // 1
  1. Хранит значения любого типа:
    • Примитивы (number, string, boolean, undefined, null, symbol);

Объекты, включая функции и массивы:

<br/>const s = new Set();
s.add({name: 'Alice'});
s.add({name: 'Alice'}); // другой объект  добавится
console.log(s.size); // 2
  1. Сравнение происходит по семантике "SameValueZero":

    • NaN считается равным NaN;

    • 0 и -0 считаются равными;

    • объекты сравниваются по ссылке.

🔹 Методы и свойства Set

Метод / Свойство Описание
add(value) Добавляет значение
--- ---
delete(value) Удаляет значение
--- ---
has(value) Проверяет наличие
--- ---
clear() Удаляет все значения
--- ---
size Возвращает количество элементов
--- ---

Примеры:

const s = new Set();
s.add(1).add(2).add(3);
s.has(2); // true
s.delete(1); // true
s.size; // 2
s.clear(); // Set пустой

🔹 Перебор Set

Порядок элементов соответствует порядку добавления (в отличие от объекта):

const s = new Set(\['apple', 'banana', 'cherry'\]);
for (let value of s) {
console.log(value);
}
// или
s.forEach((value) => console.log(value));

Методы итерации:

  • s.keys() — идентичен s.values(), возвращает значения;

  • s.values() — значения;

  • s.entries() — пары [value, value], для совместимости с Map.

🔹 Преобразование Set

В массив:

<br/>const s = new Set(\[1, 2, 3\]);
const arr = \[...s\]; // \[1, 2, 3\]

Из массива:

<br/>const arr = \[1, 2, 2, 3\];
const s = new Set(arr); // Set {1, 2, 3}

🔹 Использование Set в задачах

✅ Удаление дубликатов из массива:

const arr = \[1, 1, 2, 3, 3\];
const unique = \[...new Set(arr)\]; // \[1, 2, 3\]

✅ Проверка наличия уникальных значений:

function hasDuplicates(arr) {
return new Set(arr).size !== arr.length;
}

✅ Поиск пересечений множеств:

const a = new Set(\[1, 2, 3\]);
const b = new Set(\[2, 3, 4\]);
const intersection = new Set(\[...a\].filter(x => b.has(x))); // Set {2, 3}

✅ Объединение множеств:

const union = new Set(\[...a, ...b\]); // Set {1, 2, 3, 4}

✅ Разность множеств:

const difference = new Set(\[...a\].filter(x => !b.has(x))); // Set {1}

🔹 Отличия от Array

Характеристика Set Array
Повторяющиеся значения Нет Да
--- --- ---
Порядок элементов Сохраняется Сохраняется
--- --- ---
Индексы Нет Да (arr[0], arr[1] и т. д.)
--- --- ---
Быстрый has() Да (O(1)) Нет (O(n))
--- --- ---
Методы map, filter Нет напрямую, через преобразование в массив Да
--- --- ---

🔹 Пример использования в задачах

Фильтрация уникальных слов:

const text = "apple banana apple cherry banana";
const uniqueWords = new Set(text.split(" "));
console.log(uniqueWords); // Set {"apple", "banana", "cherry"}
Частый шаблон: Set + Array.from или spread:
const s = new Set(\[1, 2, 3\]);
Array.from(s); // \[1, 2, 3\]
\[...s\]; // \[1, 2, 3\]

🔹 Недостатки и ограничения Set

  • Нет методов сортировки (sort, reverse).

  • Нет методов поиска по индексу (indexOf, find).

  • Нет прямого доступа к элементам по индексу (set[0] не работает).

  • Нельзя задать ключ-значение, как в Map.

Если нужен ассоциативный список — использовать Map. Если нужна коллекция значений без дубликатов — Set.

🔹 Внутренняя реализация (поверхностно)

В современных движках JavaScript Set реализован с использованием хеш-таблиц или деревьев, аналогично Map. Это обеспечивает быстрый доступ (O(1) в среднем) к методам has, add, delete. Сложность может увеличиваться до O(n) в худшем случае, но на практике Set работает значительно быстрее массива при проверке на наличие значения.

🔹 Когда использовать Set

  • Когда нужно хранить уникальные значения.

  • Для фильтрации дубликатов.

  • Для множества операций: пересечения, объединения, разности.

  • Для быстрой проверки наличия элемента.

  • В качестве кэша.

  • Для трекинга обработанных значений или ID.

Set — мощный инструмент, особенно при работе с множествами, массивами и уникальными значениями. Его лаконичный синтаксис, высокая производительность и чистая семантика делают его важной частью современного JavaScript.