본문 바로가기
Frontend/JavaScript

JavaScript : 구조분해할당(Distructuring)에 대해 알아보자

by 코딩쥐 2024. 8. 5.

구조분해할당이란 배열이나 객체의 속성을 해체해서 그 값을 개별 변수에 담을 수 있게 하는 표현식을 얘기한다. 객체나 배열에서 데이터 전체가 아닌 일부분만 필요한 경우가 생기는데, 이럴 때 일부분만 '분해'할 수 있도록 하는 표현식이다.

 

Array 구조분해할당

  • let [item1, item2=default, ..., rest] = array

구조분해할당이 나오기 이전에는 일부분의 데이터를 추출하기 위하여 배열의 index를 사용해 값을 추출하여 사용하거나, 변수를 교환하기 위해서는 임시 변수가 필요했었다. 구조분해할당을 통해서 이러한 점들을 간편하게 할 수 있게 되었다.

array의 첫번째, 두번째 요소는 각각 item1과 item2에 저장되고 array의 2번째 요소가 값이 없을 경우 default parameter의 값으로 반환된다. 이어지는 나머지 요소들은 배열로 rest에 저장된다.

 

두 변수의 값 교환

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let name1 = "코딩쥐";
        let name2 = "티스토리";

        // 두 변수의 값 교환
        [name1, name2] = [name2, name1];

        console.log(name1, name2); // 티스토리 코딩쥐
    </script> 
</body>

</html>

 

배열 데이터 추출

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const arr1 = [1, 2, [3, "a"], "b", "c", true];
        
        // 중간 값의 경우 콤마(,)를 통해 비우면 받지 않을 수 있다.
        let[one, two,,,three,,four] = arr1;
        const arr2 = [one,two,three,four];
        console.log(arr2); //  [1, 2, 'b', true]

        // 값이 없을 경우에는 undefined로 초기화 된다.
        let[a1,b1,,,,,,,,,,c1] = arr1;
        const arr3 = [a1,b1,c1];
        console.log(arr3); //[1, 2, undefined]

        // 배열 중간에 배열이 있을 경우 구조를 똑같이 적용하면 된다.
        let[,,[a2,b2],,,] = arr1;
        const arr4 = [a2,b2];
        console.log(arr4); // [3, 'a']
    </script> 
</body>

</html>

 

Rest Parameter와 Default Parameter 함께 사용

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const arr1 = [1,2,3,4,5,6,7,8];

        // Rest parameter을 사용해서 처음 3개만 변수로, 나머지는 배열로 받는법
        let[one,two,three, ...four] = arr1;
        console.log(one,two,three, four) // 1,2,3  (5) [4, 5, 6, 7, 8]

        // Default parameter을 사용해서 만약 값이 없을 경우 undefined이 아닌 기본 값 할당
        let[a1,a2,,,,,,,,a3=9] = arr1;
        console.log(a1,a2,a3); //1 2 9
    </script>
</body>

</html>


Obejct 구조분해할당

  • let{key1, key2 = default, ..., rest} = object

객체에서 구조분해할당을 시행할 때 불러올 key의 이름과 같아야 한다. object에서 key1이라는 키 값을 가지고 있는 프로퍼티가 저장되고, key2에는 key2라는 키 값을 가지고 있는 프로퍼티가 저장된다. 만약 key2라는 키 값이 없으면 default parameter로 설정된 값으로 반환된다. 이어지는 나머지 요소들은 객체로 rest에 저장된다. 

 

Object 데이터 추출

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const obj1 = {
            one: 1,
            two: 2,
            five: 5
        }

        // 해당하는 key가 없을 경우 undefined로 값을 저장한다.
        let { one, three } = obj1;
        console.log(one, three); // 1 undefined

        // 객체에서 일부 값을 객체로 가져오고 싶을 때 사용하는 방법
        let a1, b1;
        ({ one: a1, five: b2 } = obj1);
        console.log(a1, b2); // 1 5
        
        const obj2 = {
            one : a1,
            five : b2
        }
        console.log(obj2); //{one: 1, five: 5}

    </script>
</body>

</html>

 

Rest Parameter와 Default Parameter 함께 사용

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //Rest Parameter을 사용하면 나머지 값들은 객체로 저장된다.
        const options = {
            a: 1,
            b: 2,
            c: 3,
            d: 4
        }
        let{a,b, ... rest} = options
        console.log(rest); //{c: 3, d: 4}

        //Default Parameter을 사용하여 값이 없을 경우 값을 할당한다. 
        const box = {
            color: "brown"
        }
        let{width: w=100, height: h=100, color} = box;
        
        const box2 = {
            width : w,
            height: h,
            color
        }
        console.log(box2); //{width: 100, height: 100, color: 'brown'}

        // 객체 안에 배열, 객체 안에 객체가 있을 때
        const obj1 = {
            a: [1,2,3],
            b: {b_1 : "안녕"},
            c: false
        }

        let{
            a : [a1, a2, a3],
            b : {b_1 : bvalue},
            c} = obj1

        console.log(a1, a2, a3); //1 2 3
        console.log(bvalue); //안녕
        console.log(c); //false

    </script>
</body>

</html>