2011-02-01 51 views
12

我在一個按時間排序的地圖對象中有一些json數據。鍵是一個整數ID,值是一個包含時間戳的對象。但是,當我嘗試用jQuery $ .each函數迭代這些數據時,結果會按鍵重新排序。我怎樣才能以我們的原始順序迭代對象的集合?以原始順序迭代jQuery JSON對象

代碼例如:

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

回答

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); 
11

對象是未有序集。您無法以跨瀏覽器投訴方式指定訂單。除非已經按照規則排序,否則沒有原始順序的概念。

因此對服務器上的數據進行排序,然後按照相同的排序順序對它進行枚舉。

備選地格式化JSON是

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

可以遍歷與for (i = 0; i < len; i++)環路和「garantuee」的原始順序在陣列上。

0

如果通過「原始」您指的是對象中的時間戳,我不認爲除了首先顯式排序數組之外,沒有任何其他的萬無一失的選項,只有通過它才能循環。

2

在firefox對象保持順序..在他們沒有鉻。不知道其他瀏覽器,但兩種不同的實現已經表明你不能依賴它。

如果您需要訂購某些東西,請使用列表;如果你需要用兩個非數字鍵和一定的順序的東西,最簡單的方法是使用[鍵,值]列表的列表:

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

下面是關於Chrome的問題鏈接:http://code.google.com/p/v8/issues/detail?id=164 – 2011-02-01 00:26:22

+0

任何爲什麼選擇[k,v]元組超過{k:v}對象? – Raynos 2011-02-01 00:26:45