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 для хранения уникальных значений.