JS的JSON.stringify()的函数实现方法及思路

1 篇文章 0 订阅

JS的JSON.stringify()的函数实现方法及思路

1.JSON.stringify()的作用

该函数将JS对象转化为JSON格式的字符串,经常在前端向后端的发送数据时将所发对象进行这样的转换后传输。
例:

data = {
    "name": "alan",
    "object": {
        "value": [10, 25, { "name": "emma" }, 55],
        "flag": true,
        "func": ((Req, res) => {
            console.log("Req=" + Req);
            console.log("res=" + res);
        })
    },
    "sex": "fale",
    "play": {
        "ball": "basket",
        "fun": "have"
    }
}
console.log(JSON.stringify(data))

结果:
{"name":"alan","object":{"value":[10,25,{"name":"emma"},55],"flag":true},"sex":"fale","play":{"ball":"basket","fun":"have"}}
可以看到它对函数是不做处理直接跳过。正则表达式的话会乱码。

2.实现思路

  1. 对输入对象的键进行遍历。
  2. 针对Array类型,遍历各个元素如果是Object递归,外侧加[](需要优先考虑Array因为Array的type也是Object)
  3. 针对Object类型,如果是对象的话递归调用并将其结果累加到结果字符串上,外侧加{}
  4. String类型添加,外侧加""
  5. 非String类型直接添加(Number、Boolean等)

3.代码实现

/**
 * Return a string of JSON inline
 * @param {Object}} data 
 */
function myStringify(o) {
    let result = "{"
    let sep = "\""
    // 按照输入object的key遍历
    for (const key of Object.keys(o)) {
        // Array要有限考虑(因为typeof(Array)==="object")
        if (Array.isArray(o[key])) {
            result += sep + key + sep + ":" + "["
            for (const item of o[key]) {
                if (typeof (item) !== "object") {
                    result += item.toString() + ","
                }
                else {
                    result += myStringify(item) + ","
                }
            }
            if (result.endsWith(",")) {
                result = result.slice(0, result.length - 1)
            }
            result += "]"
        }
        // key对应的值为对象则递归
        else if (typeof (o[key]) === "object" && !Array.isArray(o[key])) {
            let temp = myStringify(o[key]);
            result += sep + key.toString() + sep + ":" + temp + ",";
        }
        // 类型为函数跳过
        else if (typeof (o[key]) === "function") {
            continue;
        }
        // 类型为字符串则直接转化但需在前后加双引号
        else if (typeof (o[key]) !== "string") {
            result += sep + key.toString() + sep + ":" + o[key].toString() + ","
        }
        // 字符串以外的Number Boolean 直接toString
        else {
            result += sep + key.toString() + sep + ":" + sep + o[key].toString() + sep + ","
        }
    }
    // 去掉末尾多余的逗号
    if (result.endsWith(",")) {
        result = result.slice(0, result.length - 1)
    }
    result += "}"
    return result
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值