以原始顺序迭代jQuery JSON对象

我在地图对象中有一些json数据,它按时间排序。 键是整数id,值是包含时间戳的对象。 但是当我尝试使用jQuery $ .each函数迭代这些数据时,结果将按键排序。 如何以原始顺序迭代我的对象集合?

代码示例:

$.getJSON(url, addPages); function addPages(pageData) { $.each(pageData, function(key,value){ alert(key+' : '+value); } } 

您可以将键值对复制到对象数组中,然后使用Array.sort将它们按顺序排列。

 // $.getJSON(url, addPages); //removed for test purposes function addPages(pageData) { var pageItems = []; $.each(pageData, function(key,value){ pageItems.push( { key: key, value: value } ); }); // Assuming you can do arithmetic on timestamps pageItems.sort( function(a,b){ return a.value.timeStamp - b.value.timeStamp; } ); $.each(pageItems, function(index,pageItem){ alert(pageItem.key+' : '+pageItem.value.timeStamp); }); } 

我的测试脚本:

 var testData = { '12': { timeStamp: 55 }, '16': { timeStamp: 655 }, '123': { timeStamp: 455 }, '312': { timeStamp: 955 }, '132': { timeStamp: 255 }, '126': { timeStamp: 455 }, '162': { timeStamp: 355 } }; addPages(testData); 

对象是无序集。 您无法以跨浏览器投诉方式指定订单。 没有原始订单的概念,除非它已经按规则排序。

因此,对服务器上的数据进行排序,然后以相同的排序顺序对其进行枚举。

或者将JSON格式化为

 { "values": [ { "someKey": "someVal" }, { "someOtherKey": "someOtherVal" } ] } 

您可以使用for (i = 0; i < len; i++)循环和“garantuee”原始顺序迭代数组。

在firefox对象保持订单..在铬他们没有。 不知道其他浏览器,但两个不同的实现已经表明你不能依赖它。

如果您需要订购的东西,请使用清单; 如果您需要包含非数字键和特定顺序的内容,最简单的方法是使用[key,value]列表列表:

 [['abd', 'def'], ['ghi', 'jkl']] 

如果用“原始”表示对象中的时间戳,我认为除了首先显式排序数组之外,还有任何万无一失的选择,然后才循环遍历它。