2013-04-22 38 views
1

得到一個Ruby陣列等:排序散列Ruby中的陣列(由存在任選鍵+值分選)

[ { "lat" => 123, "lon" => 456 }, 
    { "lat" => 789, "lon" => 102, "col" => "red" }, 
    { "lat" => 442, "lon" => 342 } ] 

我想對它進行排序,使得任何散列與col作爲密鑰意願被推到陣列的頂部或底部。

找不到正確的sort_by語法/語義。

+0

頂部或底部;哪一個? – sawa 2013-04-22 06:04:10

+0

你寫了什麼代碼? – 2013-04-22 13:38:14

回答

4
a = [ { "lat" => 123, "lon" => 456 }, 
    { "lat" => 789, "lon" => 102, "col" => "red" }, 
    { "lat" => 442, "lon" => 342 } ] 

如果你想要把它們放在上面,然後

a.partition{|h| h.key?("col")}.flatten 

如果你想把它們放在底部,然後由鐵皮人建議,

a.partition{|h| h.key?("col").!}.flatten 
+0

謝謝@sawa :) – 2013-04-22 06:15:52

+2

把它們放在底部,試試'!h.key?('col')'並移除'reverse'。他們應該完成同樣的事情,但是要減少工作。 – 2013-04-22 13:43:21

+0

是的,那樣更好。 – sawa 2013-04-22 14:01:05

1

我喜歡的功能更多的方法:

require 'pp' 

a = [ {:foo => "aa","col" => "bar"}, { "lat" => 123, "lon" => 456 }, 
    { "lat" => 789, "lon" => 102, "col" => "red" }, 
    { "lat" => 442, "lon" => 342 } ] 

arr = a.group_by{|h| h.key?("col")} 

pp arr[false] + arr[true] # on the bottom 

輸出:

[{"lat"=>123, "lon"=>456}, 
{"lat"=>442, "lon"=>342}, 
{:foo=>"aa", "col"=>"bar"}, 
{"lat"=>789, "lon"=>102, "col"=>"red"}] 

pp arr[true] + arr[false] #on the top 

輸出:

[{:foo=>"aa", "col"=>"bar"}, 
{"lat"=>789, "lon"=>102, "col"=>"red"}, 
{"lat"=>123, "lon"=>456}, 
{"lat"=>442, "lon"=>342}] 
+0

感謝@RubyLovely – 2013-04-22 20:16:11