140

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.

4 Answers 4

251

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"]}
Sign up to request clarification or add additional context in comments.

8 Comments

Actually, Array#sort_by! is new in Ruby 1.9.2. Available today to all Ruby version by requiring my backports gem too :-)
Hi, is there a way to sort in descending order too? I figure I might want to go 3,2,1...
You can't do that with sort_by, but use sort or sort! and simply flip the operands: a.sort! {|x,y| y <=> x } (ruby-doc.org/core-1.9.3/Array.html#method-i-sort)
Or: puts sorted = sort_me.sort_by{ |k,v| v }
@tekknolagi: Just append .reverse.
|
22

As per @shteef but implemented with the sort! variant as suggested:

sort_me.sort! { |x, y| x["value"] <=> y["value"] }

Comments

8

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

1 Comment

This "Array.sort_by! was added in 1.9.2" answer worked for me
2

You can use sort_me.sort_by!{ |k| k["value"]}. This should work.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.