Структура данных JavaScript карты

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

Что такое карта

Структура данных карты позволяет связать данные с ключом.

Перед ES6

ECMAScript6 (также называемый ES2015) представил структуру данных Map дляJavaScriptмир, вместе сНабор

До его введения люди обычно использовали объекты как карты, связывая какой-либо объект или значение с определенным значением ключа:

const car = {}
car['color'] = 'red'
car.owner = 'Flavio'
console.log(car['color']) //red
console.log(car.color) //red
console.log(car.owner) //Flavio
console.log(car['owner']) //Flavio

Введите карту

ES6 представил структуру данных Map, предоставив нам подходящий инструмент для обработки такого рода организации данных.

Карта инициализируется вызовом:

const m = new Map()

Добавить элементы на карту

Вы можете добавлять элементы на карту, используяsetметод:

m.set('color', 'red')
m.set('age', 2)

Получить предмет с карты по ключу

И вы можете получить предметы с карты, используяget:

const color = m.get('color')
const age = m.get('age')

Удалить объект с карты по клавише

Использоватьdelete()метод:

m.delete('color')

Удалить все элементы с карты

Использоватьclear()метод:

m.clear()

Проверить, есть ли на карте элемент по ключу

Использоватьhas()метод:

const hasColor = m.has('color')

Найдите количество элементов на карте

Использоватьsizeсвойство:

const size = m.size

Инициализировать карту со значениями

Вы можете инициализировать карту с набором значений:

const m = new Map([['color', 'red'], ['owner', 'Flavio'], ['age', 2]])

Ключи карты

Точно так же, как любое значение (объект, массив, строка, число) может использоваться в качестве значения записи значения ключа элемента карты,любое значение может использоваться как ключ, даже предметы.

Если вы попытаетесь получить несуществующий ключ, используяget()вне карты он вернетсяundefined.

Странные ситуации, которые вы почти никогда не встретите в реальной жизни

const m = new Map()
m.set(NaN, 'test')
m.get(NaN) //test
const m = new Map()
m.set(+0, 'test')
m.get(-0) //test

Итерация по карте

Перебирать ключи карты

Карта предлагаетkeys()метод, который мы можем использовать для перебора всех ключей:

for (const k of m.keys()) {
  console.log(k)
}

Перебирать значения карты

Объект Map предлагаетvalues()метод, который мы можем использовать для перебора всех значений:

for (const v of m.values()) {
  console.log(v)
}

Итерация по ключу карты, парам значений

Объект Map предлагаетentries()метод, который мы можем использовать для перебора всех значений:

for (const [k, v] of m.entries()) {
  console.log(k, v)
}

который можно упростить до

for (const [k, v] of m) {
  console.log(k, v)
}

Преобразовать в массив

Преобразуйте ключи карты в массив

const a = [...m.keys()]

Преобразуйте значения карты в массив

const a = [...m.values()]

WeakMap

WeakMap - это особый вид карты.

В объекте карты элементы никогда не собираются сборщиком мусора. Вместо этого WeakMap позволяет свободно собирать мусор для всех своих элементов. Каждый ключ WeakMap - это объект. Когда ссылка на этот объект потеряна, значение может быть собрано сборщиком мусора.

Вот основные отличия:

  1. вы не можете перебирать ключи или значения (или пары "ключ-значение") WeakMap
  2. вы не можете удалить все элементы из WeakMap
  3. вы не можете проверить его размер

WeakMap предоставляет те методы, которые эквивалентны методам Map:

  • get(k)
  • set(k, v)
  • has(k)
  • delete(k)

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

Скачать мою бесплатнуюРуководство для начинающих по JavaScript


Больше руководств по js: