2015-08-14 47 views
1

我想了解如何在需要时使用键和/或其子项对ruby哈希进行排序。对于例子:哈希与sub_hashs如何使用动态密钥对Ruby哈希进行排序

two_hash = { 
    'a' => {'displayName' => "A", 'name' => "Apple", 'Association' => {'id' => '1', 'type' => 'B2'}}, 
    'c' => {'displayName' => "D", 'name' => "Banana", 'Association' => {'id' => '1', 'type' => 'B3'}}, 
    'b' => {'displayName' => "C", 'name' => "Orange", 'Association' => {'id' => '1', 'type' => 'B1'}}, 
    'd' => {'displayName' => "B", 'name' => "Kiwi", 'Association' => {'id' => '1', 'type' => 'B4'}} 
} 

目前我可以这样排序,调用,并指定密钥/子项进行排序。

puts (two_hash.sort_by {|h, k| k['displayName']}) 
puts (two_hash.sort_by {|h, k| k['Association']['type']}) 

我想将其转换为一个proc和使用它,每当我想给一个子项的输入。

我想要它,所以我可以传递一个键或一个子键,它会为我排序。像这样,有没有办法在Ruby中做到这一点?

sort_stuff_method(two_hash, ['displayname']) 
sort_stuff_method(two_hash, ['Association']['type']) 

回答

2

这是你正在寻找,

def sort_stuff_method(input_hash, sort_key, sort_sub_key=nil) 
    input_hash.sort_by{|h,k| sort_sub_key.nil? ? k[sort_key] : k[sort_key][sort_sub_key]} 
end 

什么,你可以使用它像这样,

sort_stuff_method(input_hash, 'displayName') 
sort_stuff_method(input_hash, 'Association', 'Type') 
+0

谢谢你。这正是我所期待的。 –

3

这是做的一个方法:

def sort_em(h, *nested_keys) 
    h.sort_by { |k,v| nested_keys.reduce(v) { |g,k| g[k] } } 
end 

sort_em(two_hash, 'displayName') 
    #=> [["a", {"displayName"=>"A", "name"=>"Apple", 
    #   "Association"=>{"id"=>"1", "type"=>"B2"}}], 
    # ["d", {"displayName"=>"B", "name"=>"Kiwi", 
    #   "Association"=>{"id"=>"1", "type"=>"B4"}}], 
    # ["b", {"displayName"=>"C", "name"=>"Orange", 
    #   "Association"=>{"id"=>"1", "type"=>"B1"}}], 
    # ["c", {"displayName"=>"D", "name"=>"Banana", 
    #   "Association"=>{"id"=>"1", "type"=>"B3"}}]] 

sort_em(two_hash, 'Association', 'type') 
    #=> [["b", {"displayName"=>"C", "name"=>"Orange", 
    #   "Association"=>{"id"=>"1", "type"=>"B1"}}], 
    # ["a", {"displayName"=>"A", "name"=>"Apple", 
    #   "Association"=>{"id"=>"1", "type"=>"B2"}}], 
    # ["c", {"displayName"=>"D", "name"=>"Banana", 
    #   "Association"=>{"id"=>"1", "type"=>"B3"}}], 
    # ["d", {"displayName"=>"B", "name"=>"Kiwi", 
    #   "Association"=>{"id"=>"1", "type"=>"B4"}}]] 

这当然适用于任何数量的嵌套键。

相关问题