himn
himn

Reputation: 31

Sort array of hashes

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

Answers (4)

Cary Swoveland
Cary Swoveland

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

iGian
iGian

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

Ritesh Ranjan
Ritesh Ranjan

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

Marek Lipka
Marek Lipka

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

Related Questions