재귀 - stringifyJSON() 구현

Seol·2020년 8월 22일
0

JSON.stringify()

JSON.stringify 함수는 입력받은 값을 JSON 형식으로 변환한다. undefind와 fubction은 JSON으로 생략되거나 null로 변환된다.
JSON.stringify()는 다음과 같이 작동한다

  • boolean을 입력 받을 때 - JSON.stringify(true) -> 'true'
  • 문자열을 입력 받을 때 - JSON.stringify('foo') -> '"foo"'
  • 배열를 입력 받을 때 - JSON.stringify([1,'false',false]) -> '[1,"false",false]'
  • 객체를 입력 받을 때 - JSON.stringify({x:5}) -> '{"x":5}'
  • undefined, 함수를 입력 받을 때
    JSON.stringify(undefined) -> undefined
    JSON.stringify(function(){}) -> undefined
    JSON.stringify({x:undefiend, y:function(){}) -> '{}'

JSON.stringify()의 기능을 stringifyJSON() 함수로 직접 구현하였다.
입력값으로 배열과 객체가 입력 받을 수 있고 배열과 객체의 각 요소에 대해 함수를 적용해주어야 하기 때문에 재귀로 구현할 수 있다.

알고리즘

1. 입력값이 undefined 또는 함수일 때 undefined를 반환
if(typeof obj === 'function' || typeof obj === 'undefined'){
  return undefined;
}
2. 입력값이 문자열인 경우 문자열의 양쪽 끝에 "를 추가한 새로운 문자열 반환
if(typeof obj === 'string'){
  return '\"' + obj + '\"';
}
3. 입력값이 문자열이 아닌 데이터(숫자, boolean, null)일 때는 입력값에 String()메서드를 적용하여 반환
return String(obj); 
/* 
실제 코드에서는 가장 마지막에 작성(배열, 객체, 문자열의 모든 조건에 만족안되는 경우에 실행)
null의 type은 object이기 때문에 객체와 따로 구분해줘야함.
*/
4. 입력값이 배열일 때 배열의 요소에 각각 stringifyJSON함수를 적용시켜주고 그 결과를 배열에 저장
if(Array.isArray(obj)){
   let temp = [];
 }
(1) 빈 배열[] 인 경우 빈 배열 '[]' 을 반환
if(obj.length === 0){
  return '[]';
}
(2) 빈 배열이 아닌 경우 배열의 길이 만큼 stringifyJSON()함수를 반복 실행(재귀) 결과값을 배열 temp에 push
else{
  for(let i = 0; i < obj.length; i++){
    push(stringifyJSON(obj[i]));
  }
}
(3) 배열 temp를 문자열로 변환시켜 준 후 '[문자열(temp)]' 형태로 반환
return '[' + String(temp) + ']'
5.입력값이 객체일 때 객체의 각각의 속성과 값들에 stringifyJSON함수를 적용해주고 그 결과를 문자열에 저장
if(typeof obj === 'object' && obj !== null){ //null은 object타입이라서 예외처리
  let str = '';
}
(1) 빈 객체인 경우 빈 객체 '{}'을 반환
if(Object.keys(obj).length === 0){   // 객체의 길이
  return '{}'
}
(2) 빈 객체가 아닌 경우 객체의 값에 undefined 또는 함수가 들어있으면 빈객체 '{}'을 반환해주고 아니라면 '속성:값,'형태의 문자열로 저장
else{
  for(let prop in obj){
    if(typeof obj[prop]=='function' || obj[prop] === undefined){
      return '{}';
    }
  let p = stringifyJSON(prop);
  obj[prop] = stringifyJSON(obj[prop]);
  str += p+':'+obj[prop];
  str +=',';
}
(3) 문자열 마지막에 포함된 ','를 제거 후 '{str}' 형태로 반환
str=str.slice(0,-1);
return '{'+str+'}';

코드

function stringifyJSON(obj) {
  if(typeof obj === 'function' || typeof obj == 'undefined'){
    return undefined;
  }
  if(Array.isArray(obj)){
    let temp = [];
    if(obj.length === 0){
      return '[]';
    }
    else{
      for(let i = 0; i < obj.length; i++){
        temp.push(stringifyJSON(obj[i]));                 
      }                                                 
    }  
    return '[' + String(temp) + ']';  
  }
  else if(typeof obj === 'object' && obj !== null){
    let str ='';
    if(Object.keys(obj).length === 0){
      return '{}';
    }else{
      for(let prop in obj){
        if(typeof obj[prop]=='function' || obj[prop] === undefined){
          return '{}';
        }
        let p = stringifyJSON(prop);
        obj[prop] = stringifyJSON(obj[prop]);
        str += p+':'+obj[prop];
        str +=',';
      }
      str=str.slice(0,-1);
      return '{'+str+'}';
    }
  }
  else if(typeof obj === 'string'){
    return '\"' + obj + '\"';
  }
  return String(obj);
}
profile
🔥공부🔥

0개의 댓글