我有像
这样的js对象{
a: 1,
b: 2,
c: 3
}
我想使用JSON.stringify以相同的顺序对上述对象进行字符串化。这意味着,stringify应该返回如下字符串,
"{"a":"1", "b":"2", "c":"3"}"
但如果我的js对象有太多属性超过500,它会像下面那样返回我,
"{"b":"2", "a":"1", "c":"3"}"
是否有任何选项可以获取我的js对象的json字符串,如asc中的排序。
答案 0 :(得分:2)
如果订单对您很重要,请不要使用JSON.stringify
因为订单使用它不安全,您可以使用javascript创建JSON字符串化,处理字符串值我们有两种不同的方式,首先使用正则表达式替换无效字符或使用JSON.stringify
作为我们的值,例如,如果我们有一个像'abc\d"efg'
的字符串,我们可以简单地得到正确的结果JSON.stringify('abc\d"efg')
,因为整个这个函数的想法是按正确的顺序进行字符串化:
function sort_stringify(obj){
var sortedKeys = Object.keys(obj).sort();
var arr = [];
for(var i=0;i<sortedKeys.length;i++){
var key = sortedKeys[i];
var value = obj[key];
key = JSON.stringify(key);
value = JSON.stringify(value);
arr.push(key + ':' + value);
}
return "{" + arr.join(",\n\r") + "}";
}
var jsonString = sort_stringify(yourObj);
如果我们想要这样做而不是使用JSON.stringify
来解析键和值,那么解决方案就像:
function sort_stringify(obj){
var sortedKeys = Object.keys(obj).sort();
var arr = [];
for(var i=0;i<sortedKeys.length;i++){
var key = sortedKeys[i];
var value = obj[key];
key = key.replace(/"/g, '\\"');
if(typeof value != "object")
value = value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
arr.push('"' + key + '":"' + value + '"');
}
return "{" + arr.join(",\n\r") + "}";
}
答案 1 :(得分:0)
根据定义,JavaScript对象是无序的(您可以参考第8.6节“click here for details”下的ECMAScript语言规范)。
语言规范甚至不保证,如果你连续两次迭代一个对象的属性,它们将在第二次以相同的顺序出现。
如果仍然需要排序,请将对象转换为Array,在其上应用任何排序算法,然后对已排序的数组执行JSON.stringify()。
让我们在下面举例:
var data = {
one: {
rank: 5
},
two: {
rank: 2
},
three: {
rank: 8
}
};
var arr = [];
推入数组并对其应用排序:
var mappedHash = Object.keys( data ).sort(function( a, b ) {
return data[ a ].rank - data[ b ].rank;
}).map(function( sortedKey ) {
return data[ sortedKey ];
});
然后应用JSON.stringy:
var expectedJSON = JSON.stringify(mappedHash);
输出将是:
"[{"rank":2},{"rank":5},{"rank":8}]"