手写JSON.stringfy基础版

644 阅读1分钟

JSON.stringify()  方法将一个 JavaScript 对象或值转换为 JSON 字符串

官方文档请去这里:developer.mozilla.org/zh-CN/docs/…

观察JSON.stringfy作用

JSON.stringify(null)
'null'
JSON.stringify(undefined)
undefined
JSON.stringify(1)
'1'
JSON.stringify("1")
'"1"'
JSON.stringify(true)
'true'
JSON.stringify([1,2,3])
'[1,2,3]'
JSON.stringify({a:1})
'{"a":1}'
JSON.stringify([null, undefined, 1, "1", true, [1,2,3], {a:{b:1}}])
'[null,null,1,"1",true,[1,2,3],{"a":{"b":1}}]'

开写

function toJSON (data) {
    const type = typeof data;
    switch (type) {
        case "string": 
            return `"${data}"`
        case "boolean":
        case "number":
            return data + ""
        case "undefined":
            return undefined
        case "object":
            if (data === null) { 
                return "null"
            } else if (Array.isArray(data)) {
                // 递归
                return `[${data.map(i => toJSON(i)).join(',')}]`
            } else {
                // 1. 先获取对象中的key-value二维数组
                const kvArr = Object.entries(data)
                // 2. 将key-value 进行toJSON
                const kvMap = kvArr.map(([key, value]) => { 
                    // 递归
                    return `"${key}":${toJSON(value)}`
                    // 注意:这里之所以键没用${toJSON(key)}
                    // 而是"${key}",是为了处理key为undefined情况
                })
                // 3. 拼接成'{"key":"value"}'的格式返回
                return `{${kvMap.join(',')}}`
                // 上面3步也可以合成1步
                // return `{${Object.entries(data).map(([key, value]) => `"${key}":${toJSON(value)}`).join(",")}}`;
            }
    }
}

目标输出

注:列表里有元素为undefined情况未处理

各位看官看下有没有好的方法解决,欢迎互动区评论!感谢!

之后想到好的方法我再补充!