数组 – 根据某些元素中可能为零的属性对数组进行排序

前端之家收集整理的这篇文章主要介绍了数组 – 根据某些元素中可能为零的属性对数组进行排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个对象数组
[<#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]

猜你在找的Ruby相关文章