使用" sort"对ruby中的对象数组进行排序。

时间:2015-09-25 08:30:56

标签: arrays ruby sorting

如何对此数组进行排序,以便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

错误令人惊讶,因为执行[&#39;可选&#39;]会返回truefalsenil的值。

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

2 个答案:

答案 0 :(得分:6)

布尔值不是序数数据类型 - true不大于或小于false,它只是不相等,因此您无法使用<=>运营商。如果要根据可选属性对数组进行排序,则需要一些简单的自定义逻辑。 E.g:

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

答案 1 :(得分:1)

要使sort生效,您必须根据documentation实施该块:

  

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

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

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