【问题标题】:Sort ruby array in descending order with nil values and multiple arguments使用 nil 值和多个参数按降序对 ruby​​ 数组进行排序
【发布时间】:2021-04-16 13:02:34
【问题描述】:

首先,我找到了用可能的 nil 值对值进行排序的帖子,还有其他要按降序排序的帖子,但我没有找到两者的解决方案。

这是我所在的地方:

@records = @records.to_a.sort_by do |r| [-r.optimized_all_count, [r.year ? 1 : 0, r.year]] end

这很好用,但我希望“年份”比较器是递减的。我对此进行了测试:

-[r.year ? 1 : 0, r.year]

但符号“-”不适用于 nil 值。我也试过a.reverse...

如何获得年份参数降序(并保持-r.optimized_all_count 作为第一个排序参数),理想情况下:

2020, 2018, 2017...nil, nil, nil.

谢谢

【问题讨论】:

  • @records.to_a – 是否偶然涉及到数据库查询?
  • 'to_a' 不是必需的,是的,它是一个 AR 数据库查询。
  • 您是否考虑将排序委托给数据库?

标签: arrays ruby sorting null


【解决方案1】:

试试这个:

@records = @records.to_a.sort_by do |r| [-r.optimized_all_count, [r.year ? 0 : 1, r.year ? -r.year : nil]] end

【讨论】:

    【解决方案2】:
    @records.to_a.sort_by { |r| [-r.optimized_all_count, -(r.year || -Float::INFINITY)] }
    

    不清楚是否需要.to_a

    【讨论】:

    • 'to_a' 实际上不是必需的。您的解决方案也适用于 Cary,而且更短。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2011-02-08
    • 1970-01-01
    • 2015-08-30
    • 2013-09-20
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多