2013-05-07 6 views
7

मेरे पास हैश है, मैं इसके लिए कुंजी और मान निकालने का प्रयास कर रहा हूं। हैश में घोंसला हैश और/या हैश की सरणी है।Iterate नेस्टेड हैश जिसमें हैश और/या ऐरे

इस साइट की जांच करने के बाद और कुछ नमूने मुझे कुंजी और मूल्य मिल गए। लेकिन अगर यह हैश की एक सरणी निकालने में कठिनाई हो रही है।

उदाहरण:

{ 
    :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 ruby और Iterate 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

यह पूरी तरह स्पष्ट है कि तुम क्या चाहते हो सकता है नहीं है, लेकिन दोनों Array और Hash लागू each (जो, 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

आप ihash (v) को कॉल कर रहे हैं, यदि v एक ऐरे या हैश है। प्रत्येक_पैयर विधि कॉल सरणी के लिए विफल हो जाएगी।

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 
संबंधित मुद्दे