json.stringify发生的顺序问题
与后端对接中,发送的请求要进行验签,验签要求发送的数据必须是按照A-Z进行排序。使用sort()进行排序后在用json.stringify进行序列化。
问题:多层嵌套的对象进行排序后,使用json.stringify进行序列化时出错了,他将内部排好的序变回了一开始的顺序。
//初始数据
var item = {
desc: "测试1",
code: "123",
stage: [
{
stagedesc: "阶段1",
stagecode: "123456",
stageqty: 0,
stagelongtime: 60,
stageseq: 1,
stageproject: [
{
projectcode: "456",
projectdesc: "P1"
}
]
}
]
};
使用sort进行排序后
使用json.stringify后
{"code":"123","desc":"测试1","stage":[{"stagedesc":"阶段1","stagecode":"123456","stageqty":0,"stagelongtime":60,"stageseq":1,"stageproject":[{"projectcode":"456","projectdesc":"P1"}]}]}
可看出内部顺序乱了,变成了一开始的顺序
思路
多层对象排序json转化,只有第一层的顺序是改变的,而这是把排序好的赋给空对象。根据这个结果猜测,得若每层都都为空数组,然后再把排序的值赋值进去,在转化,应该能行
代码
function keySort(obj) {
//排序
var newkey = Object.keys(obj).sort();
var newObj = {};
for (var i = 0; i < newkey.length; i++) {
newObj[newkey[i]] = obj[newkey[i]];
}
return newObj
}
//第一层
let newObj = {};
newObj = keySort(item)
newObj.stage = []
item.stage.forEach(e => {
//第二层排序
e = keySort(e)
let temp = []
e.stageproject.forEach(row => {
//第三层排序
item = keySort(row)
temp.push(row)
})
e.stageproject = temp
newObj.stage.push(e)
})
//转化
newObj = JSON.stringify(newObj)
console.log(newObj);
大功告成!