2013-05-07 16 views
7

ハッシュがあります。私はハッシュを持っています。ハッシュは、ネストされたハッシュおよび/またはハッシュの配列を有する。ハッシュおよび/または配列を含むネストされたハッシュを繰り返します。

このサイトといくつかのサンプルを確認した後、私はキーと値を得ました。しかし、ハッシュの配列を抽出するのが難しい場合。

例:

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

は、これまでのところ、私はhow do i loop over a hash of hashes in rubyIterate over an deeply nested level of hashes in Ruby

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 

からのコードの下に持っている。しかし、それはv.is_hash?(Array)またはv.is_a?(Array)で失敗します。

何か不足していますか?

+1

? –

答えて

17

あなたが望むかもしれないもの、必ずしも明らかではないが、両方ArrayHasheachを実装Hashの場合、each_pairの別名です)。

だからあなたの方法がうまくいく場合はなるだろう正確に出力を得るために、あなたはこのようにそれを実現することができます。あなたの予想出力が何であるかを

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

vが配列またはハッシュの場合は、ihash(v)を呼び出しています。 each_pairメソッド呼び出しは配列に対して失敗します。

0

あなたは再帰をスキップして、より多くのこのようなものを使用することができます

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 

出力:

======== 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 
関連する問題