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

Order of object elements in Firefox (JS enumeration)

本文关键字:JS 枚举 顺序 对象 元素 Firefox      更新时间:2023-09-26

JS对象的枚举在Firefox中似乎不一致。

代码:

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编码的哈希表,它是在服务器端排序的。直到最近,这个顺序还保留着,现在整个列表都一团糟,因为它是按键排序的)

不,你不能得到。对象中键的顺序是不确定的,可以是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;  
};