如何使用动态键对 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"}}]] 

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