按 ASCII 排序的 stringify

JavaScript 是个奇怪的语言,譬如 Object 反序列化这件事就很诡异。

一直都很纠结,为什么 JSON 反序列化 stringify 不能自动把 key 排序好在转字符串,本来也没太在意,毕竟使用场景太少了,甚至说几乎没碰到过。

巧了,今天就碰到了。

在网上找了一圈,没找到现成的代码,那只能曲线救国,找 JSON.stringify() 的手写实现,于是让我找到了这个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// https://blog.csdn.net/qq_40028324/article/details/103135034
function jsonStringify (obj) {
let type = typeof obj;
if (type !== "object" || type === null) {
if (/string|undefined|function/.test(type)) {
obj = '"' + obj + '"';
}
return String(obj);
} else {
let json = []
arr = (obj && obj.constructor === Array);
for (let k in obj) {
let v = obj[k];
let type = typeof v;
if (/string|undefined|function/.test(type)) {
v = '"' + v + '"';
} else if (type === "object") {
v = jsonStringify(v);
}
json.push((arr ? "" : '"' + k + '":') + String(v));
}
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}")
}
}
jsonStringify({ x: 5 })
// "{"x":5}"
jsonStringify([1, "false", false])
// "[1,"false",false]"
jsonStringify({ b: undefined })
// "{"b":"undefined"}"
//  
// ————————————————
// 版权声明:本文为 CSDN 博主「宋哈哈」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/qq_40028324/article/details/103135034

为了能实现排序,需要对代码进行一些修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const data = {
b: { bb: [{ aaa: "111", bbb: "222" }], cc: [{ aaa: "111", bbb: "222" }], aa: [{ aaa: "111", bbb: "222" }] },
a: { aa: [{ bbb: "111", aaa: "222" }] }
}

function jsonStringify(obj) {
const type = typeof obj;
if (type !== "object" || type === null) {
if (/string|undefined|function/.test(type)) {
obj = "\"" + obj + "\"";
}
return String(obj);
} else {
const json = [];
const sdic = Object.keys(obj).sort();
const arr = (obj && obj.constructor === Array);

for (const k of sdic) {
let v = obj[k];
const type = typeof v;
if (/string|undefined|function/.test(type)) {
v = "\"" + v + "\"";
} else if (type === "object") {
v = jsonStringify(v);
}
json.push((arr ? "" : "\"" + k + "\":") + String(v));
}
return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
}
}
console.log(jsonStringify(data))
// {"a":{"aa":[{"aaa":"222","bbb":"111"}]},"b":{"aa":[{"aaa":"111","bbb":"222"}],"bb":[{"aaa":"111","bbb":"222"}],"cc":[{"aaa":"111","bbb":"222"}]}}

按 ASCII 排序的 stringify
https://bubao.github.io/posts/df426b2c.html
作者
一念
发布于
2021年4月14日
许可协议