当您具有 nil 值和多个排序时如何使用sort_by

  • 本文关键字:排序 何使用 sort by nil ruby
  • 更新时间 :
  • 英文 :


>我有一个调用数组,我想先按scheduled_date排序,然后再按triggered_date排序。

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] }

因为triggered_date有时是一个零值,所以我得到错误#<ArgumentError: comparison of Array with Array failed>

如何对此进行排序以说明零值? 我已经用谷歌搜索了示例,但找不到与我拥有的类似的东西。例如,我尝试过

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] } rescue nil
calls.sort_by! { |call| [call.scheduled_date, call.triggered_date] || call.scheduled_date }

但它们不起作用。我已经看到<=>用于sort_by但不确定如何在这种有多种排序的情况下使用它。任何帮助将不胜感激。

如果您对可能缺少的triggered date有一个首选替换值,可以像您在注释中提到的那样call.scheduled_date.end_of_day,您可以执行以下操作:

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date || call.scheduled_date.end_of_day] }

然后数组的第二个条目将被triggered_date(如果存在(和call.scheduled_date.end_of_day如果triggered_datenil

旧答案:

如果您希望排序忽略nil-part(效果是那些带有triggered_date == nil的条目被认为比具有当前triggered_date的条目"小",您可以执行以下操作:

calls.sort_by! { |call| [call.scheduled_date, call.triggered_date].compact }

compact从数组中删除nil值。因此,没有triggered_date的调用只有一个大小为 1 的数组进行比较,而其他调用的大小为 2。矮子似乎在这里获胜,所以这些都排在任何其他人之前。

不过要小心,如果scheduled_date也可能nil!然后这种方法会导致非常奇怪的结果。

已编辑:如果可能的回退已知,则添加了解决方案

最新更新