2012-02-21 62 views
1

我使用Ajax傳遞關聯數組(id => val),並使用jQuery的$ .getJSON接收它,它正確讀取數據並準備好對象。然而,排序問題非常令人討厭。

看來,在Chrome和IE瀏覽器中,數據會根據關聯數組的id部分進行排序。所以如果數組應該是(5 =>'xxx',3 =>'fff'),它實際上變成了(3 =>​​'fff',5 =>'xxx')。在FireFox上,它按預期工作,即不排序。

任何想法?

+0

發現了類似的問題:http://stackoverflow.com/questions/5020699/how-do-you-stop-chrome-and-opera-sorting-json-objects-by-index-asc – Collector 2012-02-21 19:54:07

回答

0

似乎最好的方法是根本避免關聯數組。當你想發送一個關聯數組時,只需將它作爲兩個單獨的數組發送 - 鍵和值之一。下面是PHP代碼做到這一點:

$arWrapper = array(); 
    $arWrapper['k'] = array_keys($arChoices); 
    $arWrapper['v'] = array_values($arChoices); 
    $json = json_encode($arWrapper); 

和簡單的JavaScript代碼做任何你想用它

  for (i=0; i < data['k'].length; i++) { 
       console.log('key:' + data['k'][i] + ' val:' + data['v'][i]); 
      } 
-1

首先,你不應該假設在關聯數組中有任何鍵的排序。沒有任何排序順序的保證。

無論如何,爲了解決這個問題,你應該自己對密鑰進行排序。

http://jsfiddle.net/foxbunny/ZTXhp/

編輯:Object.keys是EcmaScript的5功能,因此,如果你的目標瀏覽器不支持它,加載ES5-墊片(https://github.com/kriskowal/es5-shim)。

+0

的服務器返回我希望的排序,我不希望嘗試在Javascript /客戶端再次排序。謝謝。 – Collector 2012-02-21 19:28:14

+0

你不明白。在關聯數組中沒有排序鍵。您可能會意外排序,您可能只是喜歡那個意外,但正如您從瀏覽器和PHP之間的差異中可以看到的那樣,排序順序絕對沒有保證。這就是普通數組存在的原因:保證排序順序。所以你的情況唯一的解決辦法是製作一組鍵。 – hayavuk 2012-02-22 22:37:31

+1

順便說一句,模擬關聯數組的一種方法是使用2項數組的數組。 ''[[key,val],[key,val],...]''。這保證了排序順序。我確信PHP(以及大多數語言)中有函數可以快速將關聯數組轉換爲此格式。 – hayavuk 2012-02-22 22:39:35

0

另一種選擇是將數據作爲對象數組返回。這將確保對象保持您返回它們的順序。

編輯:

基本上,對於每個鍵>值對,把它推到一個新的數組和json_encode該數組。

+0

它目前使用PHP編碼:json_encode($ arChoices,JSON_FORCE_OBJECT) - 那麼你會建議什麼? – Collector 2012-02-21 19:29:37

+0

嘗試將數組包裝到另一個數組中仍然沒有完成這項工作。在Chrome上,這些對象顯示爲對象,但其內容仍然排序。 – Collector 2012-02-21 19:36:43

+0

我沒有做太多的PHP,但我會嘗試刪除可選的選項參數。 'json_encode($ arChoices)' – 2012-02-21 19:37:59

2

您可以爲所有整數索引添加一個前導0。

var json = { '05' => 'xxx', '03' => 'fff' };