在Firefox中,JS对象的枚举似乎不一致。
代码:
var a = {"3":"a", "2":"b", "foo":"c", "1":"d"};
var str = "";
for(var n in a) { str += n + " = " + a[n] + "\n"; }
alert(str);
Windows上的FF22结果:
1 = d
2 = b
3 = a
foo = c
期望的结果(以及我在Linux上使用FF20获得的结果):
3 = a
2 = b
foo = c
1 = d
如何保持元素与插入的顺序相同?
我知道ECMA规范没有说明如何进行枚举,因此它不能被称为bug。但我需要插入顺序中的元素。 (原因:我得到一个JSON编码的哈希表,它是在服务器端订购的。直到最近才保留订单,现在整个列表都是乱七八糟的,因为它是按键排序的)
答案 0 :(得分:2)
不,你不能得到那个。对象中键的顺序是不确定的,可以是JS实现所需的任何内容。
但是,您可以对键进行排序:
var a = {"3":"a", "2":"b", "foo":"c", "1":"d"};
var str = "";
for(var n in Object.keys(a).sort(your_sorting_function)) {
str += n + " = " + a[n] + "\n";
}
alert(str);
your_sorting_function
应该接受两个参数,它们实际上是a
对象中键的名称。然后,如果第一个键被视为“更大”,则此函数应返回0
相同的键1
,否则返回-1
。
Object.keys()
,但可以找到大量实现。
例如:
Object.keys = Object.keys || function(o) {
var result = [];
for(var name in o) {
if (o.hasOwnProperty(name))
result.push(name);
}
return result;
};