Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 map과 forEach를 활용해 객체 내부의 객체 배열을 파싱하는 방법

JSON 데이터를 다루다 보면 객체 안에 배열이, 그 배열 안에 또 다른 객체가 중첩된 복잡한 구조를 자주 만나게 됩니다. 이런 중첩 데이터를 효율적으로 처리하려면 JavaScript의 map()forEach() 같은 배열 메서드를 활용하는 것이 가장 효과적입니다. 아래 예제에서는 객체 내부의 객체 배열을 순회하면서 각 항목의 값을 추출해 화면에 출력하는 과정을 살펴보겠습니다.

예제 코드

다음은 map과 forEach를 사용해 객체 내부의 객체 배열을 파싱하는 전체 코드입니다.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
    body {
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    .result {
        font-size: 18px;
        font-weight: 500;
        color: rebeccapurple;
    }
</style>
</head>
<body>
<h1>Parse array of objects inside object</h1>
<div class="result"></div>
<button class="Btn">CLICK HERE</button>
<h3>Click on the above button to parse the json object</h3>
<script>
    let json = {
        storeData: [
            {
                items: [
                    {
                        itemID: 12,
                        cost: {
                            costNum: 100,
                        },
                    },
                    {
                        itemID: 22,
                        cost: {
                            costNum: 250,
                        },
                    },
                    {
                        itemID: 19,
                        cost: {
                            costNum: 350,
                        },
                    },
                ],
            },
        ],
    };
    let resEle = document.querySelector(".result");
    document.querySelector(".Btn").addEventListener("click", () => {
        let sum = 0;
        json.storeData.map((ele) => ({
            itemPrice: ele.items.forEach((item) => {
                resEle.innerHTML +=
                    "itemID : " +
                    item.itemID +
                    " : costNum : " +
                    item.cost.costNum +
                    "<br>";
            }),
        }));
    });
</script>
</body>
</html>

출력 결과

위 코드를 실행하면 다음과 같은 초기 화면이 표시됩니다.

JavaScript에서 map과 forEach를 활용해 객체 내부의 객체 배열을 파싱하는 방법

CLICK HERE 버튼을 클릭하면 클릭 이벤트 핸들러가 실행되어 JSON 객체 내부의 데이터를 순회하고, 다음과 같이 각 상품의 itemID와 costNum 값이 화면에 차례대로 출력됩니다.

JavaScript에서 map과 forEach를 활용해 객체 내부의 객체 배열을 파싱하는 방법

코드 동작 원리

  • 버튼을 클릭하면 addEventListener로 등록된 콜백 함수가 실행됩니다.
  • json.storeData.map(...)을 통해 storeData 배열의 각 요소에 접근합니다.
  • 각 요소 안의 items 배열에 대해 forEach()를 호출해 itemID와 cost.costNum 값을 읽어옵니다.
  • 읽어온 값은 문자열로 연결되어 innerHTML에 누적되고, .result 영역에 한 줄씩 표시됩니다.

map()과 forEach(), 어떤 것을 써야 할까?

두 메서드는 모두 배열을 순회한다는 점에서 비슷하지만 용도가 조금 다릅니다. forEach()는 단순히 각 요소에 대해 콜백을 실행할 뿐 새로운 배열을 반환하지 않습니다. 반면 map()은 콜백의 반환값을 모아 새로운 배열을 생성합니다. 따라서 위 예제처럼 화면에 값을 출력하는 등의 부수 효과(side effect)만 필요하다면 forEach()만으로 충분하고, 변환된 데이터를 새 배열로 받아 재사용해야 한다면 map()을 사용하는 것이 바람직합니다.