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

JavaScript에서 문자열을 중첩 JSON 객체로 변환하는 방법

문제 소개

문자가 두 개씩 짝지어져 있는 특수한 형태의 문자열이 있다고 가정해 보겠습니다.

const str = "AABBCCDDEE";

이 문자열을 기반으로 아래와 같은 구조의 객체를 만들어야 합니다.

const obj = {
    code: "AA",
    sub: {
        code: "BB",
        sub: {
            code: "CC",
            sub: {
                code: "DD",
                sub: {
                    code: "EE",
                    sub: {}
                }
           }
       }
   }
};

접근 방식

문자열에서 두 글자씩 잘라낼 때마다 새로운 sub 객체가 생성되고, 각 레벨의 code 속성은 해당 위치의 두 글자를 담게 됩니다.

이 문제는 재귀(recursion)로도 해결할 수 있지만, 실제로는 참조(reference) 변수를 활용한 반복문 방식이 더 직관적입니다. 핵심 아이디어는 다음과 같습니다.

  • 결과 객체를 담을 변수 res와, 현재 작업 위치를 가리키는 참조 변수 ref를 선언합니다.
  • 문자열이 남아 있는 동안 앞의 두 글자를 잘라내어 ref.code에 할당하고, 빈 sub 객체를 만든 뒤 ref를 그 하위 객체로 이동시킵니다.
  • 이 과정을 반복하면 자동으로 깊은 중첩 구조가 완성됩니다.

예제 코드

전체 코드는 다음과 같습니다.

const str = "AABBCCDDEE";
const constructObject = str => {
    const res = {};
    let ref = res;
    while(str){
        const words = str.substring(0, 2);
        str = str.substr(2, str.length);
        ref.code = words;
        ref.sub = {};
        ref = ref.sub;
    };
    return res;
};
console.log(JSON.stringify(constructObject(str), undefined, 4));

코드 설명

여기서 주목할 부분은 ref = ref.sub; 라인입니다. ref는 단순히 값을 복사하는 것이 아니라 객체 자체를 참조하기 때문에, ref.sub로 이동하면 다음 반복에서 ref.coderef.sub에 값을 할당하는 것이 곧 실제 중첩 객체 내부에 값을 쓰는 것이 됩니다. 덕분에 재귀 함수 없이도 원하는 깊이만큼 객체를 계속 확장해 나갈 수 있습니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

{
    "code": "AA",
    "sub": {
        "code": "BB",
        "sub": {
            "code": "CC",
            "sub": {
                "code": "DD",
                "sub": {
                    "code": "EE",
                    "sub": {}
                }
           }
       }
   }
}

마무리

참조 변수를 활용하면 재귀 호출의 스택 오버플로우 걱정 없이도 임의의 길이를 가진 문자열을 안전하게 중첩 객체 구조로 변환할 수 있습니다. 트리 구조 생성, 카테고리 분류 데이터 변환 등 다양한 상황에서 응용할 수 있는 유용한 패턴이니 꼭 기억해 두시기 바랍니다.