2016-10-20 44 views
0

我有散列的大规模阵列,我需要通过:job_num数值其通过:job_num排序之后订购我需要:date我将如何对一个哈希值数组进行排序,然后再对它进行排序?

array = [ 
    {job_num: 1236, date: Date.parse('2016/10/19')}, 
    {job_num: 1234, date: Date.parse('2016/10/17')}, 
    {job_num: 1236, date: Date.parse('2016/10/20')}, 
    {job_num: 1233, date: Date.parse('2016/10/18')} 
] 
# => [{:job_num=>1236, :date=>#<Date: 2016-10-19 ((2457681j,0s,0n),+0s,2299161j)>}, {:job_num=>1234, :date=>#<Date: 2016-10-17 ((2457679j,0s,0n),+0s,2299161j)>}, {:job_num=>1236, :date=>#<Date: 2016-10-20 ((2457682j,0s,0n),+0s,2299161j)>}, {:job_num=>1233, :date=>#<Date: 2016-10-18 ((2457680j,0s,0n),+0s,2299161j)>}] 

我需要通过:job_num

第一排序我的数组排序它
array.sort! { |x,y| x[:job_num] <=> y[:job_num] } 
# => [{:job_num=>1233, :date=>#<Date: 2016-10-18 ((2457680j,0s,0n),+0s,2299161j)>}, {:job_num=>1234, :date=>#<Date: 2016-10-17 ((2457679j,0s,0n),+0s,2299161j)>}, {:job_num=>1236, :date=>#<Date: 2016-10-20 ((2457682j,0s,0n),+0s,2299161j)>}, {:job_num=>1236, :date=>#<Date: 2016-10-19 ((2457681j,0s,0n),+0s,2299161j)>}] 

然后我需要它的日期由工号排序后进行排序,就应该结束了,数组看起来像这样如果一切顺利:

array = [ 
    {job_num: 1233, date: '2016/10/18'}, 
    {job_num: 1234, date: '2016/10/17'}, 
    {job_num: 1236, date: '2016/10/19'}, 
    {job_num: 1236, date: '2016/10/20'} 
] 

(I离开的时间解析,因为其仅是示例的最后阵列和无关的逻辑中)

+0

你可以发布一些你的尝试代码吗? – roelofs

回答

0

尝试

array.sort_by! { |item| [item[:job_num], item[:date]] } 
0
array.sort! { |x,y| 
    by_job_num = x[:job_num] <=> y[:job_num] 
    by_job_num.zero? ? x[:date] <=> y[:date] : by_job_num 
} 
+0

尽管这段代码可能会解决问题,但它并不能解释为什么或如何回答问题。请[请为您的代码添加解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers),因为这确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。 **举报人/评论者:** [仅限代码解答,例如downvote,请勿删除!](// meta.stackoverflow.com/a/260413/2747593) –

1

下面是使用Ruby枚举sort_by方法的溶液:

#! /usr/bin/env ruby 

require 'date' 

puts "Sorting an array" 
array = [ 
    {job_num: 1236, date: Date.parse('2016/10/19')}, 
    {job_num: 1234, date: Date.parse('2016/10/17')}, 
    {job_num: 1236, date: Date.parse('2016/10/20')}, 
    {job_num: 1233, date: Date.parse('2016/10/18')}, 
] 

puts array 

array.sort_by! { |x| [ x[:job_num], x[:date] ] } 

puts 
puts array