如何对此数组进行排序,以便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;]会返回true
,false
或nil
的值。
注意:
我知道这个解决方案.sort_by { |a| (a['optional'] ? 1 : 0) }
。我想特别了解sort
方法。
答案 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
,因为它基本上就是它的用例。