使用hash作为字符串的hash的第一个元素对哈希数组进行排序

时间:2014-07-07 04:36:02

标签: ruby arrays sorting hash

我有以下数组/哈希:

[{"XYZ140717"=>
   {:unit=>10.25,
    :perc=>0.0,
    :exp=>2014-07-19 00:00:00 +1000}},
 {"ABC140719"=>
   {:unit=>8.71,
    :perc=>0.0,
    :exp=>2014-07-19 00:00:00 +1000}},
 {"MNO140718"=>
   {:unit=>8.55,
    :perc=>0.0,
    :exp=>2014-07-19 00:00:00 +1000}}]

我想对它进行排序,首先是ABC140719,然后是MNO XYZ。 我无法想办法。

2 个答案:

答案 0 :(得分:1)

对数组进行排序非常简单,因为您可以利用以下事实:如果sort_by收到一个返回数组的块,它首先比较返回数组中的第一个元素,然后将其余部分用作关系-breakers。将每个哈希值转换为数组将起到作用:

items.sort_by(&:to_a)
# => [{"ABC140719"=>{:unit=>8.71, :perc=>0.0, :exp=>2014-07-19 00:00:00 +1000}},
#     {"MNO140718"=>{:unit=>8.55, :perc=>0.0, :exp=>2014-07-19 00:00:00 +1000}}, 
#     {"XYZ140717"=>{:unit=>10.25, :perc=>0.0, :exp=>2014-07-19 00:00:00 +1000}}]

答案 1 :(得分:0)

部分困难在于您的数据结构确实没有意义。相反,让“密钥”只是每个哈希的一个元素(将:key更改为语义上的任何意义):

items = [...] # your data from question
items = items.map do |hash|
  key, values = hash.first
  { key: key }.merge(values)
end
#=> [{:key=>"XYZ140717", :unit=>10.25, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"},
#    {:key=>"ABC140719", :unit=>8.71, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"},
#    {:key=>"MNO140718", :unit=>8.55, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"}]

现在使用sort_by变得相当简单:

items.sort_by { |item| item[:key] }
#=> [{:key=>"ABC140719", :unit=>8.71, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"},
#    {:key=>"MNO140718", :unit=>8.55, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"},
#    {:key=>"XYZ140717", :unit=>10.25, :perc=>0.0, :exp=>"2014-07-19 00:00:00 +1000"}]

如果您坚持保留当前的数据结构,您当然可以执行以下操作:

items.sort_by { |hash| hash.keys.first }