Есть способ сделать это лучше
Карта - одна из наиболее часто используемых структур данных в повседневном программировании. Он хранит пары ключ-значение, к которым можно легко получить доступ по их ключам. В 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)
для создания вашей простой карты объектов.
Заключение
Время использования объектов в качестве обходного пути к отсутствующей реализации хэш-карт прошло. Объекты очень полезны, но они больше не являются первым выбором, когда вы сталкиваетесь с типичным вариантом использования хэш-карты.