按顺序迭代javascript对象

时间:2013-12-17 17:07:26

标签: javascript

这是情况。我有一个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)

那么我怎么能按顺序迭代这个对象,如果我可以的话呢?

3 个答案:

答案 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] 

http://jsfiddle.net/UxqpS/1/

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