JSON Stringfy 재귀로 구현하기

June hyoung Park·2020년 10월 6일
1

JavaScript

목록 보기
16/18
post-thumbnail

JSON.stringify() 메서드는 JavaScript 값이나 객체를 JSON 문자열로 변환합니다. 선택적으로, replacer를 함수로 전달할 경우 변환 전 값을 변형할 수 있고, 배열로 전달할 경우 지정한 속성만 결과에 포함합니다. - MDN

example

JSON.stringify({});                  // '{}'
JSON.stringify(true);                // 'true'
JSON.stringify('foo');               // '"foo"'
JSON.stringify([1, 'false', false]); // '[1,"false",false]'
JSON.stringify({ x: 5 });            // '{"x":5}'

자바스크립트의 내장 메서드인 JSON.stringify()는 자바스크립트 데이터를 JSON 문자열로 변환해주는 메서드이다. Object 나 Array를 받았을 경우 모두 string으로 변환해주며, 재귀를 이용하여 구현했다.

작동 방식

JSON.stringify() 메서드는 배열이든 객체든 내부의 값을 문자열로 변환해주는 메서드이기 때문에, 타입을 검사한 후 각 타입에 맞는 로직이 작동되어 반환해주도록 구현했다. 특히 객체의 의 property가 함수 (메서드)일 경우 ‘{}’이 출력된다. 또한 고차원 배열이나, 중첩 객체를 다루기 위해 재귀로 자신을 호출하며, 배열의 경우 빈 배열에 변환 된 값을push하여 리턴하고 객체의 경우 빈 문자열에 변환된 값을 '{' , '}' 로 감싸서 더해준다.

구현

function stringifyJSON(obj) {
  if (typeof obj === "boolean" || typeof obj === "number") {
    return String(obj);
  }
  if (Array.isArray(obj)) {
    let temp = [];
    if (obj.length === 0) {
      return "[]";
    } else {
      for (item of obj) {
        if (typeof item === "string") {
          temp.push(`"${item}"`);
        } else {
          temp.push(stringifyJSON(item));
        }
      }
    }
    return `[${temp}]`;
  } else if (typeof obj === "object" && obj !== null) {
    if (Object.keys(obj).length === 0) {
      return "{}";
    } else {
      let str = "";
      for (let prop in obj) {
        if (typeof obj[prop] == "function") {
          return "{}";
        }
        let key = stringifyJSON(prop);
        let val = stringifyJSON(obj[prop]);
        str += key + ":" + val;
        str += ",";
      }
      str = str.slice(0, -1);
      return `{${str}}`;
    }
  } else if (typeof obj === "string") {
    return `"${obj}"`;
  } else if (obj === null) {
    return "null";
  }
}
profile
Take me home~~~~

0개의 댓글