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
| 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 })
jsonStringify([1, "false", false])
jsonStringify({ b: undefined })
|
为了能实现排序,需要对代码进行一些修改:
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))
|