我在地图对象中有一些按时间排序的json数据。键是整数id,值是包含时间戳的对象。但是,当我尝试使用jQuery $ .each函数迭代这些数据时,结果将按键排序。如何以原始顺序迭代我的对象集合?
代码示例:
$.getJSON(url, addPages);
function addPages(pageData) {
$.each(pageData, function(key,value){
alert(key+' : '+value);
}
}
答案 0 :(得分:11)
对象是无序集。您无法以跨浏览器投诉方式指定订单。没有原始订单的概念,除非它已经按规则排序。
然后对服务器上的数据进行排序,然后以相同的排序顺序对其进行枚举。
或者将JSON格式化为
{ "values": [
{ "someKey": "someVal" },
{ "someOtherKey": "someOtherVal" }
] }
您可以使用for (i = 0; i < len; i++)
循环和“garantuee”原始订单迭代数组。
答案 1 :(得分:6)
您可以将键值对复制到对象数组中,然后使用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);
答案 2 :(得分:2)
在firefox对象中保持顺序..在chrome中它们没有。不知道其他浏览器,但两个不同的实现已经表明你不能依赖它。
如果您需要订购,请使用清单;如果您需要包含非数字键和特定订单的内容,最简单的方法是使用[key,value]列表列表:
[['abd', 'def'], ['ghi', 'jkl']]
答案 3 :(得分:0)
如果用“original”表示对象中的时间戳,我认为除了首先显式排序数组之外,还有任何万无一失的选择,然后才循环遍历它。