Map и Set
Отличия от обычного объекта Object:
- Что угодно может быть ключом, в том числе и объекты.
- Есть дополнительные методы, свойство
size.
Set – коллекция уникальных значений, так называемое «множество».
Map
Map – это коллекция ключ/значение, как и Object. Но основное отличие в том, что Map позволяет использовать ключи любого типа.
Методы и свойства:
- new Map() – создаёт коллекцию.
- 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 – возвращает текущее количество элементов.
💥 map[key] это не совсем правильный способ использования Map
Поэтому нам следует использовать методы map: set, get и так далее.
Map может использовать объекты в качестве ключей.
💥 Как объект Map сравнивает ключи
Чтобы сравнивать ключи, объект Map использует алгоритм SameValueZero. Это почти такое же сравнение, что и ===, с той лишь разницей, что NaN считается равным NaN. Так что NaN также может использоваться в качестве ключа.
Перебор Map
Для перебора коллекции Map есть 3 метода:
- map.keys() – возвращает итерируемый объект по ключам,
- map.values() – возвращает итерируемый объект по значениям,
- map.entries() – возвращает итерируемый объект по парам вида [ключ, значение], этот вариант используется по умолчанию в for..of.
💥 Используется порядок вставки
В отличие от обычных объектов Object, в Map перебор происходит в том же порядке, в каком происходило добавление элементов.
Map имеет встроенный метод forEach, схожий со встроенным методом массивов Array
Object.entries: Map из Object
При создании Map мы можем указать массив (или другой итерируемый объект) с парами ключ-значение для инициализации
// массив пар [ключ, значение]
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
alert( map.get('1') ); // str1
Если у нас уже есть обычный объект, и мы хотели бы создать Map из него, то поможет встроенный метод Object.entries(obj), который получает объект и возвращает массив пар ключ-значение для него, как раз в этом формате.
let obj = {
name: "John",
age: 30
};
let map = new Map(Object.entries(obj));
alert( map.get('name') ); // John
Object.fromEntries: Object из Map
Мы можем использовать Object.fromEntries, чтобы получить обычный объект из Map.
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map.entries()); // создаём обычный объект (*)
alert(obj.orange); // готово! obj = { banana: 1, orange: 2, meat: 4 }
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
Мы можем перебрать содержимое объекта set как с помощью метода for..of, так и используя forEach:
Set имеет те же встроенные методы, что и Map:
set.values()– возвращает перебираемый объект для значений,set.keys()– то же самое, что иset.values(), присутствует для обратной совместимости сMap,set.entries()– возвращает перебираемый объект для пар вида [значение, значение], присутствует для обратной совместимости сMap.
🚀 Источник: https://learn.javascript.ru/map-set