Skip to main content

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