Ruby 1.8.7使用JSON.parse对哈希进行排序

时间:2012-04-18 15:51:08

标签: ruby-on-rails ruby json

我一直无法搞清楚这一点,所以我想我会问这里。我正在使用Ruby 1.8.7和RoR 1.2.6。我让我的控制器呈现这个JSON:

{
  "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中,如果一个人构建的表单元素没有以他们构建它们的正确顺序显示,那就不太好了。任何人都有见解关于如何在输出之前或之前保持顺序或重新排序它们?

2 个答案:

答案 0 :(得分:1)

你走了:

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

这将根据值hash中键的整数值对哈希进行排序,并将排序后的哈希放回更大的哈希值。

如果你需要保留所有静止片段,请使用:

 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

答案 1 :(得分:-2)

升级到1.9.x ruby​​版本以获取哈希顺序