关于jquery:在javascript Firefox与Chrome中对对象进行排序

Sorting an Object in javascript Firefox vs Chrome

本问题已经有最佳答案,请猛点这里访问。

我有一个物体看起来像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{

   "2013": {
       "name": 2013,
       "ts_create": 1375254000000,
       "view_url":"some_url",
       "save_url":"some_url_2",
       "id":"",
       "exists": true,
       "children": []
        },
"2012": {
       "name": 2013,
       "ts_create": 1375254000000,
       "view_url":"some_url",
       "save_url":"some_url_2",
       "id":"",
       "exists": true,
       "children": []
        },
"2011": {
       "name": 2013,
       "ts_create": 1375254000000,
       "view_url":"some_url",
       "save_url":"some_url_2",
       "id":"",
       "exists": true,
       "children": []
        }
}

我面临的问题是,似乎只有在Google Chrome中,当我循环这个对象时,对象才会向后循环。

循环显示对象的预期结果应列出2013、2012、2011年的情况。在火狐中会发生……但是方法没有改变,Chrome中的同一个精确对象。我会得到2011,2012,2013

因此,在循环遍历这个对象之前,我显然需要对它应用某种级别的排序,因为chrome希望让循环向后读取它。我面临的问题是不完全确定如何使用JS对对象进行排序


当您迭代对象属性时,对顺序没有保证。可以将对象添加到数组中,并改为对数组进行排序:

1
2
3
4
5
6
7
8
var obj = {"2012" : {},"2011" : {},"2013" : {}};
var arr = [];
for (var year in obj) {
    arr.push({year : year, data : obj[year]});
}
arr.sort(function(a,b) {
    return b.year - a.year;
});

http://jsfiddle.net/wk5ke/


因为对象是无序集合,所以您可以强制执行所需的顺序。

一种方法是获取对象属性的数组,对它们排序,然后迭代数组。

1
2
3
4
5
6
7
Object.keys(data)
      .sort(function(a, b) {
          return +b - +a;
       })
      .forEach(function(key) {
          var item = data[key];
      });

这假设您需要一个简单的降序。


而不是属性/值对将此结构实现为对象数组。数组可以按它包含的对象的任何属性排序。


按排序顺序获取键的一种方法是使用此处定义的方法生成键数组:

获取javascript对象密钥列表

然后可以使用javascript sort函数:

http://www.w3schools.com/jsref/jsref-sort.asp

如果你有兴趣,也可以自己写。

然后循环遍历键数组,使用object[key]提取值。