Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое структура данных Map?
Map (Карта, Словарь) — это структура данных в JavaScript, которая хранит пары ключ-значение. В отличие от обычных объектов (Object), Map имеет множество преимуществ и специфичные особенности.
Основные отличия Map от Object
Ключи:
// Object — ключи всегда строки или Symbol
const obj = {};
obj[1] = "один";
obj[true] = "истина";
console.log(Object.keys(obj)); // ["1", "true"] — числа преобразованы в строки
// Map — ключи могут быть любого типа
const map = new Map();
map.set(1, "один");
map.set(true, "истина");
map.set({}, "объект");
map.set(function(){}, "функция");
console.log(map.size); // 4
Производительность:
// Map оптимизирована для частых добавлений/удалений
const map = new Map();
map.set("key1", "value1");
map.set("key2", "value2");
map.delete("key1"); // Очень быстро
// Object медленнее при множественных операциях
const obj = { key1: "value1", key2: "value2" };
delete obj.key1; // Медленнее, браузер оптимизирует строки
Методы и свойства Map
Основные методы:
const map = new Map();
// set(key, value) — добавить или обновить
map.set("name", "John");
map.set(1, "number");
// get(key) — получить значение
console.log(map.get("name")); // "John"
console.log(map.get(999)); // undefined
// has(key) — проверить наличие ключа
console.log(map.has("name")); // true
console.log(map.has("age")); // false
// delete(key) — удалить элемент
map.delete("name");
console.log(map.has("name")); // false
// clear() — очистить все элементы
map.clear();
console.log(map.size); // 0
// size — получить количество элементов
map.set("a", 1);
map.set("b", 2);
console.log(map.size); // 2
Итерация по Map
1. Метод forEach:
const map = new Map([
["name", "John"],
["age", 30],
["city", "London"]
]);
map.forEach((value, key) => {
console.log(`${key}: ${value}`);
});
// name: John
// age: 30
// city: London
2. Цикл for...of:
// Итерация по парам [ключ, значение]
for (const [key, value] of map) {
console.log(`${key}: ${value}`);
}
// Только ключи
for (const key of map.keys()) {
console.log(key);
}
// Только значения
for (const value of map.values()) {
console.log(value);
}
// Пары [ключ, значение]
for (const entry of map.entries()) {
console.log(entry); // [key, value]
}
3. Конвертация в массив:
const map = new Map([["a", 1], ["b", 2]]);
// Массив пар
const arr = Array.from(map);
console.log(arr); // [["a", 1], ["b", 2]]
// Или через оператор spread
const arr2 = [...map];
Ключи любых типов
const map = new Map();
// Строки
map.set("string", "value1");
// Числа
map.set(1, "value2");
map.set(1.5, "value3");
// Булевы
map.set(true, "value4");
map.set(false, "value5");
// Объекты (важно: разные объекты — разные ключи)
const obj1 = { id: 1 };
const obj2 = { id: 1 };
map.set(obj1, "value6");
map.set(obj2, "value7"); // Это другой ключ!
console.log(map.get(obj1)); // "value6"
console.log(map.get(obj2)); // "value7"
// Функции
const fn = () => {};
map.set(fn, "value8");
Практические примеры
1. Кэширование результатов функции:
const cache = new Map();
function expensiveOperation(x) {
if (cache.has(x)) {
console.log("Из кэша");
return cache.get(x);
}
const result = x * x * 2; // Дорогая операция
cache.set(x, result);
return result;
}
console.log(expensiveOperation(5)); // Вычислено: 50
console.log(expensiveOperation(5)); // Из кэша: 50
2. Подсчёт элементов:
const items = ["apple", "banana", "apple", "orange", "banana", "apple"];
const counter = new Map();
for (const item of items) {
counter.set(item, (counter.get(item) || 0) + 1);
}
console.log(counter);
// Map(3) {
// 'apple' => 3,
// 'banana' => 2,
// 'orange' => 1
// }
3. Группировка данных:
const users = [
{ name: "John", age: 30 },
{ name: "Jane", age: 25 },
{ name: "Bob", age: 30 }
];
const groupedByAge = new Map();
for (const user of users) {
if (!groupedByAge.has(user.age)) {
groupedByAge.set(user.age, []);
}
groupedByAge.get(user.age).push(user);
}
console.log(groupedByAge);
// Map(2) {
// 30 => [ { name: 'John', age: 30 }, { name: 'Bob', age: 30 } ],
// 25 => [ { name: 'Jane', age: 25 } ]
// }
WeakMap — вариант для объектов
// WeakMap — только объекты в качестве ключей
const weakMap = new WeakMap();
const obj = { id: 1 };
weakMap.set(obj, "значение");
console.log(weakMap.get(obj)); // "значение"
// Ключи удаляются автоматически, когда объект удаляется из памяти
// Это полезно для избежания утечек памяти
Ключевые моменты
- Map хранит пары ключ-значение с ключами любого типа
- Размер Map доступен через .size (у Object нет этого)
- Map итерируется в порядке добавления элементов
- Map быстрее Object при частых добавлениях/удалениях
- WeakMap используется для мета-данных о объектах (избегает утечек памяти)