Объект Map
Map или карта (отображение, словарь) представляет структуру данных, где каждый элемент имеет ключ и значение. Ключи в рамках карты являются уникальными, то есть с одним ключом может быть сопоставлен только один элемент. Для создания карты применяется конструктор объекта Map
:
const myMap = new Map();
Также можно инициализировать карту начальными значениями. Для этого в конструктор передается массив, элементы которого представляют массивы из двух элементов - первый элемент будет выступать в качестве ключа, а второй - в качестве значения:
const myMap = new Map([[1, "a"], [2, "b"], [3, "c"]]);
// Map(3) {1 => "a", 2 => "b", 3 => "c"}
console.log(myMap);
В данном случае числа 1
, 2
, 3
являются ключами, а строки a
, b
, c
- значениями.
При этом ключи и значения необзательно должны быть одного типа:
const myMap = new Map([["a", 1], [2, "b"], ["c", true]]);
// Map(3) {"a" => 1, 2 => "b", "c" => true}
console.log(myMap);
С помощью свойства size
можно проверить количество элементов в Map
:
const myMap = new Map([["a", 1], [2, "b"], ["c", true]]);
// 3
console.log(myMap.size);
Добавление и изменение элементов
Для установки значения применяется метод set()
:
const myMap = new Map([[1, "a"], [2, "b"], [3, "c"]]);
// добавление элемента
myMap.set(4, "d");
// изменение элемента
myMap.set(2, "v");
// Map(4) {1 => "a", 2 => "v", 3 => "c", 4 => "d"}
console.log(myMap);
Первый параметр метода set()
представляет ключ, а второй параметр - значение элемента. Если по такому ключу нет элементов, то добавляется новый элемент. Если ключ уже есть, то уже имеющийся элемент изменяет свое значение.
Получение элементов
Для получения элемента по ключу применяется метод get()
, в который передается ключ элемента:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
// Bob
console.log(myMap.get(2));
// undefined
console.log(myMap.get(7));
Если map не содержит элемента по заданному ключу, то метод возвращает undefined
.
Чтобы избежать возвращения undefined
мы можем проверить наличие элемента по ключу с помощью метода has()
. Если элемент по ключу имеется, то метод возвращает true
, иначе возвращается false
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
// true
console.log(myMap.has(2));
// false
console.log(myMap.has(7));
// Tom
if(myMap.has(1)) console.log(myMap.get(1));
Удаление элементов
Для удаления одного элемента по ключу применяется метод delete()
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
myMap.delete(2);
// Map(2) {1 => "Tom", 3 => "Sam"}
console.log(myMap);
Для удаления всех элементов используется метод clear()
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
myMap.clear();
// Map(0) {}
console.log(myMap);
Перебор элементов
Для перебора элементов используется метод forEach
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
myMap.forEach(function(value1, value2, map){
console.log(value2, value1);
})
Метод forEach
в качестве параметра получает функцию обратного вызова, которая имеет три параметра. Первый и второй параметры - это соответственно значение и ключ текущего перебираемого элемента, а третий параметр - перебираемый объект Map
.
Консольный вывод данного примера:
1 Tom
2 Bob
3 Sam
Также для перебора объекта Map
можно использовать циклы, например цикл for...of
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
for(item of myMap){
console.log(item[0], item[1]);
}
Каждый элемент из Map
помещается в переменную item
, которая в свою очередь представляет массив. Первый элемент этого массива - ключ, а второй элемент - значение элемента.
Также объект Map
имеет два дополнительных метода: keys()
позволяет перебрать только ключи и values()
позволяет перебирать значения элементов. Оба метода возвращают итераторы, поэтому для перебора ключей и значений по отдельности также можно использовать цикл for...of
:
const myMap = new Map([[1, "Tom"], [2, "Bob"], [3, "Sam"]]);
for(item of myMap.keys()){
console.log(item);
}
for(item of myMap.values()){
console.log(item);
}