← Назад к вопросам

Что такое структура данных Map?

1.3 Junior🔥 141 комментариев
#JavaScript Core

Комментарии (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 используется для мета-данных о объектах (избегает утечек памяти)
Что такое структура данных Map? | PrepBro