Зарегистрируйтесь, чтобы продолжить обучение

Деструктуризация JS: Объекты

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

const greeting = `${user.company.name} was founded in ${user.company.createdAt}`
console.log(greeting)

Разработчики стараются сократить такой код и создают промежуточные константы для вложенных данных:

const company = user.company
const greeting = `${company.name} was founded in ${company.createdAt}`
console.log(greeting)

Чем больше обращений к вложенным данным, тем полезнее эта техника. Но само извлечение данных может стать громоздким, если этих данных много. Пример из реальной жизни:

const response = {
  data: {
    type: 'photos',
    id: '550e8400-e29b-41d4-a716-446655440000',
    attributes: {
      title: 'Ember Hamster',
      src: 'http://example.com/images/productivity.png',
    },
    relationships: {
      author: {
        links: {
          related: 'http://example.com/articles/1/author',
        },
      },
    },
    links: {
      self: 'http://example.com/photos/550e8400-e29b-41d4-a716-446655440000',
    },
  },
}

Это данные вымышленного приложения представленные в виде формата jsonapi. Он, например, используется на Хекслете для взаимодействия серверной и клиентской части сайта. Внутри клиента эти данные извлекаются и выводятся на экран. Представьте себе, как бы мог выглядеть код извлечения внутренностей этой структуры:

const user = response.data.attributes
const links = response.data.links
const author = response.data.relationships.author

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

Деструктуризация (destructuring) — специальный синтаксис, позволяющий извлекать части из составных данных. Это удобный способ раскладывать объекты на части. Он позволяет сократить код и сделать его более понятным.

const person = { firstName: 'Rasmus', lastName: 'Lerdorf', manager: true }

const { firstName, manager } = person

console.log(firstName) // => 'Rasmus'
console.log(manager) // => true

Деструктуризация похожа на создание объекта. Абсолютно тот же самый синтаксис, но теперь не для создания объекта, а для разложения его на части. Деструктуризация позволяет раскладывать объект по частям, то есть не обязательно извлекать все части сразу. В примере выше у объекта три свойства, но извлекаются только два. Порядок описания свойств при извлечении не важен.

При деструктуризации можно менять имена. Такое бывает нужно, если подобная константа уже определена выше.

const manager = /* ... */; // имя занято

const person = { firstName: 'Rasmus', lastName: 'Lerdorf', manager: true };

const { manager: isManager } = person;

console.log(isManager); // => true

В случае отсутствия свойств в объекте, деструктуризация позволяет задавать значения по умолчанию для таких свойств:

const person = { firstName: 'Rasmus', lastName: 'Lerdorf' }

console.log(person.manager) // undefined
const { manager = false } = person
console.log(manager) // => false

Деструктуризация может быть вложенной. Она позволяет извлекать части объектов на любую глубину. Поэтому наш пример выше можно переписать так:

// const user = response.data.attributes;
// const links = response.data.links;
// const author = response.data.relationships.author;

const { links, attributes: user, relationships: { author } } = response.data

У spread оператора есть похожий, но выполняющий обратное действие оператор, называемый rest. С его помощью во время деструктуризации можно собрать все оставшиеся свойства в один объект:

const user = { name: 'Tirion', email: 'support@hexlet.io', age: 44 }

const { name, ...rest } = user

console.log(rest)
// => { email: 'support@hexlet.io', age: 44 }

Деструктуризация хоть и не является обязательным элементом и она не влияет на архитектуру программ, но ее использование делает код чище и понятнее (если не увлекаться глубиной).

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff