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.