如何按照定义的顺序迭代以数字命名的对象属性

How to iterate over numerically named object properties in defined order?

本文关键字:对象 属性 数字 迭代 何按照 定义 顺序      更新时间:2023-09-26

理论上,对象属性的迭代顺序是不能保证的。在实践中,它有一个事实上的标准。IE<9, Firefox, Safari总是按照定义的顺序迭代。Opera, IE9, Chrome按定义顺序迭代字符串键。数字键被排序并排在字符串键之前。

我有一个对象填充数组,所有键都是数字。我如何以定义的顺序迭代这些对象属性。在ie9和chrome中,数字键总是在迭代之前排序。

以任何有保证的方式做到这一点的唯一方法是将所有键放入数组中,对数组进行排序,然后使用该数组进行迭代。

下面是一些伪代码:

var obj = {};  // object with lots of properties
var keys = [];
for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
        keys.push(i);
    }
}
// may have to craft a custom sort function to get the right order
keys.sort();
for (i = 0; i < keys.length; i++) {
    // operate on obj[keys[i]]
}

EDIT:基于新的注释,现在听起来OP想要使用内部数组中的第3个元素作为排序键对数组的数组进行排序。所以,如果你有:

[[52668,'52668','Orange, Julian','YES'], [61230,'61230','Apple','YES'], [42689,'42689','Banana','YES']]

他想按水果名称排序(内部数组中的第三项)

可以这样做:

var data = [[52668,'52668','Orange, Julian','YES'], [61230,'61230','Apple','YES'], [42689,'42689','Banana','YES']];
data.sort(function(a, b) {
    return(a[2].localeCompare(b[2]));
});