2012-04-18 52 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的红宝石版本,以获得哈希秩序