我有一个对象数组
[<#a star=1 val=1>,<#a star=nil val=3>,<#a star=2 val=2>]
我需要按时间排序的数组,然后按val排序
[ <#a star=2 val=2>,<#a star=1 val=1>,<#a star=nil val=3> ]
但是使用sort_by会抛出一个错误,因为时间是零.
我现在使用一种丑陋的方式来排序,但我确定有一个很好的方法去做
starred=[] @answers.each {|a| (starred << a) if a.starred } @answers=@answers-starred starred=starred.sort_by {|a| a.starred }.reverse @answers=starred+@answers
解决方法
starred.sort_by { |a| [a ? 1 : 0,a] }
当它必须比较两个元素时,它比较一个数组.当Ruby比较数组(调用===方法)时,它比较第一个元素,只有当第1个元素相等时才转到第2个元素. ? 1:0保证,我们将Fixnum作为第一个元素,所以应该没有错误.
如果你这样做? 0:1,nil将出现在数组的末尾,而不是开始.
这是一个例子:
irb> [2,5,1,nil,7,3,4,6].sort_by { |i| [i ? 1 : 0,i] } => [nil,2,6,7] irb> [2,6].sort_by { |i| [i ? 0 : 1,i] } => [1,nil]