【问题标题】:Sort an array of hashes when some objects have nil attributes当某些对象具有 nil 属性时,对哈希数组进行排序
【发布时间】:2012-04-20 00:29:55
【问题描述】:

我有一个哈希数组,其中键是用户对象(这是因为我按用户对搜索结果进行分组,如下所示:#<User:0x007ffa3d570f00> => ["taco","pizza","unicorn"])。

我希望能够按用户对象属性对哈希数组进行排序,如下所示:

search_results.sort_by{|item| item[0].age} #item[0] = User object

但是,当遇到第一个年龄为 Nil 的用户时,它会抛出 ArgumentError: comparison of NilClass with Integer failed。我尝试在 sort_by 块中添加 unless user.age.nil?,但这没有帮助。

有什么想法吗?

【问题讨论】:

  • 等等。如果它是一个哈希数组,那么每个元素都是一个哈希,而不是一个用户。哈希没有#age 方法。所以我很困惑 - 你想完成什么?您想要每个 Hash 的哪个键的#age?
  • @MarkReed 嗯,好点,虽然错误似乎暗示它正在获取age(因为它是一个整数),否则它会因NoMethodError尝试调用而失败age.
  • 这告诉我你的 search_results 可能不是你想象的那样。你试过只是pp'ing吗?还是要求 search_results[0].class?
  • 也许我解释得不够清楚,它是一个哈希数组,其中键是“用户”对象,值是数组。因此,“sort_by”方法。这是一种常见的模式

标签: ruby sorting hash


【解决方案1】:

nil 对象视为其他对象,可能是0Float::INFINITY

search_results.sort_by { |user| user.age || 0 }

由于nil.to_i == 0,你也可以这样做:

search_results.sort_by { |user| user.age.to_i }

【讨论】:

    【解决方案2】:

    试试这个:

    search_results.sort_by{|user| user.age ? user.age : 0 }
    

    【讨论】:

      【解决方案3】:

      对于布尔值,基于 megas 的解决方案:

      [true, false, false, true].sort { |a|
               a ? 0 : 1
            }
      
      => [true, true, false, false]
      

      【讨论】:

        猜你喜欢
        • 2022-12-04
        • 1970-01-01
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2015-09-10
        • 2012-01-21
        相关资源
        最近更新 更多