How do I sort an array of hashes by a value in the hash?
RubyArraysSortingHashRuby Problem Overview
This Ruby code is not behaving as I would expect:
# create an array of hashes
sort_me = []
sort_me.push({"value"=>1, "name"=>"a"})
sort_me.push({"value"=>3, "name"=>"c"})
sort_me.push({"value"=>2, "name"=>"b"})
# sort
sort_me.sort_by { |k| k["value"]}
# same order as above!
puts sort_me
I'm looking to sort the array of hashes by the key "value", but they are printed unsorted.
Ruby Solutions
Solution 1 - Ruby
Ruby's sort
doesn't sort in-place. (Do you have a Python background, perhaps?)
Ruby has sort!
for in-place sorting, but there's no in-place variant for sort_by
in Ruby 1.8. In practice, you can do:
sorted = sort_me.sort_by { |k| k["value"] }
puts sorted
As of Ruby 1.9+, .sort_by!
is available for in-place sorting:
sort_me.sort_by! { |k| k["value"]}
Solution 2 - Ruby
As per @shteef but implemented with the sort!
variant as suggested:
sort_me.sort! { |x, y| x["value"] <=> y["value"] }
Solution 3 - Ruby
Although Ruby doesn't have a sort_by
in-place variant, you can do:
sort_me = sort_me.sort_by { |k| k["value"] }
Array.sort_by!
was added in 1.9.2
Solution 4 - Ruby
You can use sort_me.sort_by!{ |k| k["value"]}
. This should work.