내장함수 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(",")}}`;
}
세 가지 방법으로 코드를 작성해봤는데, 그건 깃허브에 올려둠..
역시 레퍼런스 코드가 제일 깔끔하다
연습 많이 해 보자 !