Map в JavaScript

Task в RS School по JavaScript про Map

Для работы со сложными структурами данных, такими как массивы и объкты, принято использовать Map и Set

Map — это коллекция, предназначенная для хранения данных любого типа в виде пар [ключ, значение].

Каждое значение сохраняется по уникальному ключу, который затем используется для доступа к этому значению. При этом ключи также могут быть любого типа.

Методы и свойства 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 › возвращает текущее количество элементов.

Пример использования

let map = new Map();
map.set("1", "string1");    // строка в качестве ключа
map.set(1, "number1");      // цифра как ключ
map.set(true, "boolean1");  // булево значение как ключ
// помните, обычный объект Object приводит ключи к строкам?
// Map сохраняет тип ключей, так что в этом случае сохранится 2 разных значения:      
console.log(map.get(1)); // "number1"
console.log(map.get("1")); // "string1"
console.log(map.size); // 3

Как мы видим, в отличие от объектов, ключи в "Map" не приводятся к строкам. Это позволяет использовать любые типы данных в качестве ключей.

Использование map[key] не является корректным способом работы с Map. Хотя map[key] может работать, например, мы можем установить map[key] = 2, в этом случае map будет рассматриваться как обычный JavaScript-объект, что приводит к всем соответствующим ограничениям (например, ключи будут приводиться к строкам и т.д.).

Поэтому для работы с Map следует использовать специальные методы, такие как set, get и другие.

Map может использовать объекты в качестве ключей.

let john = { name: "John" };
// давайте сохраним количество посещений для каждого пользователя     
let visitsCountMap = new Map();
// объект john - это ключ для значения в объекте Map
visitsCountMap.set(john, 123);
console.log(visitsCountMap.get(john)); // 123

Использование объектов в качестве ключей — одна из наиболее заметных и важных функций Map. Это невозможно сделать с помощью обычных объектов. В объектах ключи могут быть только строками или символами, но мы не можем использовать другой объект в качестве ключа.

Пример использования объекта в качестве ключа

let john = { name: "John" };
let ben = { name: "Ben" };
let visitsCountObj = {}; // попробуем использовать объект
visitsCountObj[ben] = 234; // пробуем использовать объект ben в качестве ключа
visitsCountObj[john] = 123; // пробуем использовать объект john в качестве ключа, при этом объект ben будет замещён
// Вот что там было записано!
console.log( visitsCountObj["[object Object]"] ); // 123

Поскольку visitsCountObj является объектом, он преобразует все ключи типа Object, такие как john и ben, в одну и ту же строку "[object Object]". Это, очевидно, не то, чего мы хотим.