Объект Set – это особый вид коллекции: «множество» значений (без ключей), где каждое значение может появляться только один раз.
Его основные методы это:
new Set(iterable)– создаётSet, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новыйSet.set.add(value)– добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объектset.set.delete(value)– удаляет значение, возвращаетtrue, еслиvalueбыло в множестве на момент вызова, иначеfalse.set.has(value)– возвращаетtrue, если значение присутствует в множестве, иначеfalse.set.clear()– удаляет все имеющиеся значения.set.size– возвращает количество элементов в множестве.
Основная «изюминка» – это то, что при повторных вызовах set.add() с одним и тем же значением ничего не происходит, за счёт этого как раз и получается, что каждое значение появляется один раз.
Например, мы ожидаем посетителей, и нам необходимо составить их список. Но повторные визиты не должны приводить к дубликатам. Каждый посетитель должен появиться в списке только один раз.
Множество Set – как раз то, что нужно для этого:
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" }; // считаем гостей, некоторые приходят несколько раз
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary); // set хранит только 3 уникальных значения
alert(set.size); // 3
for (let user of set) {
alert(user.name); // John (потом Pete и Mary) }`Перебор объекта Set
Мы можем перебрать содержимое объекта set как с помощью метода for..of, так и используя forEach:
let set = new Set(["апельсин", "яблоко", "банан"]);
for (let value of set)
alert(value); // то же самое с forEach:
set.forEach((value, valueAgain, set) => {
alert(value); });`Заметим забавную вещь. Функция в forEach у Set имеет 3 аргумента: значение value, потом снова то же самое значение valueAgain, и только потом целевой объект. Это действительно так, значение появляется в списке аргументов дважды.
Это сделано для совместимости с объектом Map, в котором колбэк forEach имеет 3 аргумента. Выглядит немного странно, но в некоторых случаях может помочь легко заменить Map на Set и наоборот.
Set имеет те же встроенные методы, что и Map:
set.keys()– возвращает перебираемый объект для значений,set.values()– то же самое, что иset.keys(), присутствует для обратной совместимости сMapset.entries()– возвращает перебираемый объект для пар вида[значение, значение], присутствует для обратной совместимости сMap.
Перебор Map и Set всегда осуществляется в порядке добавления элементов, так что нельзя сказать, что это – неупорядоченные коллекции, но поменять порядок элементов или получить элемент напрямую по его номеру нельзя.