JavaScript Map — словник із будь-якими ключами


Map (у перекладі — відображення, словник) зберігає пари ключ → значення, де ключем може бути що завгодно: рядок, число, об'єкт, навіть функція.

автор: NagarD

Загальний опис

Звичайний об'єкт теж схожий на словник, але має три вади, через які його весь час доводилось підпирати милицями.

Перше: ключі там тільки рядки. Спробуєш взяти ключем об'єкт — він мовчки перетвориться на "[object Object]", і два різні об'єкти зіллються в один ключ.

Друге: об'єкт успадковує властивості. Ключ на ім'я toString чи constructor уже «існує», хоч ти його не клав.

Третє: щоб дізнатись кількість, доводиться рахувати Object.keys(obj).length — окремим проходом.

Map не має жодної з цих проблем: ключі будь-які, нічого зайвого не успадковується, розмір — у властивості size, а порядок додавання зберігається чесно.

автор: NagarD

Порада

Ключ-об'єкт — головна причина брати Map: так можна прив'язати дані до DOM-елемента, не чіпаючи сам елемент.

автор: NagarD
Нотатка

Map не серіалізується в JSON.stringify() — на виході буде порожній {}. Щоб зберегти, перетвори: JSON.stringify([...map]).

автор: NagarD

Синтаксис

const map = new Map([[key, value], ...]);

методи

Метод Опис
get Повертає значення за ключем або undefined.
set Додає чи оновлює пару ключ–значення.
has Перевіряє наявність ключа.
delete Видаляє пару за ключем.
clear Видаляє всі пари.
forEach Виконує функцію для кожної пари.
keys Ітератор ключів у порядку вставки.
values Ітератор значень у порядку вставки.
entries Ітератор пар [ключ, значення].

властивості

Властивість Опис
size Кількість пар у колекції.

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
Map 38+ 13+ 8+ 25+ 12+ 11+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
Map 38+ yes yes 8+

Приклади

+ запропонувати свій приклад у пісочниці

Ключами можуть бути об'єкти — зі звичайним об'єктом так не вийде.

const users = new Map();

users.set('id', 42);
users.set(1, 'число як ключ');

// ключ-об'єкт: дані прив'язані до елемента, сам елемент не змінюємо
const button = document.querySelector('button');
users.set(button, { clicks: 0 });

console.log(users.get(button)); // { clicks: 0 }
console.log(users.size);        // 3
console.log(users.has('id'));   // true

for (const [key, value] of users) {
    console.log(key, '→', value);
}
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід