Словарь данных в JavaScript

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

Например, у нас есть код статуса, а на странице нужно показать понятный текст. Это как раз задача для словаря.

let statusNames = {
  draft: 'Черновик',
  published: 'Опубликовано',
  archived: 'В архиве',
}

statusNames.published // 'Опубликовано'
statusNames['archived'] // 'В архиве'

Такой словарь часто еще называют справочником или таблицей соответствий.

Зачем нужен словарь

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

Без словаря пришлось бы каждый раз искать нужный элемент в массиве.

let users = [
  { id: 1, name: 'Alex' },
  { id: 2, name: 'Maria' },
  { id: 3, name: 'Ivan' },
]

let user = users.find(user => user.id === 2)

Если поиск нужен один раз, это нормальный вариант. Но если получать пользователей по id нужно часто, удобнее подготовить словарь.

let usersById = {}

for (let user of users) {
  usersById[user.id] = user
}

usersById[2] // { id: 2, name: 'Maria' }

Словарь на объекте

Обычный объект хорошо подходит для простых словарей, где ключи являются строками или числами.

let roleNames = {
  admin: 'Администратор',
  editor: 'Редактор',
  guest: 'Гость',
}

roleNames.admin // 'Администратор'

Через квадратные скобки можно получать значение по переменной.

let role = 'editor'

roleNames[role] // 'Редактор'

Это полезно в функциях, где ключ приходит снаружи.

function getRoleName(role) {
  return roleNames[role] ?? 'Неизвестная роль'
}

getRoleName('admin') // 'Администратор'
getRoleName('owner') // 'Неизвестная роль'

Словарь на Map

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

let usersById = new Map()

usersById.set(1, { id: 1, name: 'Alex' })
usersById.set(2, { id: 2, name: 'Maria' })

usersById.get(2) // { id: 2, name: 'Maria' }

У Map есть понятные методы для работы со словарем.

usersById.has(1) // true
usersById.delete(1)
usersById.size // 1

Если словарь нужно перебирать, Map тоже читается удобно.

for (let [id, user] of usersById) {
  console.log(id, user.name)
}

Объект или Map

Для небольших статичных справочников чаще всего хватает объекта.

let paymentLabels = {
  card: 'Банковская карта',
  cash: 'Наличные',
  online: 'Онлайн-оплата',
}

Map лучше подходит, когда словарь больше похож на коллекцию: записи создаются, удаляются, перебираются, а ключи не всегда являются строками.

let selectedUsers = new Map()

selectedUsers.set(1, { name: 'Alex' })
selectedUsers.set(2, { name: 'Maria' })
selectedUsers.delete(1)

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

Итого

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