给定一个事件记录数组
jobs = [#<Job _id: 1, created_at: 2014-07-15 19:18:40 UTC, organization: "Acme In.c">,
#<Job _id: 3, created_at: 2014-05-20 09:27:38 UTC, organization: "Baxter">,
#<Job _id: 2, created_at: 2014-11-25 12:21:00 UTC, organization: "Wizard">,
#<Job _id: 3, created_at: 2015-01-15 07:20:10 UTC, organization: "Baxter">]
我怎样才能首先按 organization
以 A->Z 升序对数组进行排序,然后按 created_at
降序排序以结束此 ...
jobs = [#<Job _id: 1, created_at: 2014-07-15 19:18:40 UTC, organization: "Acme In.c">,
#<Job _id: 3, created_at: 2015-01-15 07:20:10 UTC, organization: "Baxter">,
#<Job _id: 3, created_at: 2014-05-20 09:27:38 UTC, organization: "Baxter">,
#<Job _id: 2, created_at: 2014-11-25 12:21:00 UTC, organization: "Wizard">]
我试着做 jobs.sort_by{|j| [j.organization, j.created_at]}
但我不太确定如何指定多个 asc/desc 规则,我得到的最接近的规则是按组织排序的,但是按创建的排序让我从最旧到最新而不是最新到最旧。我也试过先分组然后排序,但我也无法让它工作。任何帮助,如果赞赏。
最佳答案
一个好方法是使用 sort
和 <=>
和 nonzero?
像这样:
jobs.sort{|a,b|
(a.organization <=> b.organization).nonzero? ||
(b.created_at <=> a.created_at)
}
这段代码说:
- 按组织比较 A 和 B。
- 如果他们不同,那么我们就有了答案。
- 如果它们相同,那么我们需要做更多。
- 按时间比较 B 和 A。 (注B&A顺序相反)
- 如果他们不同,那么我们就有了答案。
- 如果它们相同,则排序顺序无关紧要。 (Ruby 排序“不稳定”)
独立于 ActiveRecord 的示例代码:
require 'time'
require 'ostruct'
jobs = [
OpenStruct.new(_id: 1, created_at: Time.parse("2014-07-15 19:18:40 UTC"), organization: "Acme Inc"),
OpenStruct.new(_id: 3, created_at: Time.parse("2014-05-20 09:27:38 UTC"), organization: "Baxter"),
OpenStruct.new(_id: 2, created_at: Time.parse("2014-11-25 12:21:00 UTC"), organization: "Wizard"),
OpenStruct.new(_id: 3, created_at: Time.parse("2015-01-15 07:20:10 UTC"), organization: "Baxter")
]
关于ruby - 按多列对事件记录数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27974962/