JSON.stringify는 객체를 JSON으로 변환하는 메소드
직렬화(serialize)라고도 한다.
Boolean이 input으로 주어졌을 경우
stringifyJSON(true); // 'true'
String이 input으로 주어졌을 경우
stringifyJSON('foo'); // '"foo"'
Array가 input으로 주어졌을 경우
stringifyJSON([1, 'false', false]); // '[1,"false",false]'
Object가 input으로 주어졌을 경우
stringifyJSON({ x: 5 }); // '{"x":5}'
undefined, function이 주어졌을 경우
stringifyJSON(undefined) // undefined
stringifyJSON(function(){}) // undefined
stringifyJSON({ x: undefined, y: function(){} }) // '{}'
<테스트 자료>
const stringifiableObjects = [
9,
null,
true,
false,
"Hello world",
[],
[8],
["hi"],
[8, "hi"],
[1, 0, -1, -0.3, 0.3, 1343.32, 3345, 0.00011999],
[8, [[], 3, 4]],
[[[["foo"]]]],
{},
{ a: "apple" },
{ foo: true, bar: false, baz: null },
{ "boolean, true": true, "boolean, false": false, null: null },
// basic nesting
{ a: { b: "c" } },
{ a: ["b", "c"] },
[{ a: "b" }, { c: "d" }],
{ a: [], c: {}, b: true },
];
3가지로 나눠볼 수 있다
객체나 배열이 아닌 경우
1) number, null, boolean 문자열로 리턴
2) string 일때는 앞뒤로 "" 추가로 넣어줘야 한다
배열인 경우
Array.isArray로 배열인지 확인한 뒤 stringifyJSON(재귀함수)을 사용해서 새배열에 넣어준뒤 리턴해주면 된다
객체인 경우
객체의 키에 undefined or 값에 함수, undefined 가 들어왔을 경우 {}리턴
나머지 경우에 속성 : 값 형태의 문자열로 저장한 뒤 리턴
function stringifyJSON(obj) {
if(typeof obj === 'number' || obj === null || typeof obj === 'boolean' ){
return `${obj}`;
}
// typeof obj === null 으로 작성하면 object 이다
if(typeof obj === 'string'){
return `"${obj}"`;
}
if(Array.isArray(obj)){
let newArr = []
for(let el of obj){
let arrEl = stringifyJSON(el)
newArr.push(arrEl)
}
return `[${newArr}]`
}
// newArr를 ``를 사용해 문자열로 변환시키면 배열 껍데기가 벗겨지므로 배열로 다시 감싸줘야 한다.
// typeof obj에서 배열인 경우를 위에 적어줬기 때문에 배열을 제외시킬 수 있다
if(typeof obj === 'object'){
let newObj = '';
for(let key in obj){
let objKey = stringifyJSON(key)
let objVal = stringifyJSON(obj[key])
if(objKey === undefined ||typeof objVal =='function' || objVal === undefined){
newObj = ''
// 함수와 undefined는 stringify되지 않는다
}else{
newObj += `${objKey}:${objVal},`
// 속성 : 값 형태의 문자열로 저장
}
}
return `{${newObj.slice(0, newObj.length-1)}}`
}
// 문자열 마지막에 포함된 , 를 제거 후 반환
};