我使用Ajax傳遞關聯數組(id => val),並使用jQuery的$ .getJSON接收它,它正確讀取數據並準備好對象。然而,排序問題非常令人討厭。
看來,在Chrome和IE瀏覽器中,數據會根據關聯數組的id部分進行排序。所以如果數組應該是(5 =>'xxx',3 =>'fff'),它實際上變成了(3 =>'fff',5 =>'xxx')。在FireFox上,它按預期工作,即不排序。
任何想法?
我使用Ajax傳遞關聯數組(id => val),並使用jQuery的$ .getJSON接收它,它正確讀取數據並準備好對象。然而,排序問題非常令人討厭。
看來,在Chrome和IE瀏覽器中,數據會根據關聯數組的id部分進行排序。所以如果數組應該是(5 =>'xxx',3 =>'fff'),它實際上變成了(3 =>'fff',5 =>'xxx')。在FireFox上,它按預期工作,即不排序。
任何想法?
似乎最好的方法是根本避免關聯數組。當你想發送一個關聯數組時,只需將它作爲兩個單獨的數組發送 - 鍵和值之一。下面是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]);
}
首先,你不應該假設在關聯數組中有任何鍵的排序。沒有任何排序順序的保證。
無論如何,爲了解決這個問題,你應該自己對密鑰進行排序。
http://jsfiddle.net/foxbunny/ZTXhp/
編輯:Object.keys是EcmaScript的5功能,因此,如果你的目標瀏覽器不支持它,加載ES5-墊片(https://github.com/kriskowal/es5-shim)。
的服務器返回我希望的排序,我不希望嘗試在Javascript /客戶端再次排序。謝謝。 – Collector 2012-02-21 19:28:14
你不明白。在關聯數組中沒有排序鍵。您可能會意外排序,您可能只是喜歡那個意外,但正如您從瀏覽器和PHP之間的差異中可以看到的那樣,排序順序絕對沒有保證。這就是普通數組存在的原因:保證排序順序。所以你的情況唯一的解決辦法是製作一組鍵。 – hayavuk 2012-02-22 22:37:31
順便說一句,模擬關聯數組的一種方法是使用2項數組的數組。 ''[[key,val],[key,val],...]''。這保證了排序順序。我確信PHP(以及大多數語言)中有函數可以快速將關聯數組轉換爲此格式。 – hayavuk 2012-02-22 22:39:35
另一種選擇是將數據作爲對象數組返回。這將確保對象保持您返回它們的順序。
編輯:
基本上,對於每個鍵>值對,把它推到一個新的數組和json_encode該數組。
您可以爲所有整數索引添加一個前導0。
var json = { '05' => 'xxx', '03' => 'fff' };
發現了類似的問題: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