Для чего нужен 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
- Хранит значения любого типа:
- Примитивы (number, string, boolean, undefined, null, symbol);
Объекты, включая функции и массивы:
<br/>const s = new Set();
s.add({name: 'Alice'});
s.add({name: 'Alice'}); // другой объект — добавится
console.log(s.size); // 2
-
Сравнение происходит по семантике "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.