Reputation: 31
I have this array of hashes:
@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
I am trying to sort it by result, then name:
@results.sort_by!{ |h| [h.res, h.name] }.reverse!
And I get this error:
undefined method `res' for {:res=>39, :name=>"cain"}:Hash
Any ideas, please.
Upvotes: 0
Views: 102
Reputation: 110755
You could use Enumerable#max_by (with an argument).
@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"}]
Upvotes: 0
Reputation: 11193
Cross the condition parameters in order to have sorted by name in the opposite direction:
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"}]
Upvotes: 1
Reputation: 1012
This also do the same:
@results = [{:res=>88, :name=>"anna"}, {:res=>39, :name=>"dan"}, {:res=>39, :name=>"cain"}, {:res=>33, :name=>"billy"}]
@results.sort_by! { |h| h[:res] }
Upvotes: 1
Reputation: 51191
Unlike in JavaScript, you can't call h.res
on hash to get res
value. You have to do it using []
operator:
@results.sort_by! { |h| [h[:res], h[:name]] }.reverse!
Upvotes: 1