是否保留了JSON列表中元素的顺序?

use*_*899 223 javascript arrays json list

我注意到JSON对象中元素的顺序不是原始顺序.

那些JSON列表的元素呢?他们的订单是否保持?

小智 329

是的,保留了JSON数组中元素的顺序.来自RFC 7159 -JavaScript Object Notation(JSON)数据交换格式 (强调我的):

对象是零个或多个名称/值对的无序集合,其中名称是字符串,值是字符串,数字,布尔值,空值,对象或数组.

数组是零个或多个值的有序序列.

术语"对象"和"数组"来自JavaScript的约定.

  • @Cato 该段落并不意味着数组可能是无序的。这意味着对数组进行排序的原因可能是未知的,因为您没有指定它为何排序。 (3认同)

Hot*_*cks 60

[]维护array()中元素的顺序."对象"({})中元素(名称:值对)的顺序不是,并且它们通常是"混乱",如果不是由JSON格式化程序/解析器本身然后由特定于语言的对象(字典, NSDictionary,Hashtable等)用作内部表示.


小智 6

实际上,如果密钥是NaN类型,浏览器将不会更改顺序.

以下脚本将输出"One","Two","Three":

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}
Run Code Online (Sandbox Code Playgroud)

以下脚本将输出"Three","One","Two":

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}
Run Code Online (Sandbox Code Playgroud)

  • 但这依赖于JSON方面的未定义行为.你交换的任何东西都可能没有相同的行为. (15认同)
  • 这个答案讨论了一个对象.这个问题与json"list"有关,它只能推断出意味着数组,它是由json规范在语义上排序的(参见Jeremy的回答). (3认同)

Ben*_*kin 5

一些JavaScript引擎将密钥保持在插入顺序中.例如,V8 将所有键保持为插入顺序,除了可以解析为无符号32位整数的键.

这意味着如果您运行以下任一项:

var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
  if (animals.hasOwnProperty(animal)) {
    $('<li>').text(animal).appendTo('#animals');
  }
}
Run Code Online (Sandbox Code Playgroud)
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}
Run Code Online (Sandbox Code Playgroud)

在使用V8的Chrome上,您将始终按顺序获得,猴子.Node.js也使用V8.即使你有数以千计的物品,这也是正确的.YMMV与其他JavaScript引擎.

在这里这里演示.

  • 但这依赖于JSON方面的未定义行为.你交换的任何东西都可能没有相同的行为. (6认同)