如何按哈希中的值对哈希数组进行排序?


119

这段Ruby代码的行为并不像我期望的那样:

# 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

我正在寻找通过键“值”对哈希数组进行排序的方法,但是它们是按未排序方式打印的。

Answers:


214

Ruby sort不会就地排序。(也许您有Python背景?)

Ruby具有sort!就地排序功能,但是sort_byRuby 1.8中没有就地变体。在实践中,您可以执行以下操作:

sorted = sort_me.sort_by { |k| k["value"] }
puts sorted

从Ruby 1.9+开始,.sort_by!可用于就地排序:

sort_me.sort_by! { |k| k["value"]}

28
实际上,这Array#sort_by!是Ruby 1.9.2中的新增功能。可今天所有的Ruby版本,要求我的backports宝石太:-)
马克-安德烈·Lafortune

嗨,有没有办法按降序排序?我想我可能想去3,2,1...
tekknolagi 2012年

2
你不能做到这一点与sort_by,但使用sort还是sort!和简单地拨动操作数:a.sort! {|x,y| y <=> x }ruby-doc.org/core-1.9.3/Array.html#method-i-sort
斯蒂芬Kochen

1
或:puts sorted = sort_me.sort_by{ |k,v| v }
Zaz

9
@tekknolagi:只需追加.reverse
Zaz

21

按照@shteef,但sort!按照建议的变体实现:

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

7

尽管Ruby没有sort_by就地变体,但是您可以执行以下操作:

sort_me = sort_me.sort_by { |k| k["value"] }

Array.sort_by! 在1.9.2中添加


1
这个“ Array.sort_by!已在1.9.2版中添加”的答案对我
有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.