【问题标题】:How to use sort_by with values that could be nil? [duplicate]如何将 sort_by 与可能为 nil 的值一起使用? [复制]
【发布时间】:2016-02-21 16:41:46
【问题描述】:

假设我有一个数组:[{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]]}

但是,当我为其中一个值引入 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

如何避免此错误?

【问题讨论】:

  • nil 值应该出现在哪个位置?如果您想将它们视为0,就像在哈希访问中添加.to_i 一样简单:x[:one].to_i(假设:所有值都是nil 或整数)
  • @tessi 只是想忽略该值,如果它是 nil,因为有时我需要这些值是文本或整数
  • “忽略”是什么意思。使用[{one: nil, two: 5},{one: 3, two: 6}],结果应该是[{one: 3, two: 6}] 吗?
  • 在现实生活中我有一个哈希数组,想像array_of_hashes.sort_by{|e| [ e['description'].to_i, e['c_currency'].to_i, e['start_date'], e['maturity_date'] ] }一样使用它
  • 然后我会做类似[x[:a_string] || '', x[:some_date] || Date.today, ... 的事情。因此,将|| <default_value> 添加到每个哈希访问。这样你就可以控制nil值应该出现在哪个位置。

标签: ruby-on-rails ruby


【解决方案1】:

使用这种语法,

starred.sort_by { |a| [a ? 1 : 0, a] }

当它必须比较两个元素时,它会比较一个数组。当 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]

Source.

【讨论】:

  • 有点神秘,但它就像一个魅力。谢谢。
  • 那你怎么把 nil 放在最后?
  • 交换块中的0和1
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
相关资源
最近更新 更多