如何按一个值对哈希数组进行排序,然后再对其进行排序?

时间:2016-10-20 23:06:45

标签: ruby

我需要按: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'}
]

(由于它只是一个例子而与逻辑无关,我在最终数组中停止了日期解析)

3 个答案:

答案 0 :(得分:1)

这是使用Ruby enum 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

答案 1 :(得分: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
}

答案 2 :(得分:0)

尝试

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