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
http://www.w3schools.com/jsref/jsref-sort.asp
如果你有兴趣,也可以自己写。
然后循环遍历键数组,使用