以Asc顺序对JS对象进行字符串化

时间:2014-02-03 06:59:03

标签: javascript json object

我有像

这样的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中的排序。

2 个答案:

答案 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}]"