JSON.stringify 是否保留数组中对象的顺序

问题描述 投票:0回答:3

我正在创建一个 javascript 对象,如下

var myObjects ; 
for(var i = 0; i <10;i++){
    var eachObject = {"id" : i};
    myObjects .push(eachObject );
}
message = {
      "employeeDetails" : myObjects 
}

之后我将它们字符串化如下

JSON.stringify(message);

上述方法是否按照对象之前的顺序对对象进行字符串化? stringify 后它们的顺序是 0,1,2....9 吗?

javascript json
3个回答
20
投票

文档中没有任何内容明确确认数组项的顺序被保留。但是,文档指出,对于非数组属性,不保证顺序:

不保证非数组对象的属性按任何特定顺序进行字符串化。不要依赖字符串化中同一对象内属性的排序。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

即使数组项目的顺序被保留,我也不会指望这一点,而是自己对项目进行排序。毕竟,很可能会有一些业务或表示逻辑来指示项目应如何排序。


12
投票

对于从

JSON.stringify()
以特定顺序(仅)获取顶级对象的简单方法,您可以将
Object.keys()
JSON.stringify
replacer
参数

const str = JSON.stringify(obj, Object.keys(obj).sort());

演示:

let obj = {
  cat: 1,
  a: 2,
  ba: 3,
  bb: 3.5,
  A: 4,
  '0': 5,
};

const str = JSON.stringify(obj, Object.keys(obj).sort(), 2);

// Output is sorted alphabetically by key name
console.log(str);
.as-console-wrapper { max-height: 100% !important; }

作为

replacer
传递的键数组的顺序决定了结果字符串中的顺序。

但是请注意,正如上面提到的,使用

Object.keys(obj).sort()
仅保留顶级对象键,这意味着 字符串化结果将省略所有嵌套值

例如

{ test: { a: "I'm nested!" } }
将变为
{"test":{}}

另请参阅:


5
投票

您可以使用 sort 方法对数组进行排序。

是的,stringify 保留了排序。

jsfiddle

var cars = ["Saab", "Volvo", "BMW"];
cars.push("ferrari");
alert(JSON.stringify(cars));
cars.sort();
alert("sorted cars" + JSON.stringify(cars));
© www.soinside.com 2019 - 2024. All rights reserved.