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

时间:2011-08-27 11:40:47

标签: javascript arrays json list

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

JSON列表的元素怎么样?他们的订单是否保持不变?

5 个答案:

答案 0 :(得分:305)

是的,保留了JSON数组中元素的顺序。来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (强调我的):

  

对象是零个或多个名称/值的无序集合   对,其中名称是字符串,值是字符串,数字,   boolean,null,object或array。

     

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

     

术语“对象”和“数组”来自于惯例   的JavaScript。

答案 1 :(得分:58)

维护数组([])中元素的顺序。 “对象”({})中元素的顺序(名称:值对)不是,并且它们通常是“混乱”,如果不是由JSON格式化程序/解析器本身,那么通过语言 - 特定对象(Dictionary,NSDictionary,Hashtable等),用作内部表示。

答案 2 :(得分:8)

实际上,如果密钥是NaN类型,浏览器将不会更改订单。

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

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

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

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

答案 3 :(得分:5)

某些JavaScript引擎会将密钥保持在插入顺序中。例如,V8 keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers

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

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');
  }
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}

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

演示herehere

答案 4 :(得分:3)

“是否维护了JSON列表中元素的顺序?”这不是一个好问题。您需要询问“在执行[...]时是否保留了JSON列表中元素的顺序?” 正如Felix King所指出的,JSON是一种文本数据格式。没有理由它不会变异。不要将JSON字符串与(JavaScript)对象混淆。

你可能在谈论像JSON.stringify(JSON.parse(...))这样的行动。现在答案是:这取决于实施。 99%*的JSON解析器不维护对象的顺序,并且保持数组的顺序,但您也可以使用JSON来存储类似

的内容
{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

并使用维护对象顺序的解析器。

*可能更多:)