[JavaScript] 시리얼라이저(JSON.stringify) 만들기

yezo cha·2021년 6월 16일
0

JavaScript

목록 보기
15/19
post-thumbnail
post-custom-banner

시리얼라이저(JSON.stringify) 만들기

내장함수 JSON.strinify와 동일하게 동작하는 stringify함수, 시리얼라이저를 만들어 보자.

JSON의 구조를 살펴보면, JSON은 string, number, boolean, null 그리고 배열array, 객체object 까지 총 6개의 자료형을 지원한다.

먼저, string, number, boolean, null 을 생각해보자.

function stringify(obj) {
    if (obj === null) {
        return 'null';
    }
    if (typeof obj === 'number') {
        return `${obj}`;
    }
    if (typeof obj === 'boolean') {
        return obj ? 'true' : 'false';
    }
    if (typeof obj === 'string') {
        return `"${obj}"`;
        // return `"${obj.replace('"', '\\"')}"`;
    }

}

그 다음은 배열array을 생각해 보자. 배열 내부는 재귀함수를 활용하면 쉽게 처리할 수 있다.

// Array가 input으로 주어졌을 경우
// stringifyJSON([1, 'false', false]); // '[1,"false",false]'

function stringify(obj) {
  	
    /* ...생략... */
  
    if (Array.isArray(obj)) {
        const result = [];
        obj.forEach(function (el) {
            result.push(stringify(el))
        })
        return `[${result}]`;
    }
}
/****** 처음 내 코드 ******/
function stringify(obj) {
    /* ...생략... */
  
   if (Array.isArray(obj)) {
      let temp = [];
      if (obj.length === 0) {
        return '[]';
      } else {
        for (let i of obj) {
          temp.push(stringify(i));
        }
      }
      return '[' + String(temp) + ']';
    }
}

마지막으로 객체object를 만들어 보자.
위에서 string, number, boolean, null 그리고 배열array까지 처리했기 때문에 나머지 케이스는 전부 객체object라고 생각하자.

fuction stringify(obj) {
  /* ...생략... */
  
  if (Object.keys(obj).length === 0) {
        return '{}';
    } else {
        let strObj = '';
        for (let prop in obj) {
            if (obj[prop] === undefined || typeof obj[prop] === 'function') {
                delete obj[prop];
                stringifyJSON(obj);
            } else {
                strObj += stringify(prop) + ':' + stringify(obj[prop]) + ',';
            }
        }
        strObj = strObj.slice(0, strObj.length - 1);
        return `{${strObj}}`;
    }
}

이렇게도 가능인데.... 이스케이프 문자 모르겠음..

function stringify(obj) {
  /* ...생략... */
  
      return `{${Object.entries(value).map(([k, v]) =>
        `"${k.replace('"', '\\"')}":${stringify(v)}`).join(",")}}`;
}

세 가지 방법으로 코드를 작성해봤는데, 그건 깃허브에 올려둠..
역시 레퍼런스 코드가 제일 깔끔하다
연습 많이 해 보자 !

profile
(ง •̀_•́)ง
post-custom-banner

0개의 댓글