0

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 规范没有说明应该如何进行枚举,因此它不能被称为错误。但我需要按插入顺序排列的元素。(原因:我得到了一个 JSON 编码的哈希表,它是在服务器端排序的。直到最近,订单仍然保留,现在整个列表一团糟,因为它是按键排序的)

4

1 回答 1

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;  
};
于 2013-07-12T14:23:02.317 回答