Тема, шрифт, мова та інші налаштування інтерфейсу.
Статистика використання. Вимкнена, доки ви її не дозволите.
Реклама та вимірювання реклами. Вимкнені, доки ви їх не дозволите.
ПРО САЙТ
Усі відкриті вкладки сайту
JavaScript · Синтаксис · Проміжний
Map
10 завдань
Вивчи структуру даних Map у JavaScript — колекцію ключ-значення, яка приймає будь-який тип як ключ, зберігає порядок вставки та забезпечує ефективні операції додавання, отримання і видалення.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Map: колекція ключ-значення з довільним типом ключа
`Map` — це колекція ключ-значення, схожа на звичайний об'єкт, але з важливими відмінностями, які роблять її кращим вибором у певних ситуаціях.
**Створення Map та основні методи**
```javascript
const m = new Map();
m.set('name', 'Alice'); // додати або оновити запис
m.set(42, 'answer'); // число як ключ — працює
m.set(true, 'yes'); // булеве значення як ключ — працює
m.get('name'); // "Alice"
m.get(42); // "answer"
m.has('name'); // true
m.has('phone'); // false
m.size; // 3 (властивість, без дужок)
m.delete('name'); // видаляє запис, повертає true якщо існував
m.clear(); // видаляє всі записи
```
Можна також ініціалізувати з масиву пар `[key, value]`:
```javascript
const scores = new Map([
['Alice', 95],
['Bob', 87],
]);
```
**Чим Map відрізняється від Object**
Object приймає лише рядки та символи як ключі. Map приймає що завгодно — числа, об'єкти, інші Map, навіть функції. Це важливо коли потрібно використовувати не-рядкові дані як ключ пошуку.
В Object немає вбудованого `size` — потрібно `Object.keys(obj).length`. У Map є `.size` напряму.
Map зберігає порядок вставки для всіх типів ключів. Object також для рядкових ключів у сучасних рушіях, але не гарантовано для ключів що виглядають як цілі числа.
Map безпосередньо ітерується через `for...of`. Object потребує `Object.entries()` або аналогів.
**Коли використовувати Map замість Object**
Обирай Map коли:
- Ключі не є рядками (числа, об'єкти, символи)
- Потрібен `.size` без зайвого коду
- Часто додаєш і видаляєш записи (Map оптимізований для мутацій)
- Потрібен гарантований порядок ітерації для всіх типів ключів
Залишай Object коли:
- Маєш рядкові/символьні ключі і не потребуєш вищезазначеного
- Потрібна JSON-серіалізація — `JSON.stringify` ігнорує записи Map
- Пишеш конфіг або дані відомі в момент написання коду (об'єктні літерали читабельніші)
Три паттерни покривають більшість реального використання Map: ітерація по записах, конвертація між Map і Object, та Map як лічильник частоти.
**Ітерація**
```javascript
const m = new Map([['a', 1], ['b', 2], ['c', 3]]);
for (const [key, value] of m) {
console.log(key, value); // найпоширеніша форма
}
for (const [key, value] of m.entries()) {
console.log(key, value); // ідентично до вищого
}
for (const key of m.keys()) { console.log(key); }
for (const val of m.values()) { console.log(val); }
m.forEach((value, key) => {
console.log(key, value); // увага: value йде першим, key другим
});
```
`for...of` деструктурує кожен запис напряму. У `forEach` зворотній порядок параметрів порівняно з `forEach` масиву — часте джерело помилок.
**Map як лічильник частоти**
```javascript
const text = "hello";
const freq = new Map();
for (const ch of text) {
freq.set(ch, (freq.get(ch) ?? 0) + 1);
}
// Map { 'h'=>1, 'e'=>1, 'l'=>2, 'o'=>1 }
```
`freq.get(ch) ?? 0` читає поточний лічильник або повертає 0 якщо символу ще немає в Map. Потім `+ 1` збільшує його. Цей паттерн працює для будь-яких лічильників — слів, подій, категорій.
**Конвертація між Map, Object і Array**
```javascript
// Object → Map
const obj = { a: 1, b: 2 };
const m = new Map(Object.entries(obj));
// Map → Object
const back = Object.fromEntries(m);
// Масив пар → Map
const m2 = new Map([['x', 10], ['y', 20]]);
// Map → Масив пар
const pairs = [...m.entries()];
// Злиття двох Map (при збігу ключа перемагає останній)
const m1 = new Map([['a', 1], ['b', 2]]);
const m3 = new Map([['b', 99], ['c', 3]]);
const merged = new Map([...m1, ...m3]);
// b → 99 (m3 перезаписує m1)
```
Spread `...` перетворює Map на ітерабельний масив пар — той самий формат що приймає конструктор Map. Саме так працює і злиття, і конвертація в масив пар.
Швидкий довідник методів Map та порівняння зі звичайним Object.
**Методи та властивості**
`new Map()` — порожня Map
`new Map(iterable)` — з масиву пар `[[key, val], ...]`
`map.set(key, val)` — додати/оновити запис; повертає map (ланцюжок)
`map.get(key)` — значення, або undefined якщо ключа немає
`map.has(key)` — true/false
`map.delete(key)` — видалити запис; повертає true якщо існував
`map.clear()` — видалити всі записи
`map.size` — кількість записів (властивість, без дужок)
`map.keys()` — ітератор ключів
`map.values()` — ітератор значень
`map.entries()` — ітератор пар [key, value]
`map.forEach(fn)` — `fn(value, key, map)` для кожного запису
**Ітерація**
```javascript
for (const [key, val] of map) { } // найпоширеніше
for (const [key, val] of map.entries()) { } // те саме
for (const key of map.keys()) { }
for (const val of map.values()) { }
map.forEach((val, key) => { }); // value першим, key другим
```
**Map vs Object**
Типи ключів: Map приймає будь-яке значення; Object лише рядки і символи.
Розмір: `map.size` проти `Object.keys(obj).length`.
Ітерація: Map напряму ітерується; Object потребує `Object.entries()`.
JSON: `JSON.stringify` пропускає Map — конвертуй в Object спочатку.
Прототип: Map не має успадкованих властивостей; Object може успадковувати з прототипу.
Продуктивність: Map оптимізований для частих додавань/видалень; Object для статичної форми.
**Поширені конвертації**
Object → Map: `new Map(Object.entries(obj))`
Map → Object: `Object.fromEntries(map)`
Map → Масив пар: `[...map.entries()]`
Злиття: `new Map([...m1, ...m2])` — при збігу ключа m2 перемагає
Створи Map з трьома записами: `"name"` → `"Alice"`, `"age"` → `30`, `"city"` → `"Kyiv"`.
Потім виведи: значення для `"name"`, чи існує `"age"`, чи існує `"phone"`.
// твій код тут
Рішення
const m = new Map();
m.set("name", "Alice");
m.set("age", 30);
m.set("city", "Kyiv");
console.log(m.get("name"));
console.log(m.has("age"));
console.log(m.has("phone"));
Порахуй скільки разів кожне слово зустрічається в `text` за допомогою Map.
Виведи Map.
let text = "the cat sat on the mat the cat";
// твій код тут
Рішення
let text = "the cat sat on the mat the cat";
const freq = new Map();
for (const word of text.split(" ")) {
freq.set(word, (freq.get(word) ?? 0) + 1);
}
console.log(freq);
Напиши функцію `cachedSquare(n)`, яка повертає `n * n` але зберігає результати в Map щоб кожне число обчислювалося лише раз.
Викличи тричі: з `5`, знову `5` і `7`. Виведи кожен результат та розмір кешу наприкінці.
const cache = new Map();
function cachedSquare(n) {
// твій код тут
}
console.log(cachedSquare(5));
console.log(cachedSquare(5));
console.log(cachedSquare(7));
console.log(cache.size);
Рішення
const cache = new Map();
function cachedSquare(n) {
if (!cache.has(n)) {
cache.set(n, n * n);
}
return cache.get(n);
}
console.log(cachedSquare(5));
console.log(cachedSquare(5));
console.log(cachedSquare(7));
console.log(cache.size);
Знайди країну в `capitals` чия столиця — `"Berlin"`. Виведи назву країни, або `"Not found"` якщо не знайдено.
const capitals = new Map([["France", "Paris"], ["Germany", "Berlin"], ["Ukraine", "Kyiv"]]);
// твій код тут
Рішення
const capitals = new Map([["France", "Paris"], ["Germany", "Berlin"], ["Ukraine", "Kyiv"]]);
let result = "Not found";
for (const [country, capital] of capitals) {
if (capital === "Berlin") {
result = country;
break;
}
}
console.log(result);
const users = [
{ name: "Alice", role: "admin" },
{ name: "Bob", role: "user" },
{ name: "Charlie", role: "admin" },
{ name: "Dave", role: "user" },
];
const groups = new Map();
for (const user of users) {
if (!groups.has(user.role)) {
groups.set(user.role, []);
}
groups.get(user.role).push(user.name);
}
console.log(groups);
No split tab
Налаштування cookies
Ми використовуємо необхідні cookies для роботи сайту. З вашого дозволу ми також можемо зберігати налаштування сайту та використовувати аналітичні й рекламні cookies, щоб розуміти використання сайту й підтримувати розвиток проєкту.
* Ви завжди можете змінити свій вибір у налаштуваннях сайту.
Оберіть категорії cookies
Налаштування аналітики
Можна вимкнути аналітику використання платформи. Також можна надіслати в Google Analytics запит на видалення даних про використання цього сайту, пов'язаних із цим браузером.
Навчальний workspace
Навчайтеся, читаючи, запускаючи код і розв'язуючи задачі.
Практикуйте програмування з поясненнями тем, вправами, інструментами browser IDE, перевіркою regex і тренуванням друку коду в одному workspace.
Відкривайте інструменти у вкладках.Вправи, IDE-інструменти й тренажери залишаються доступними як вкладки сайту.
Перемикайтеся без втрати контексту.Переходьте між поясненнями, кодом та утилітами, зберігаючи своє місце.
Використовуйте sidebar як карту.Ліві панелі містять навігацію, налаштування, файли, libraries та керування інструментами.
PythonJavaScriptSQLite
Одна IDE, три практичні режими
Python у браузері.Запускайте невеликі скрипти, пробуйте бібліотеки й тренуйте API-запити без встановлення.
JavaScript для швидких експериментів.Перевіряйте код для браузера й порівнюйте ідеї поруч із навчальними матеріалами.
SQLite для практики з даними.Відкривайте оглядач бази даних, переглядайте таблиці, пишіть запити й вивчайте SQL локально.
ТемаIDE
Працюйте поруч у split tabs
Тримайте інструкції перед очима.Відкрийте вправу або довідкову сторінку поруч з IDE, замість постійних перемикань.
Порівнюйте інструменти під час навчання.Розміщуйте перевірки regex, пояснення та експерименти з кодом поруч, коли це потрібно для задачі.
Закрийте split, коли завершите.Workspace повернеться до однієї сфокусованої вкладки, а відкриті вкладки сайту залишаться доступними.
Тренажер друку коду
Або звичайного тексту
Тренажер розрахований на фізичну клавіатуру.Відкрийте цей розділ на ноутбуці або комп'ютері з широким екраном. На телефоні тренування друку не працюватиме коректно.
Швидкість: 0 зн/хв
0 слів/хв
Найкраща швидкість (60с): 0 зн/хв
0 слів/хв
Помилки: 0
Загальний час: 0.0 с
Щоб тренувати сліпий друк, не підглядайте на фізичну клавіатуру.