如何对可能为零的值使用sort_by?

Eki*_*bal 4 ruby ruby-on-rails

假设我有一个数组:[{one: 1, two: 2}, {one: 5, two: 6}],我想使用sort_by之类的东西:

[1] pry(main)> [{one: 1, two: 2}, {one: 5, two: 6}].sort_by{|x| [x[:one], x[:two]]}
Run Code Online (Sandbox Code Playgroud)

但是,当我为其中一个值引入nil时,我得到ArgumentError: comparison of Array with Array failed

=> [{:one=>1, :two=>2}, {:one=>5, :two=>6}]
[2] pry(main)> [{one: 1, two: 2}, {one: nil, two: 6}].sort_by{|x| [x[:one], x[:two]]}
ArgumentError: comparison of Array with Array failed
Run Code Online (Sandbox Code Playgroud)

如何避免此错误?

Alb*_*aul 5

使用此语法,

starred.sort_by { |a| [a ? 1 : 0, a] }
Run Code Online (Sandbox Code Playgroud)

当必须比较两个元素时,它将比较一个数组。当Ruby比较数组(调用===方法)时,它将比较第一个元素,并且仅在第一个元素相等时才转到第二个元素。? 1 : 0保证我们将Fixnum作为第一个元素,因此应该没有错误。

如果这样做? 0 : 1nil将出现在数组的末尾而不是开头。这是一个例子:

irb> [2, 5, 1, nil, 7, 3, nil, nil, 4, 6].sort_by { |i| [i ? 1 : 0, i] }
=> [nil, nil, nil, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

来源

  • 那么如何将 nil 放在最后呢? (3认同)