Firefox中的对象元素顺序(JS枚举)

时间:2013-07-12 14:21:46

标签: javascript firefox

在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编码的哈希表,它是在服务器端订购的。直到最近才保留订单,现在整个列表都是乱七八糟的,因为它是按键排序的)

1 个答案:

答案 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;  
};