2013-05-06 121 views
-2

好日子,我想排序基於字典值的JSON數組。 在序列化之前,字典按照字母順序顯示,這是正確的,但是一旦序列化,數組將根據字典Key進行排序。 一個例子是:排序基於密鑰的JSON數組

{[692:"!Entry1"]}, {[5:"!Entry2"]}, {[75:"!Entry3"]} 

被分類爲

{[5:"!Entry2"]}, {[75:"!Entry3"]}, {[692:"!Entry1"]} 

任何幫助,請

+6

這不是有效的json。 – 2013-05-06 08:27:31

+0

使用http://www.jsonlint.org檢查有效的json – 2013-05-06 08:30:06

回答

1

這不是有效的JSON,如果它是,它不會是一個數組,這將是一個東西。對象沒有排序。

如果它是一個數組,它將是稀疏的。 JSON沒有辦法表示稀疏數組。

在JavaScript(不需要jQuery的),你可以表達稀疏數組是這樣的:

var a = []; 
a[692] = "!Entry1"; 
a[5] = "!Entry2"; 
a[75] = "!Entry3"; 

但是,正如你提到的,它會通過按鍵進行排序,而不是值(例如,"!Entry2""!Entry3""!Entry1" )。

JSON和JavaScript都沒有辦法對條目的排序基本類型(數組或objets)。

在JSON(或JavaScript),你可以這樣做:

[{"692":"!Entry1"}, {"5":"!Entry2"}, {"75":"!Entry3"}] 

...它代表對象的數組,其中每個對象都有一個名稱的屬性一樣"75"具有價值給你「入口」字符串。但它很難很難

另一種方式是:

[ 
    {key: "692", value: "!Entry1"}, 
    {key: "5", value: "!Entry2"}, 
    {key: "75", value: "!Entry3"} 
] 

哪個是對象的數組,其中每個對象具有一個key屬性給出密鑰,以及value屬性給出的值。

+2

「不需要jQuery」:褻瀆! – MarioDS 2013-05-06 08:30:41

+0

@MarioDeSchaepmeester ::-) – 2013-05-06 08:32:04

+0

直到有一天瀏覽器決定數組有固定長度:p – MarioDS 2013-05-06 08:32:42

0

不能依賴對象內部按鍵的確切順序。

如果你想保留的順序,你的結構應該是這樣的:

[{692:"!Entry1"}, {5:"!Entry2"}, {75:"!Entry3"}] 
+0

這也是不是有效的JSON(儘管它是有效的JavaScript),並且非常難以使用(正如我在答案中指出的那樣)。 – 2013-05-06 08:36:58

+1

@ T.J.Crowder是的,我故意使用術語「結構」而不是有效的JSON表示法:) – 2013-05-06 08:40:37

+0

@ Jack::-) ...... – 2013-05-06 08:52:17

1

我知道這個問題是舊的,但我碰到它,而尋找一個類似的解決方案。我最終創建了一個函數,它根據一個鍵對一組JSON對象執行插入排序,所以我認爲我會分享給其他任何需要此功能的人。下面的代碼,它最大的工程至少或至少根據參數最大「isGreatestToLeast」(布爾):

/** 
* Performs an insertion sort on an array of json object based on a specified key 
* @param jsonArray - an array of json objects 
* @param key - the name of the key that should be used to determine the value 
* @param isGreatestToLeast - boolean, is the sort least to greatest or greatest to least? 
* @returns {array} of objects 
*/ 
function insSortJsonArr(jsonArray, key, isGreatestToLeast){ 

    for(var i = 1; i < jsonArray.length; i++){ 

     var next = jsonArray[i]; 
     var j = i; 

     if(isGreatestToLeast){ 

      while(j > 0 && next[key] > jsonArray[j - 1][key]){ 

       jsonArray[j] = jsonArray[j - 1]; 
       j--; 
      } 
     } else{ 

      while(j > 0 && jsonArray[j - 1][key] < next[key]){ 

       jsonArray[j] = jsonArray[j - 1]; 
       j--; 
      } 
     } 

     jsonArray[j] = next; 
    } 
    return jsonArray; 
} 

任何人,歡迎使用。讓我知道是否有任何問題。