Учитывая предоставленную структуру:
pigeon_data = { :color => {
:purple => ["Theo", "Peter Jr.", "Lucky"],
:grey => ["Theo", "Peter Jr.", "Ms. K"],
:white => ["Queenie", "Andrew", "Ms. K", "Alex"],
:brown => ["Queenie", "Alex"] },
:gender => {
:male => ["Alex", "Theo", "Peter Jr.", "Andrew", "Lucky"],
:female => ["Queenie", "Ms. K"] },
:lives => {
"Subway" => ["Theo", "Queenie"],
"Central Park" => ["Alex", "Ms. K", "Lucky"],
"Library" => ["Peter Jr."],
"City Hall" => ["Andrew"] } }
Мы можем циклически проходить по наборам, используя хэш, который строится на основе процесса по умолчанию.
builder = Hash.new {|h,k| h[k] = Hash.new {|h2,k2| h2[k2] = []}}
pigeon_data.each_with_object(builder) do |(category,values),cage|
values.each do |cat_value,birds|
birds.each do |bird|
cage[bird][category] << cat_value
end
end
end
Когда строитель получает новый ключ, он назначает новый хэш в качестве значения. Когда этот вложенный Hash получает новый ключ, он присваивает пустой массив в качестве значения. Итак, мы просто размещаем элементы в том порядке, в котором мы хотим, чтобы они отображались [bird][category] << value
В результате:
{"Theo"=>{
:color=>[:purple, :grey],
:gender=>[:male],
:lives=>["Subway"]},
"Peter Jr."=>{
:color=>[:purple, :grey],
:gender=>[:male],
:lives=>["Library"]},
"Lucky"=>{
:color=>[:purple],
:gender=>[:male],
:lives=>["Central Park"]},
"Ms. K"=>{
:color=>[:grey, :white],
:gender=>[:female],
:lives=>["Central Park"]},
"Queenie"=>{
:color=>[:white, :brown],
:gender=>[:female],
:lives=>["Subway"]},
"Andrew"=>{
:color=>[:white],
:gender=>[:male],
:lives=>["City Hall"]},
"Alex"=>{
:color=>[:white, :brown],
:gender=>[:male],
:lives=>["Central Park"]}}