2015-09-25 23 views
1

如何排序該數組,以便所有與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 

錯誤是令人驚訝的,因爲做一個[ '可選']將返回true值,false ,或nil

注意:
我知道這個解決方案.sort_by { |a| (a['optional'] ? 1 : 0) }。我想特別瞭解sort方法。

回答

6

布爾值不是順序數據類型 - true不大於或小於false,它只是不相等,所以您也不能使用<=>運算符。如果你想根據可選屬性對數組進行排序,你需要一些簡單的定製邏輯。例如: -

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

對於sort工作,你必須根據documentation落實塊:

The block must implement a comparison between a and b, and return -1, when a follows b, 0 when a and b are equivalent, or +1 if b follows a.

@Mureinik已經展示瞭如何做到這一點。

我個人建議使用sort_by,因爲這基本上就是它的用例。