Set
Объект 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
может выступать массив для хранения гостей и дополнительный код для проверки уже имеющегося элемента с помощью arr.find. Но в этом случае будет хуже производительность, потому что arr.find
проходит весь массив для проверки наличия элемента. Множество Set
лучше оптимизировано для добавлений, оно автоматически проверяет на уникальность.
Перебор объекта 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.values()
– возвращает перебираемый объект для значений,set.keys()
– то же самое, что иset.values()
, присутствует для обратной совместимости сMap
,set.entries()
– возвращает перебираемый объект для пар вида[значение, значение]
, присутствует для обратной совместимости сMap
.
Итого
Map
– коллекция пар ключ-значение.
Методы и свойства:
new Map([iterable])
– создаёт коллекцию, можно указать перебираемый объект (обычно массив) из пар[ключ,значение]
для инициализации.map.set(key, value)
– записывает по ключуkey
значениеvalue
.map.get(key)
– возвращает значение по ключу илиundefined
, если ключkey
отсутствует.map.has(key)
– возвращаетtrue
, если ключkey
присутствует в коллекции, иначеfalse
.map.delete(key)
– удаляет элемент по ключуkey
.map.clear()
– очищает коллекцию от всех элементов.map.size
– возвращает текущее количество элементов.
Отличия от обычного объекта Object
:
- Что угодно может быть ключом, в том числе и объекты.
- Есть дополнительные методы, свойство
size
.
Set
– коллекция уникальных значений, так называемое «множество».
Методы и свойства:
new Set([iterable])
– создаётSet
, можно указать перебираемый объект со значениями для инициализации.set.add(value)
– добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объектset
.set.delete(value)
– удаляет значение, возвращаетtrue
еслиvalue
было в множестве на момент вызова, иначеfalse
.set.has(value)
– возвращаетtrue
, если значение присутствует в множестве, иначеfalse
.set.clear()
– удаляет все имеющиеся значения.set.size
– возвращает количество элементов в множестве.
Перебор Map
и Set
всегда осуществляется в порядке добавления элементов, так что нельзя сказать, что это – неупорядоченные коллекции, но поменять порядок элементов или получить элемент напрямую по его номеру нельзя.
Задачи
Фильтрация уникальных элементов массива
важность: 5
Допустим, у нас есть массив arr
.
Создайте функцию unique(arr)
, которая вернёт массив уникальных, не повторяющихся значений массива arr
.
Например:
function unique(arr) {
/* ваш код */
}
let values = ["Hare", "Krishna", "Hare", "Krishna",
"Krishna", "Krishna", "Hare", "Hare", ":-O"
];
alert( unique(values) ); // Hare,Krishna,:-O
P.S. Здесь мы используем строки, но значения могут быть любого типа.
P.P.S. Используйте Set
для хранения уникальных значений.