[JavaScript]List와Object_데이터_추출

JavaScript로 복잡한 데이터 구조 다루기: List와 Object 데이터 추출 전략 💡

데이터 리스트를 활용하는 방법은 다양하며, 그만큼 잊어버리기 쉬움.
이 글에서는 List 안에 List 안에 Object 형태의 복잡한 데이터를 추출하는 전략을 다룸


📚 데이터 구조 이해

다음과 같은 JSON 형태의 데이터 구조를 예시로 들겠음.
이는 여러 카테고리를 포함하고, 각 카테고리 안에 질문과 답변 객체 리스트를 가지고 있음

[
  "1번 카테고리 ": [
    {
      "id": 1,
      "question": "질문1",
      "answer": "답1"
    },
    {
      "id": 2,
      "question": "질문2",
      "answer": "답2"
    }
  ],
  "2번카테고리": [
    {
      "id": 3,
      "question": "질문3",
      "answer": "답3"
    },
    {
      "id": 4,
      "question": "질문4",
      "answer": "답4"
    }
  ],
  "7번카테고리": [
    {
      "id": 25,
      "question": "질문26",
      "answer": "답26"
    },
    {
      "id": 26,
      "question": "질문27",
      "answer": "답27"
    }
  ]
]

위 데이터에서 각 카테고리별 질문과 답변을 추출하는 것이 목표임.

🔑 카테고리 키 추출하기

먼저 데이터를 dataList 변수에 담음.
카테고리 이름을 키로 사용하고 있으므로, Object.keys()map()을 활용하여 키를 추출할 수 있음

const nameList = Object.keys(dataList[0]).map((data) => (
  <span
    key={data}
    style={{
      display: "inline-block",
      fontSize: "1.5rem",
      fontWeight: "bold",
      padding: "0.25rem 0",
    }}
  >
    {data}
  </span>
));

하지만 위 코드를 바로 실행하면 오류가 발생할 수 있다
React 환경에서 첫 렌더링 시 dataListundefined로 나올 때가 있어 map() 함수를 실행할 수 없다는 오류가 발생함
이를 해결하기 위해 if 문을 사용하여 dataList가 정의되었는지 확인하는 조건문을 추가했음

const nameList = dataList !== undefined ? Object.keys(dataList).map((key, index) => <div key={index}></div>) : null; // 예시 코드, 실제 구현은 위 span 태그를 활용

결과값: ["1번카테고리", "2번카테고리", ..., "7번카테고리"] 형태로 카테고리 키들이 추출됨


📝 질문과 답변 데이터 추출하기

카테고리 키를 추출한 후, 이제 해당 키의 값을 찾아 질문과 답변 데이터를 추출해야 함
Object.values()와 중첩된 map()을 사용하면 가능함

const dataDetail = Object.values(dataList[0]).map((data) =>
  data.map((data2) => (
    <div key={data2.id}>
      <p>
        {data2.question} / {data2.answer}
      </p>
    </div>
  ))
);

이 코드는 dataList의 값(즉, 각 카테고리의 리스트)을 순회하고,
각 리스트 내부의 객체(data2)에서 questionanswer 속성을 추출함.

결과값:
["질문1", "답1","질문2","답2"]
["질문3", "답3","질문4","답4"]
["질문26", "답26","질문27","답27"]
와 같이 각 카테고리별 질문과 답변 데이터가 추출됨.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다