我需要按: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'}
]
(由于它只是一个例子而与逻辑无关,我在最终数组中停止了日期解析)
答案 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]] }