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

3
理论上,对象属性的迭代顺序是不确定的。 实际上,有一个事实标准。 IE<9、Firefox和Safari总是按定义的顺序进行迭代。 Opera、IE9和Chrome按字符串键的定义顺序进行迭代。 数字键被排序并在字符串键之前进行迭代。
我有一个填充了对象的数组,所有键都是数字。如何按照定义的顺序迭代这些对象属性。在ie9和chrome中,数字键始终在迭代之前排序。

但是数组中的键是对象,我该如何从数组中获取对象键?我尝试了以下代码:for (key in ary) { document.write(ary[key]+"<br>"); }结果显示为 [object Object] [object Object] [object Object] 有没有更好的方法来获取键? - user843812
我在下面的回答中提供了示例代码。 - jfriend00
我刚刚使用console.log()来追踪结果,发现我需要的是按对象数组中对象的第二个属性对数组进行排序。例如,在页面源代码中,数组中的元素如下:[61230,'61230','Apple','YES'], [42689,'42689','Banana','YES'], [52668,'52668','Orange, Julian','YES'] 我想按字母顺序排序“Apple”,“Banana”,“Orange”。在FF和ie<9中,它们是按照字母顺序排列的,但在chrome和ie9中,这个数组是按数字排序的,这意味着结果会像“Banana”,“Orange”和“Apple”一样打印出来。如何得到正确的顺序? - user843812
1
你最新的评论与你原来的问题毫无关联。你展示的是一个数组的数组。你想说的是,你想通过内部数组中的第三个元素对外部数组进行排序吗? - jfriend00
根据您最新的评论,我为我的答案添加了一个新的排序选项。 - jfriend00
1个回答

3

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

这里是一些伪代码:

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]]
}

编辑:根据新的评论,现在看起来OP想要使用内部数组的第3个元素作为排序键对数组进行排序。所以,如果你有:

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

他希望按照水果名称排序(内部数组中的第3项)。可以通过以下方式完成:
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]));
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接