Класс Map: словарь

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

Создание объекта

Создать объект позволяет следующий конструктор класса Map:

<Объект> = new Map([<Объект, поддерживающий итерации>])

Если параметр не указан, то создается пустой объект:

let map1 = new Map();
console.log(map1); // Map {}

В качестве параметра можно указать объект, поддерживающий итерации. Например, двумерный массив, содержащий пары ключ/значение:

let arr = [ ['a', 1], ['b', 2] ];
let map2 = new Map(arr);
console.log(map2); // Map { 'a' => 1, 'b' => 2 }

Добавление элементов и изменение значения

Добавить элемент позволяет метод set(<Ключ>, <Значение>):

let map = new Map();
map.set('Один', 1);
map.set('Два', 2);
console.log(map); // Map { 'Один' => 1, 'Два' => 2 }

Если ключ уже существует, то значение, соответствующее этому ключу, будет изменено:

let map = new Map();
map.set('a', 1);
console.log(map); // Map { 'a' => 1 }
map.set('a', 2);
console.log(map); // Map { 'a' => 2 }

Метод set() возвращает объект Map, поэтому мы можем создавать цепочки из вызовов метода:

let map = new Map();
map.set('Один', 1)
   .set('Два', 2)
   .set('Три', 3);
console.log(map);
// Map { 'Один' => 1, 'Два' => 2, 'Три' => 3 }

Получение значения по ключу

Получить значение по ключу позволяет метод get(<Ключ>). Если ключ не существует, то метод вернет значение undefined:

let map = new Map();
map.set('a', 1);
console.log( map.get('a') ); // 1
console.log( map.get('b') ); // undefined

Проверка наличия ключа

Метод has(<Ключ>) возвращает значение true, если ключ существует, и false — в противном случае:

let map = new Map();
map.set('a', 1);
console.log( map.has('a') ); // true
console.log( map.has('b') ); // false

Определение числа элементов

Для определения числа элементов, следует воспользоваться свойством size:

let map = new Map();
map.set('a', 1).set('b', 2).set('c', 3);
console.log( map.size ); // 3

Удаление элементов

Удалить элементы позволяют следующие методы:

  • delete(<Ключ>) — удаляет элемент, соответствующий указанному ключу. Метод возвращает значение true, если элемент был удален, и false — в противном случае (например, если элемент с таким ключом не существует):
let map = new Map();
map.set('a', 1).set('b', 2).set('c', 3);
console.log( map.delete('a') ); // true
console.log( map.delete('k') ); // false
console.log( map );
// Map { 'b' => 2, 'c' => 3 }
  • clear() — удаляет все элементы:
let map = new Map();
map.set('a', 1).set('b', 2);
console.log( map ); // Map { 'a' => 1, 'b' => 2 }
map.clear();
console.log( map ); // Map {}

Методы, возвращающие итераторы

Следующие методы возвращают специальный объект — итератор:

  • keys() — возвращает итератор, содержащий ключи в порядке их добавления:
const process = require('process');
let map = new Map();
map.set('a', 1).set('b', 2);
let iterator = map.keys();
console.log(iterator); // [Map Iterator] { 'a', 'b' }
// Перебор всех элементов
for (const key of iterator) {
   process.stdout.write(`${key} `);
} // a b
console.log();
// Преобразование в массив
let arrKeys = [...map.keys()];
console.log(arrKeys);  // [ 'a', 'b' ]
  • values() — возвращает итератор, содержащий значения:
const process = require('process');
let map = new Map();
map.set('a', 1).set('b', 2);
let iterator = map.values();
// Перебор всех элементов
for (const value of iterator) {
   process.stdout.write(`${value} `);
} // 1 2
console.log();
// Преобразование в массив
let arrValues = [...map.values()];
console.log(arrValues);  // [ 1, 2 ]
  • entries() — возвращает итератор, содержащий пары ключ/значение:
const process = require('process');
let map = new Map();
map.set('a', 1).set('b', 2);
let iterator = map.entries();
// Перебор всех элементов
for (const [key, value] of iterator) {
   process.stdout.write(`${key} => ${value} `);
} // a => 1 b => 2
console.log();
// Преобразование в массив
let arrEntries = [...map.entries()];
console.log(arrEntries);  // [ [ 'a', 1 ], [ 'b', 2 ] ]

Перебор элементов

Перебрать все элементы позволяет цикл for...of. На каждой итерации доступен массив из ключа и значения:

const process = require('process');
let map = new Map();
map.set('a', 1).set('b', 2);
for (const [key, value] of map) {
   process.stdout.write(`${key} => ${value} `);
} // a => 1 b => 2
console.log();
for (const arr of map) {
   console.log(arr);
}
// [ 'a', 1 ]
// [ 'b', 2 ]

Можно также воспользоваться методом forEach(). Формат метода:

forEach(<Функция>[, <this>])

В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента. Функция принимает три параметра. Через первый параметр доступно значение текущего элемента, через второй — его ключ, а через третий — ссылка на объект Map. Значение, указанное в параметре <this>, будет доступно через указатель this внутри функции:

let map = new Map();
map.set('a', 1).set('b', 2);
map.forEach( function(value, key, m) {
   console.log(`${key} => ${value}`);
});
// a => 1
// b => 2

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов