我有以下数组/哈希:
[{"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。 我无法想办法。
答案 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 }