Объекты и деструктуризация
Сокращённая запись, spread, деструктуризация, Object.entries и groupBy.
Обновлено
Что такое объект
Объект — набор пар ключ → значение. Если массив отвечает на вопрос «какой третий элемент?», то объект — «какое имя? а возраст?».
const user = {
name: 'Ana', // ключ: значение
age: 30,
isAdmin: false,
address: { city: 'Казань' }, // значением может быть другой объект
greet() { return `Привет, ${this.name}` }, // или функция (метод)
}Объекты описывают одну вещь с несколькими свойствами: пользователя, товар, заказ, конфигурацию компонента, props в React.
Массив или объект?
| Массив | Объект | |
|---|---|---|
| Доступ | по позиции ([0]) |
по имени (.name) |
| Порядок | важен | не важен (на практике) |
| Для | списков похожих вещей | описания одной вещи / словаря |
| Пример | products |
product |
Чаще всего — массив объектов: список товаров, где каждый товар — объект.
Создание — полезный синтаксис
const name = 'Ana'
const field = 'email'
const user = {
name, // сокращение — то же, что name: name
[field]: 'ana@x.com', // вычисляемый ключ — ключ = значение field
'full-name': 'Ana Petrova', // ключ со спецсимволами — в кавычках
}Доступ — виды и когда
| Синтаксис | Когда | Пример |
|---|---|---|
obj.key |
ключ фиксирован и известен | user.name |
obj[expr] |
ключ в переменной или со спецсимволами | user[field], obj['full-name'] |
obj?.key |
объекта может не быть | user?.address?.city |
'key' in obj / Object.hasOwn(obj, 'key') |
проверить, существует ли ключ | не то же, что «значение truthy» |
Несуществующее свойство → undefined (не ошибка). Ошибка будет, только если читать что-то из undefined: undefined.city → TypeError. Отсюда ?..
Деструктуризация — достаём поля в переменные
const { name, age } = user // две переменные
const { name: userName } = user // переименование
const { role = 'user' } = user // значение по умолчанию
const { address: { city } } = user // вложенная
const { password, ...safeUser } = user // убрать один ключ, остальное сохранитьЧаще всего — в параметрах, именно так выглядят props компонента:
function Card({ title, children, variant = 'default' }) { ... }Spread — копирование и объединение
const updated = { ...user, age: 31 } // копия + один изменённый ключ
const settings = { ...defaults, ...userPrefs } // для одного ключа побеждает последнее значениеSpread делает поверхностную копию — вложенные объекты остаются общими. Подробнее — в Ссылки и иммутабельность.
Перебор объекта
| Метод | Возвращает |
|---|---|
Object.keys(obj) |
['name', 'age'] |
Object.values(obj) |
['Ana', 30] |
Object.entries(obj) |
[['name', 'Ana'], ['age', 30]] |
Object.fromEntries(entries) |
обратное к entries |
Рецепт «преобразовать объект как массив»:
const prices = { apple: 2, pear: 3 }
const doubled = Object.fromEntries(
Object.entries(prices).map(([fruit, price]) => [fruit, price * 2]),
)Группировка
Object.groupBy(products, p => p.category)
// { laptops: [...], accessories: [...] }Объект как словарь (lookup)
Если часто ищете по id, превратите массив в объект (или Map) — поиск станет мгновенным:
const byId = Object.fromEntries(users.map(u => [u.id, u]))
byId[42] // вместо users.find(u => u.id === 42) каждый разКоротко
- Объект = ключ → значение; описывает одну вещь.
.keyдля фиксированных ключей,[expr]для динамических,?.— если может отсутствовать.- Деструктуризация достаёт поля, spread копирует и объединяет.
Object.entries+fromEntriesдля преобразований.