Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按Asc顺序字符串化JS对象_Javascript_Json_Object - Fatal编程技术网

Javascript 按Asc顺序字符串化JS对象

Javascript 按Asc顺序字符串化JS对象,javascript,json,object,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中排序。如果顺序对你很重要,不要使用json。

我有一个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中排序。

如果顺序对你很重要,不要使用json。stringify因为使用它的顺序不安全,你可以使用javascript创建json stringify,要处理字符串值,我们有两种不同的方法,首先,使用regexp替换无效字符或对我们的值使用
JSON.stringify
,例如,如果我们有一个类似
'abc\d“efg'
的字符串,我们只需得到正确的结果
JSON.stringify('abc\d“efg')
,因为此函数的全部思想是按照正确的顺序进行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 = JSON.stringify(key);
        value = JSON.stringify(value);
        arr.push(key + ':' + value);
    }
    return "{" + arr.join(",\n\r") + "}";
}
var jsonString = sort_stringify(yourObj);

JavaScript对象按定义是无序的(您可以参考第8.6节中的ECMAScript语言规范)

语言规范甚至不能保证,如果你连续两次迭代一个对象的属性,第二次它们将以相同的顺序出现

如果仍然需要排序,请将对象转换为数组并对其应用任何排序算法,然后对排序后的数组执行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}]"

对象中属性的顺序没有指定,也不应该很重要。我得到的顺序与您预期的相同。检查顺序对您是否重要,找出如何将数据结构表示为数组。您可以在输出数据结构时对其进行排序。使用
对象获取键。键
,对它们进行排序,然后循环并访问对象的属性。要对对象进行排序,可以检查post:如果我更改此行arr.push(“+sortedKeys[i]+”:“+obj[sortedKeys[i]]+”);到arr.push(““'+sortedKeys[i]+”:“'+obj[sortedKeys[i]]+”);非常感谢。并且,arr.join(“,\n\r”)在每行上都有每个属性。非常感谢如果
sortedKeys[i]
本身包含一个引号,它肯定可以:
var x={};x['“']=2;console.log(x);
@Blender:我修复了它,你现在可以用
试试。
"[{"rank":2},{"rank":5},{"rank":8}]"