Деструктуризация

1. Деструктуризация объектов

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

Для этого в ES6 введен новый синтаксис — переменным внутри фигурных скобок присваиваются значения объекта. Если имя переменной и ключ объекта совпадают, то происходит присваивание. Если для переменной не нашлось подходящего ключа, то будет присвоен undefined.

const hotel = {
  name: 'Resort Hotel',
  stars: 5,
  capacity: 100,
};

// Объявим переменные и присвоим им значения из объекта
const { name, stars, status } = hotel;

console.log(name, stars, status); // "Resort Hotel", 5, undefined
Copy

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

const hotel = {
  name: 'Resort Hotel',
  stars: 5,
  capacity: 100,
};

const { name = 'hotel', stars = 3, status = 'empty' } = hotel;

console.log(name, stars, status); // "Resort Hotel", 5, "empty"
Copy

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

const hotel = {
  name: 'Resort Hotel',
  stars: 5,
  capacity: 100,
};

const { name: hotelName, stars, status: hotelStatus = 'empty' } = hotel;

console.log(hotelName, stars, hotelStatus);
// "Resort Hotel", 5, "empty"
Copy

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

const hotel = {
  name: 'Resort Hotel',
  stars: 5,
  capacity: 100,
};

const { name, ...rest } = hotel;

console.log(name); // "Resort Hotel"
console.log(rest); // {stars: 5, capacity: 100}
Copy

2. Деструктуризация массивов

Аналогично делается деструктуризация массивов, но с некоторыми особенностями:

  • Вместо {} используются []

  • Переменным, указанным в [], будут последовательно присваиваться значения элементов массива

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

В результате такой записи будут созданы 3 переменные и в них будут помещены элементы в нумерованном порядке - от 0 и до конца массива.

const rgb = [200, 255, 100];

const [red, green, blue] = rgb;

console.log(`Red: ${red}, Green: ${green}, Blue: ${blue}`);
// Red: 200, Green: 255, Blue: 100
Copy

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

const rgb = [200, 255, 100];
let red, green, blue;

[red, green, blue] = rgb;

console.log(`Red: ${red}, Green: ${green}, Blue: ${blue}`);
// Red: 200, Green: 255, Blue: 100
Copy

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

const rgb = [200, 100, 255];

const [red, green, blue, alfa = 0.3] = rgb;

console.log(`Red: ${red}, Green: ${green}, Blue: ${blue}, Alfa: ${alfa}`);
// Red: 200, Green: 100, Blue: 255, Alfa: 0.3
Copy

Иногда из массива необходимо деструктуризировать только первые n элементов, а остальные сохранить в одну переменную в виде массива. При деструкции массива можно распаковать и присвоить оставшуюся часть элементов массива переменной, используя операцию ... (rest).

const rgb = [200, 255, 100];

const [red, ...colors] = rgb;

console.log(`Red: ${red}, Colors: ${colors}`);
// Red: 200, Colors: [255, 100]
Copy

Элементы можно пропускать. Допустим, из массива rgb необходимо взять только последнее значение. Используется это крайне редко.

const rgb = [200, 100, 255];

const [, , blue] = rgb;

console.log(`Blue: ${blue}`); // Blue: 255
Copy

3. Дополнительные материалы

Last updated