Словарь данных в 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. Такой подход часто делает код проще: вместо постоянного поиска по массиву мы сразу обращаемся к нужному ключу.