2013-05-07 23 views
7

İçeren yinelemeli iç içe geçmiş hash Eşim var, anahtarlar ve bunun için değerler ayıklamaya çalışıyorum. Karma, yuvalanmış bir hash ve/veya karma dizileri içerir.Karma ve/veya Array

Bu siteyi ve birkaç örneği kontrol ettikten sonra anahtar ve değerleri aldım. Ancak, bir dizi karmaşayı çıkarmakta zorlanıyor.

Örnek:

{ 
    :key1 => 'value1', 
    :key2 => 'value2', 
    :key3 => { 
    :key4 => [{:key4_1 => 'value4_1', :key4_2 => 'value4_2'}], 
    :key5 => 'value5' 
    }, 
    :key6 => { 
    :key7 => [1,2,3], 
    :key8 => { 
     :key9 => 'value9' 
    } 
    } 
} 

Şimdiye kadar how do i loop over a hash of hashes in ruby ve

def ihash(h) 
    h.each_pair do |k,v| 
    if v.is_a?(Hash) || v.is_a?(Array) 
     puts "key: #{k} recursing..." 
     ihash(v) 
    else 
     # MODIFY HERE! Look for what you want to find in the hash here 
     puts "key: #{k} value: #{v}" 
    end 
    end 
end 

Iterate over an deeply nested level of hashes in Ruby kod altında olması Fakat v.is_hash?(Array) veya v.is_a?(Array) başarısız olur.

Bir şey mi eksik?

+1

beklenen çıkışı nedir? –

cevap

17

İstediğin ne olabileceğini tam olarak belli değil, ama hem Array ve Hash (each uygulamak Bu, Hash durumunda, each_pair için bir diğer addır.

Yani yöntem işe olsaydı alacağınız tam verim almak için, böyle uygulamak olabilir:

def iterate(h) 
    h.each do |k,v| 
    # If v is nil, an array is being iterated and the value is k. 
    # If v is not nil, a hash is being iterated and the value is v. 
    # 
    value = v || k 

    if value.is_a?(Hash) || value.is_a?(Array) 
     puts "evaluating: #{value} recursively..." 
     iterate(value) 
    else 
     # MODIFY HERE! Look for what you want to find in the hash here 
     # if v is nil, just display the array value 
     puts v ? "key: #{k} value: #{v}" : "array value #{k}" 
    end 
    end 
end 
1

Eğer v bir Array veya Hash ise ihash (v) öğesini çağırıyorsunuz. her_pair yöntem çağrısı diziler için başarısız olur.

0

Sen özyinelemeye atlayıp daha böyle bir şey kullanabilirsiniz:

a = {} 
a[0] = { first: "first" } 
a[1] = [{ second: "second_1" }, { second: "second_2" }] 

a.each_pair do |k1, v1| 
    puts "======== key: #{k1}, value: ========" 

    if v1.class == Hash 
    v1.each_pair do |k2, v2| 
     puts "key_2: #{k2}, value: #{v2}" 
    end 
    else 
    v1.each do |h| 
     h.each_pair do |k2, v2| 
     puts "hash #{v1.index(h)} => key_2: #{k2}, value: #{v2}" 
     end 
    end 
    end 
end 

Çıktı:

======== key: 0, value: ======== 
key_2: first, value: first 
======== key: 1, value: ======== 
hash 0 => key_2: second, value: second_1 
hash 1 => key_2: second, value: second_2