如何使用动态键对 Ruby 哈希进行排序
How to sort Ruby Hash with dynamic keys
我想了解如何在需要时使用键和/或它们的子键对 ruby 哈希进行排序。例如:
具有 sub_hashs
的散列示例
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'}}
}
目前我可以这样排序,调用并指定key/subkey作为排序依据。
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'])
这是你要找的吗,
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')
这是一种方法:
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"}}]]
这当然适用于任意数量的嵌套键。
我想了解如何在需要时使用键和/或它们的子键对 ruby 哈希进行排序。例如:
具有 sub_hashs
的散列示例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'}}
}
目前我可以这样排序,调用并指定key/subkey作为排序依据。
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'])
这是你要找的吗,
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')
这是一种方法:
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"}}]]
这当然适用于任意数量的嵌套键。