디스트럭쳐링(Destructuring)은 구조화된 배열 또는 객체를 Destructuring(비구조화, 파괴)하여 개별적인 변수에 할당하는 것이다. 배열 또는 객체 리터럴에서 필요한 값만을 추출하여 변수에 할당하거나 반환할 때 유용합니다.
1. 배열 디스트럭처링(Array Destructuring)
const arr = [2, 3, 4];
const [x, y, z] = arr;
console.log(x, y, z);
console.log(arr);
배열 디스트럭처링을 위해서는 할당 연산자 왼쪽에 배열 형태의 변수 리스트가 필요합니다.
let x, y, z;
[x, y, z] = [1, 2, 3];
let [x, y, z] = [1, 2, 3];
왼쪽의 변수 리스트와 오른쪽의 배열은 배열의 인덱스를 기준으로 할당됩니다.
let x, y, z;
[x, y] = [1, 2];
console.log(x, y); // 1 2
[x, y] = [1];
console.log(x, y); // 1 undefined
[x, y] = [1, 2, 3];
console.log(x, y); // 1 2
[x, , z] = [1, 2, 3];
console.log(x, z); // 1 3
// 기본값
[x, y, z = 3] = [1, 2];
console.log(x, y, z); // 1 2 3
[x, y = 10, z = 3] = [1, 2];
console.log(x, y, z); // 1 2 3
// spread 문법
[x, ...y] = [1, 2, 3];
console.log(x, y); // 1 [ 2, 3 ]
ES6의 배열 디스트럭처링은 배열에서 필요한 요소만 추출하여 변수에 할당하고 싶은 경우에 유용합니다.
const restaurant = {
name: 'Classico Italiano',
location: 'seoul 23, Korea',
categories: ['Italian', 'Pizza', 'Vegetarian', 'Organic'],
starterMenu: ['Bread', 'Salad', 'Focaccia'],
mainMenu: ['Pizza', 'Pasta', 'Risotto']
};
const [first, second] = restaurant.categories;
console.log(first, second);
배열안에 first, second 를 선언하고 객체의 property인 restaurant.categories 를 할당하면 순서대로,
'Italian', 'Pizza' 가 출력이 됩니다.
const [first, , second] = restaurant.categories;
만약 위의 객체에 위의 코드를 실행하면 두번째 요소는 skip을 하게되고 'Italian', 'Vegetarian' 를 출력하게 됩니다.
2. 객체 디스트럭처링 (Object destructuring)
// ES6 Destructuring
const obj = { firstName: 'Minsu', lastName: 'Kim' };
// 프로퍼티 키를 기준으로 디스트럭처링 할당이 이루어진다. 순서는 의미가 없다.
// 변수 lastName, firstName가 선언되고 obj(initializer(초기화자))가 Destructuring(비구조화, 파괴)되어 할당된다.
const { lastName, firstName } = obj;
console.log(firstName, lastName); // Minsu Kim
객체 디스트럭처링을 위해서는 할당 연산자 왼쪽에 객체 형태의 변수 리스트가 필요합니다.
// 프로퍼티 키가 prop1인 프로퍼티의 값을 변수 p1에 할당
// 프로퍼티 키가 prop2인 프로퍼티의 값을 변수 p2에 할당
const { prop1: p1, prop2: p2 } = { prop1: 'a', prop2: 'b' };
console.log(p1, p2); // 'a' 'b'
console.log({ prop1: p1, prop2: p2 }); // { prop1: 'a', prop2: 'b' }
// 아래는 위의 축약형이다
const { prop1, prop2 } = { prop1: 'a', prop2: 'b' };
console.log({ prop1, prop2 }); // { prop1: 'a', prop2: 'b' }
// default value
const { prop1, prop2, prop3 = 'c' } = { prop1: 'a', prop2: 'b' };
console.log({ prop1, prop2, prop3 }); // { prop1: 'a', prop2: 'b', prop3: 'c' }
객체 디스트럭처링은 객체에서 프로퍼티 이름(키)으로 필요한 프로퍼티 값만을 추출할 수 있습니다다. 아래의 코드를 살펴보자.
const todos = [
{ id: 1, content: 'HTML', completed: true },
{ id: 2, content: 'CSS', completed: false },
{ id: 3, content: 'JS', completed: false }
];
// todos 배열의 요소인 객체로부터 completed 프로퍼티만을 추출한다.
const completedTodos = todos.filter(({ completed }) => completed);
console.log(completedTodos); // [ { id: 1, content: 'HTML', completed: true } ]
Array.prototype.filter 메소드의 콜백 함수는 대상 배열(todos)을 순회하며 첫 번째 인자로 대상 배열의 요소를 받는다. 이때 필요한 프로퍼티(completed 프로퍼티)만을 추출할 수 있다.
중첩 객체의 경우는 아래와 같이 사용합니다.
const person = {
name: 'Lee',
address: {
zipCode: '03068',
city: 'Seoul'
}
};
const { address: { city } } = person;
console.log(city); // 'Seoul'
참고
'Language > JavaScript' 카테고리의 다른 글
[JavaScript] default parameter 설정하는 방법 (0) | 2021.01.13 |
---|---|
[JavaScript] spread 연산자와 Rest (0) | 2021.01.12 |
[JavaScript] 함수 호출 방식에 달라지는 this (0) | 2021.01.12 |
[JavaScript] 호이스팅(Hoisting) (0) | 2021.01.12 |
[JavaScript] Scope의 개념과 함수,블록 레벨 스코프 (0) | 2021.01.12 |
댓글