Есть способ сделать это лучше

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

Но в JavaScript есть встроенная структура данных, созданная именно для этой цели: Map. Позвольте мне назвать несколько причин, по которым лучше использовать Map вместо простых объектов.

1. Больше ключевых типов

Объекты могут иметь только символы или строки. Карты могут иметь в качестве ключа значения любого типа: объекты, функции или примитивы.

2. Лучшее определение размера

В то время как карта предоставляет свойство размера, размер простого объекта приходится определять сложным путем. Определение размера карты возможно за O (1) времени, тогда как для простого объекта требуется O (n) шагов.

3. Лучшая производительность

Карты оптимизированы для частого добавления и удаления записей.

Более того, количество записей Map может быть получено за постоянное время, в то время как количество записей простого объекта должно быть подсчитано, что занимает O (n) времени.

В качестве примера с использованием моего Macbook Pro это средняя продолжительность определения размера карты с 10 миллионами записей:

  • Обычный объект JS: ~ 1,6 с
  • Карта: ‹1 мс

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

4. Прямая итерация

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

5. Порядок ключей

До ECMAScript 2015 не гарантируется, что ключи объекта находятся в каком-либо определенном порядке. Итерация по карте гарантирует, что ключи появятся в порядке вставки.

6. Отсутствие переопределения клавиш

Простой объект уже содержит некоторые ключи из-за своего прототипа. Могут быть конфликты между вашими ключами и ключами, уже содержащимися в объекте. Карты не содержат ключей при создании.

Примечание. Начиная с ECMAScript 2015, вы можете избежать случайного переопределения ключа, используя Object.create(null) для создания вашей простой карты объектов.

Заключение

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