排序哈希数组

时间:2018-11-22 13:51:17

标签: ruby sorting hash

我有这个哈希数组:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]

我正在尝试按结果对它进行排序,然后命名:

@results.sort_by!{ |h| [h.res, h.name] }.reverse!

我收到此错误:

undefined method `res' for {:res=>39, :name=>"cain"}:Hash

请提出任何想法。

4 个答案:

答案 0 :(得分:1)

与JavaScript不同,您无法在哈希上调用h.res来获取res的值。您必须使用[]运算符来完成此操作:

@results.sort_by! { |h| [h[:res], h[:name]] }.reverse!

答案 1 :(得分:1)

这也做同样的事情:

@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
@results.sort_by! { |h| h[:res] }

答案 2 :(得分:1)

交叉条件参数以便按相反的方向按名称排序:

results.sort{ |h1, h2| [h2[:res], h2[:name]] <=> [h2[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}, {:res=>33, :name=>"al"}]


results.sort{ |h1, h2| [h2[:res], h1[:name]] <=> [h1[:res], h2[:name]] }
#=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"cain"}, {:res=>39, :name=>"dan"}, {:res=>33, :name=>"al"}, {:res=>33, :name=>"billy"}]

答案 3 :(得分:0)

您可以使用Enumerable#max_by(带有一个参数)。

@results.max_by(@results.size) { |h| h.values_at(:res, :name) }
  #=> [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"},
  #    {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]