2012-04-18 79 views
1

我一直無法解決這個問題,所以我想我會問這裏。我使用的是Ruby 1.8.7和RoR 1.2.6。我有我的控制器呈現此JSON:Ruby 1.8.7使用JSON排序哈希.parse

{ 
    "form_id": "1", 
    "form_structure": { 
    "3": { 
     "answer_required": "undefined", 
     "title": "This is a radio group, right?", 
     "cssClass": "radio", 
     "values": { 
      "4": { 
       "value": "Yes", 
       "baseline": "undefined" 
      }, 
      "5": { 
       "value": "No", 
       "baseline": "undefined" 
      }, 
      "7": { 
       "value": "Maybe", 
       "baseline": "undefined" 
      }, 
      "20": { 
       "value": "Test", 
       "baseline": "undefined" 
      } 
     } 
    } 
    } 
} 

正如您所看到的,「值」下的選項由表中的ID排序。在JSON中看起來很完美。當我使用JSON.parse就可以了,一切都「值」下獲得的所有走出低谷,並將其返回此:

{ 
    "form_id"=>"1", 
    "form_structure"=>{ 
    "3"=>{ 
     "title"=>"This is a radio group, right?", 
     "cssClass"=>"radio", 
     "answer_required"=>"undefined", 
     "values"=>{ 
      "7"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Maybe" 
      }, 
      "20"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Test" 
      }, 
      "4"=>{ 
       "baseline"=>"undefined", 
       "value"=>"Yes" 
      }, 
      "5"=>{ 
       "baseline"=>"undefined", 
       "value"=>"No" 
      } 
     } 
    } 
    } 
} 

此代碼是在我做一個formbuilder使用,它不會真的是不錯如果一個人構建的表單元素沒有按照他們構建的正確順序顯示出來,任何人都可以獲得有關我如何保持排序或重新排序的信息,或者在之前輸出它們?

+0

有沒有Ruby的版本1.8.9 ... – 2012-04-18 15:55:26

+2

'Hash'沒有在1.8.7中訂購,你可以改變你的'JSON',使它看起來像'{「values」=> [[7,{「baseline」=> ...}],[20,...'?無論如何,這將是一件好事,訂購哈希是一件棘手的事情。 – 2012-04-18 16:02:44

+2

哈希按定義沒有順序。處理它並將其更改爲數組。 – 2012-04-18 16:07:46

回答

1

在這裏你去:

form["form_structure"]["3"]["values"] = 
form["form_structure"]["3"]["values"].sort { 
     |a,b| a[0].to_i <=> b[0].to_i 
} 

這將排序基於哈希值的鍵的整數值的哈希,並把排序的散列早在大散。

如果你需要讓這一切仍然哈希使用本:

val = {} 
val = form["form_structure"]["3"]["values"].sort { 
     |a,b| a[0].to_i <=> b[0].to_i } 
ind = [] 
val.each { |v| ind += [v[0]] } 
val = {} 
ind.each { |k| val[k] = form["form_structure"]["3"]["values"][k] } 
form["form_structure"]["3"]["values"] = val 
+0

錯誤,實際上這會將哈希值在鍵值處轉換爲有序數組。在Ruby 1.8中絕不保證散列順序 – 2012-04-18 16:19:09

+0

那麼你不能像使用散列一樣訪問數組,所以行爲完全不同。 – 2012-04-18 16:30:29

+0

現在它是散列的有序散列。是的,理論上你不能指望順序,但在現實生活中你可以暫時停下來,而這正是他真正需要的。 – 2012-04-18 17:14:26

-2

升級到1.9.x的紅寶石版本,以獲得哈希秩序