【发布时间】:2011-11-05 01:41:42
【问题描述】:
我注意到 JSON 对象中元素的顺序不是原始顺序。
JSON 列表的元素呢?他们的秩序是否得到维护?
【问题讨论】:
标签: javascript arrays json list
我注意到 JSON 对象中元素的顺序不是原始顺序。
JSON 列表的元素呢?他们的秩序是否得到维护?
【问题讨论】:
标签: javascript arrays json list
是的,JSON 数组中元素的顺序被保留。来自RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (强调我的):
对象是零个或多个名称/值的无序集合 对,其中名称是字符串,值是字符串、数字、 布尔值、空值、对象或数组。
数组是零个或多个值的有序序列。
术语“对象”和“数组”来自于 JavaScript。
一些实现也确实保留了 JSON 对象的顺序,但这不能保证。
【讨论】:
保持数组 ([]) 中元素的顺序。 “对象”({})中的元素(名称:值对)的顺序不是,而且它们通常是“混乱”的,如果不是由 JSON 格式化程序/解析器本身然后是特定于语言的对象(字典、NSDictionary、Hashtable 等)用作内部表示。
【讨论】:
实际上,如果键是 NaN 类型,浏览器不会更改顺序。
以下脚本将输出“一”、“二”、“三”:
var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
而以下脚本将输出“三”、“一”、“二”:
var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
alert(foo[bar]);
}
【讨论】:
一些 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 引擎。
【讨论】:
“JSON 列表中元素的顺序是否保持不变?”不是一个好问题。您需要问“在执行 [...] 时是否保持 JSON 列表中元素的顺序?” 正如 Felix King 所指出的,JSON 是一种文本数据格式。它不会无缘无故地变异。不要将 JSON 字符串与 (JavaScript) 对象混淆。
您可能正在谈论像JSON.stringify(JSON.parse(...)) 这样的操作。现在的答案是:这取决于实施。 99%* 的 JSON 解析器不维护对象的顺序,并维护数组的顺序,但您不妨使用 JSON 来存储类似的东西
{
"son": "David",
"daughter": "Julia",
"son": "Tom",
"daughter": "Clara"
}
并使用维护对象顺序的解析器。
*可能更多:)
【讨论】: