그럼에도 불구하고

👨‍💻

[CleanCode] 배열 다루기 본문

JavaScript/Clean code

[CleanCode] 배열 다루기

zenghyun 2023. 6. 1. 09:47

오늘은 배열에 대한 여러 가지 특징에 대해 알아보겠습니다.

 

목차

     

    [ JavaScript의 배열은 객체다. ]

    JavaScript의 배열은 객체와 마찬가지입니다. 

     

     

    그렇기 때문에 내가 확인하고 싶은 값이 정말 배열인지 확인하고 싶을 때는 Array.isArray() 메서드를 사용하는 게 좋습니다.

     

    \

     

    위와 같이 array를 arr.length와 같이 비교해서 그 값이 배열인지 확인하는 경우가 종종 있는데 배열뿐 만 아니라 문자열의 경우도 length로 비교할 수 있으니 오류를 유발할 수 있습니다. 

     

    그렇기에 2번과 3번의 방법으로 비교하는 방법도 있는데 2번보다는 3번이 가장 확실한 비교 방법입니다. 

     

    [ Array.length는 배열의 길이를 보장하지 못한다. ]

     

     

    배열은 내가 원하는 index에 값을 자유롭게 넣을 수 있기 때문에 확장성이 용이합니다.

     

    배열의 길이를 임의로 늘리거나, 기존 인덱스 순서에 맞지 않는 곳에 값을 넣어도 오류 없이 들어가는 것을 볼 수 있습니다.

     

    그렇기 때문에 Array.length가 배열의 길이를 보장할 수 없습니다. 

     

    이 점을 이용하면, 다음과 같은 응용도 가능합니다.

     

     

    [ 배열 요소에 접근하기 ]

     

    배열의 index는 0부터 시작하는 건 누구나 알고 있지만, 사람이 작성하기에 실수가 일어날 수 있습니다.

    index [0], index [1]과 같이 쓰는 것보다는 아래와 같이 사용하는 건 어떨까요?

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    /**
     * 배열 요소에 접근하기
     */
     
    // 1
     
    function operateTime(input, operators, is) {
      inputs[0].split("").forEach((num) => {
        cy.get(".digit").contain(num).click();
      });
     
      inputs[1].split("").forEach((num) => {
        cy.get(".digit").contains(num).click();
      });
    }
     
    // 2
     
    function operateTime(input, operators, is) {
      const [firstElement, secondElement] = input;
     
      firstElement.split("").forEach((num) => {
        cy.get(".digit").contain(num).click();
      });
     
      secondElement.split("").forEach((num) => {
        cy.get(".digit").contains(num).click();
      });
    }
     
    // 3
     
    function operateTime([firstElement, secondElement], operators, is) {
      firstElement.split("").forEach((num) => {
        cy.get(".digit").contain(num).click();
      });
     
      secondElement.split("").forEach((num) => {
        cy.get(".digit").contains(num).click();
      });
    }
     
    operateTime([12], 12);
    cs

     

    다른 예시도 살펴보겠습니다. 

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
     * 배열 요소에 접근하기
     */
     
    // 1
     
    function clickGroupButton() {
      const confirmButton = document.getElementsByTagName("button")[0];
      const cancelButton = document.getElementsByTagName("button")[1];
      const resetButton = document.getElementsByTagName("button")[2];
     
      // ...some code
    }
     
    // 2
     
    function clickGroupButton() {
      const [confirmButton, cancelButton, resetButton] =
        document.getElementsByTagName("button");
     
      // ...some code
    }
     
    cs

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /**
     * 배열 요소에 접근하기
     */
     
     
    // 1
     
    function formatDate(targetDate) {
        const date = targetDate.toISOString().split('T')[0];
     
        const [year, month, day] = date.split('-');
     
        return `${year}년 ${month}월 ${day}일`;
     
    }
     
    // 2
     
    function formatDate(targetDate) {
        const [date] = targetDate.toISOString().split('T'); // 구조 분해 할당은 하나일 때도 사용할 수 있다. 
     
        const [year, month, day] = date.split('-');
     
        return `${year}년 ${month}월 ${day}일`;
        
    }
     
    // 3 
     
    function head(arr) {
        return arr[0] ?? '';
    }
     
    function formatDate(targetDate) {
        const date = head(targetDate.toISOString().split('T')); 
     
        const [year, month, day] = date.split('-');
     
        return `${year}년 ${month}월 ${day}일`;
        
    }
    cs

     

    [ 유사 배열 객체 ]

     

    Array.from() 메서드를 사용하면 유사 배열 객체를 배열로 바꿀 수 있습니다.

     

      

    [ 배열의 불변성 (immutable) ]

    배열의 불변성을 유지하고 싶다면 아래와 같은 방법을 사용할 수 있습니다.

     

     

    [ 배열 고차 함수 & 배열 메서드 체이닝 ]

     

    금액을 담은 배열이 있을 때 아래와 같은 조건으로 나열하는 방법에 대해 알아보겠습니다. 

     

     

    filter, sort, map, forEach 등등 배열 고차 함수를 사용하면 배열을 조건에 맞게 사용할 수 있습니다. 

     

    [ map vs forEach ]

    map과 forEach는 얼핏 보면 비슷한 결과를 도출해 내는 것 같지만 결괏값의 유무에 큰 차이점이 있습니다. 

     

    📌  결과 값 ( return )

    map: 결과 값이 존재한다. 

    forEach: 결과 값이 존재하지 않는다. ( undefined )

     

     

     

    그렇다면 forEach는 어떤 경우에 사용하는 것이 적합할까요?

     

    아래의 코드에서는 forEach와 map모두 console.log를 출력하지만 결괏값(return)을 반환할 필요가 없다는 점에서 forEach를 사용하는 것이 보다 적합합니다. 

     

     

    [ Continue & Break ]

     

    고차 함수의 경우 continue와 break문이 동작하지 않기 때문에 다음과 같이 사용할 수 있습니다. 

     

     

    'JavaScript > Clean code' 카테고리의 다른 글

    [CleanCode] 함수 다루기  (1) 2023.06.04
    [CleanCode] 객체 다루기  (0) 2023.06.02
    [CleanCode] 분기다루기  (0) 2023.05.30
    [CleanCode] 경계 다루기  (0) 2023.05.25
    [CleanCode] isNaN? is Not A Number?  (0) 2023.05.24
    Comments