2009-09-18 70 views
11

Ruby在Enumerables上有一个sort_by方法。太棒了!所以你可以做类似ruby​​ sort_by两次

entries.sort_by { |l| l.project.name } 

这将按照他们的项目名称排序一堆条目。你怎么能这样做,以便在同名的项目中,条目按时间排序?

回答

24

我会建议把你想排序的列放入数组中。

entries.sort_by { |l| [l.project.name, l.project.time] } 

这将尊重每种类型的自然排序顺序。

+0

如果您希望次要排序是最新的排序,请执行以下操作:'now = Time.now; entries.sort_by {| e | e.project.name,now - e.project.time}' – 2009-09-18 13:00:44

+5

entries.sort_by {| e | e.project.name,-e.project.time} 更有意义。 – 2009-09-18 13:32:40

+0

不错Antti,一点都不差! – 2009-09-18 17:19:19

6

你可以使用常规的排序方法来做到这一点。

entries.sort do |a, b| 
    comp = a.project.name <=> b.project.name 
    comp.zero? ? (a.project.time <=> b.project.time) : comp 
end 
+3

非零?方法可以在这里有所帮助:sort {| a,b | (a.project.name <=> b.project.name).nonzero?或(a.project.time <=> b.project.time)} – 2009-09-18 11:35:21

3

返回数组:

entries.sort_by { |l| [ l.project.name, l.project.time] } 

这个工程,因为<=>操作上确实阵列场逐场“词汇”比较这是你在找什么。