基于表示顺序的数组对哈希进行排序

时间:2016-06-23 18:05:32

标签: ruby sorting hash

我有这样的哈希:

data =  {"Blood Group"=>"A", "Next Review Date"=>"22/06/2016", "Tourniquet Time"=>"23", "BMI"=>"21"}

我在数组中有一个排序顺序:

sorting_order = [1, 0, 2, 3]

我想根据排序顺序数组重新排列哈希值,以便哈希变为:

data = {"Next Review Date"=>"22/06/2016", "Blood Group"=>"A",  "Tourniquet Time"=>"23", "BMI"=>"21"}

我试过了:

sorted_hash = sorting_order.map{|x| data[x]} 

它返回:

NoMethodError: undefined method `[]' for #<Enumerator: [1, 0, 2, 3]:index>

我不确定如何继续这里。这样做的方法是什么?

3 个答案:

答案 0 :(得分:4)

这应该可以解决问题:

sorting_order.map{|x| data.to_a[x]}.to_h  # We're converting hash to array in each loop, you could define a local var and use it here instead.

 => {"Next Review Date"=>"22/06/2016", "Blood Group"=>"A", "Tourniquet Time"=>"23", "BMI"=>"21"} 

PS。我是@ DaveNewton评论的赞成者之一,并同意不应对哈希进行排序。

答案 1 :(得分:2)

data.to_a.values_at(*sorting_order).to_h
  #=> {"Next Review Date"=>"22/06/2016", "Blood Group"=>"A",
  #    "Tourniquet Time"=>"23", "BMI"=>"21"} 

答案 2 :(得分:1)

您是否可以将哈希键存储在包含排序顺序的数组中,而不是每次都对哈希进行排序?

像这样:

sorting_order

当用户更改顺序时,您只需更新sorting_order.each { |data_key| render(data[data_key]) } 数组中的键即可。 之后,在渲染数据时,您只需调用

RedirectToAction