【问题标题】:Sort an array of objects in ruby using "sort"使用“排序”对 ruby​​ 中的对象数组进行排序
【发布时间】:2015-09-25 08:30:56
【问题描述】:

如何对这个数组进行排序,以便所有带有 optional = true 的哈希都排在最后?

my_array = [
  { name: "foo", optional: true }, 
  { name: "pop" }, 
  { name: "boop", optional: true },
  { name: "pop", optional: false }
]

我试过了:

my_array.sort { |a,b| a['optional'] <=> b['optional'] }

但我收到此错误:

comparison of Hash with Hash failed

错误令人惊讶,因为执行 ['optional'] 将返回值 truefalsenil

注意:
我知道这个解决方案.sort_by { |a| (a['optional'] ? 1 : 0) }。我特别想了解sort方法。

【问题讨论】:

    标签: arrays ruby sorting


    【解决方案1】:

    布尔值不是序数数据类型 - true 不大于或小于 false,只是不相等,因此您也不能使用 &lt;=&gt; 运算符。如果要根据可选属性对数组进行排序,则需要一些简单的自定义逻辑。例如:

    my_array.sort { |a,b| a['optional'] == b['optional'] ? 0 : a['optional'] ? 1 : -1}
    

    【讨论】:

      【解决方案2】:

      要使sort 工作,您必须根据documentation 实现块:

      该块必须实现a和b之间的比较,并返回-1, 当 a 跟在 b 之后,当 a 和 b 相等时为 0,如果 b 跟在 a 之后,则 +1。

      @Mureinik 已经向您展示了如何做到这一点。

      我个人建议使用sort_by,因为这基本上就是它的用例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-27
        • 2022-01-03
        • 2011-08-18
        • 1970-01-01
        相关资源
        最近更新 更多