这是情况。我有一个JavaScript对象,我需要遍历它,但顺序是非常重要的维护。我知道JavaScript对象应该是无序的,但我希望有一些JavaScript等效于以下内容:http://docs.python.org/2/library/collections.html#collections.OrderedDict
这是原始订购
{
082013: {'A': 1, 'B', 3}
092013: {'A': 2, 'B', 4}
102013: {'A': 8, 'B', 2}
112013: {'A': 92, 'B', 67}
122013: {'A': 64, 'B', 32}
}
然后我遍历它:
aArray = [];
bArray = [];
$.each(data, function(key, value) {
aArray.push(value.A);
bArray.push(value.B);
});
结果(特别是在chrome上)似乎呈现更像这样:
aArray = [8, 92, 64, 1, 2];
bArray = [2, 67, 32, 3, 4];
这意味着它不按顺序迭代,或按最小到最大的顺序进行迭代(102013,112013,122013,092013,082013)
那么我怎么能按顺序迭代这个对象,如果我可以的话呢?
答案 0 :(得分:6)
在我的脑海中,唯一的方法是获取密钥(使用Object.keys(myObj)
),然后对它们进行排序(使用Array.sort
)并以此方式完成。键在实际对象中是无序的。
所以它就像:
var keys = Object.keys(myObj);
keys.sort();
for(var i=0; i<keys.length; ++i){
//do something with myObj[keys[i]]
}
答案 1 :(得分:1)
提前对键进行排序将确保它们的顺序正确。然后,您可以访问所需的值。以下是使用jQuery实现跨浏览器兼容性的解决方案:
var data = {
'082013': {'A': 1, 'B': 3},
'092013': {'A': 2, 'B': 4},
'102013': {'A': 8, 'B': 2},
'112013': {'A': 92, 'B': 67},
'122013': {'A': 64, 'B': 32}
}, sortedKeys,
a = [],
b = [];
sortedKeys = $.map(data, function(value, key) {
return key;
}).sort();
$.each(sortedKeys, function(index, value) {
a.push(data[value].A);
b.push(data[value].B);
});
console.log(a, b);
//[1, 2, 8, 92, 64] [3, 4, 2, 67, 32]
答案 2 :(得分:0)
浏览器在迭代对象中的键时有些不一致。自从我对此进行测试已经有几年了,但大多数浏览器在FIFO时尚(先进先出)中迭代键。我认为Opera是有问题的,因为它按字母顺序迭代它们的键。
理想的解决方案是在订单重要时将数组返回给JavaScript。否则你能做的最好的就是威利的建议。下面是Object.keys方法的polyfill:
Object.keys = Object.keys || function keys(x) {
var keys = [], key;
for (key in x) {
if (x.hasOwnProperty(key)) {
keys.push(key);
}
}
return keys;
};
可在MDN找到更完整的polyfill:Object.keys Polyfill