Ruby的sort_by方法

25

我刚开始学习 Ruby。我有一个哈希数组,想要根据哈希中的某个元素来对数组进行排序。我认为可以使用 sort_by 方法。请问有人能帮忙吗?

#array of hashes
array = []
hash1 = {:name => "john", :age => 23}
hash2 = {:name => "tom", :age => 45}
hash3 = {:name => "adam", :age => 3}
array.push(hash1, hash2, hash3)
puts(array)

这是我的sort_by代码:

# sort by name
array.sort_by do |item|
    item[:name]
end
puts(array)

数组不会发生任何事情,也没有错误发生。

3个回答

43

你需要存储结果:

res = array.sort_by do |item|
    item[:name]
end 
puts res

或者修改数组本身:

array.sort_by! do |item| #note the exclamation mark
    item[:name]
end 
puts array

谢谢。我也刚刚发现了同样的问题。看到了另一个 sort_by 的例子。所以 sort_by 不会原地排序。 - U-L
7
Bang 方法(以感叹号结尾的方法)会就地修改对象,但最好不要使用它们,而是创建新的对象作为旧对象的修改版本。允许方法改变对象可能会在程序中引入微妙的错误。 - quandrum

1

你也可以使用普通的排序方法来完成它。

array.sort { |a,b| a[:name] <=> b[:name] }

以上是升序排列的方式,如果要降序排列,请将a替换为b。如果要修改数组本身,请使用sort!。

0

您可以在一行中使用sort by方法:

array.sort_by!{|item| item[:name]} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接