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.实现思路
- 对输入对象的键进行遍历。
- 针对Array类型,遍历各个元素如果是Object递归,外侧加
[]
(需要优先考虑Array因为Array的type也是Object) - 针对Object类型,如果是对象的话递归调用并将其结果累加到结果字符串上,外侧加
{}
- String类型添加,外侧加
""
- 非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
}