Set в JavaScript
Task в RS School по JavaScript про Set
Объект Set — это уникальный тип коллекции, представляющий собой «множество» значений, в котором каждое значение хранится только один раз и не имеет ключей.
Основные методы Set
"new Set(iterable)" › создаёт Set, и если в качестве аргумента был предоставлен итерируемый объект, обычно это [массив], то копирует его значения в новый Set.
"set.add(value)" › Добавляет значение в множество (если оно уже присутствует, изменений не происходит) и возвращает сам объект Set.
"set.delete(value)" › Удаляет значение из множества и возвращает true, если указанное значение присутствовало в множестве на момент вызова, иначе возвращает false.
"set.has(value)" › Возвращает true, если указанное значение находится в множестве; в противном случае — false.
"set.clear()" › удаляет все имеющиеся значения.
"set.size" › возвращает количество элементов в множестве.
Главная особенность заключается в том, что при многократных вызовах "set.add()" с одинаковым значением ничего не изменяется, благодаря чему каждое значение хранится в единственном экземпляре.
Например, мы ждём гостей и хотим сделать список всех кто к нам должен прийти, но в список не должны попасть записи о повнорных посещениях. Тут нам поможет Set
let set = new Set();
let john = { name: "John" };
let mia = { name: "Mariah" };
let ann = { name: "Ann" };
// считаем гостей, некоторые приходят несколько раз
set.add(john);
set.add(ann);
set.add(mia);
set.add(john);
set.add(mia);
// set хранит только 3 уникальных значения
alert(set.size); // 3
for (let user of set) {
alert(user.name); // John (потом Ann и Mariah)
}
Перебор объекта 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, принимает три аргумента: значение value, снова то же значение valueAgain, и только затем сам объект. Значение действительно появляется дважды в списке аргументов.
Это сделано для совместимости с объектом Map, где колбэк для forEach также принимает три аргумента. Хотя это может выглядеть необычно, такая структура позволяет легко переключаться между использованием Map и Set.
Объект Set имеет те же методы для перебора, что и Map:
"set.values()" › возвращает перебираемый объект, содержащий значения множества;
"set.keys()" › работает так же, как set.values(), добавлено для совместимости с Map;
"set.entries()" › возвращает перебираемый объект, содержащий пары вида [значение, значение], также для совместимости с Map.