Firefox中对象元素的顺序(JS枚举)
Order of object elements in Firefox (JS enumeration)
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;
};
相关文章:
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- 枚举附加到文档的HTML对象的所有事件
- JavaScript数组的子类化破坏了快速枚举
- 为什么Javascript程序员更喜欢在代码中重复字符串作为常量,而不是使用枚举类型的对象
- 不可枚举的属性出现在 for..在 Chrome 中循环
- json模式v4如何根据枚举实现枚举
- 如何访问从 jstl foreach 到 jQuery 的枚举值
- sails.js:枚举的模型定义 - 动态值列表
- 将枚举值绑定到 ng-options 角度 js
- 在默认情况下将可枚举设置为 false 的 JS 中创建对象属性的其他方法是什么
- 使 Node.js 流信息不可枚举
- Ember.js使用子枚举的单个成员
- Firefox中对象元素的顺序(JS枚举)
- JS不可枚举函数
- 有没有办法在node.js中枚举服务器的所有已知主机名
- 在angular js的select下拉菜单中访问枚举属性
- js-doc / google-closure-compiler 如何记录传递的枚举对象本身
- 是否有一种方法来连接值(如枚举)从前端(JS)到后端(PHP/Ruby)没有重复
- 用Geddy在Node.js中声明和使用枚举
- 我如何枚举一个javascript对象的属性使用数据绑定Knockout.js