2013-05-07 35 views
7

Tôi có một hàm băm, tôi đang cố trích xuất các khóa và giá trị cho nó. Hàm băm có băm và/hoặc mảng băm được lồng vào nhau.Lặp lại hàm băm lồng nhau có chứa hàm băm và/hoặc mảng

Sau khi kiểm tra trang web này và một số mẫu tôi nhận được khóa và giá trị. Nhưng gặp khó khăn trong việc giải nén nếu nó là một mảng băm.

Ví dụ:

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

Cho đến nay tôi có dưới đây mã từ 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 

Nhưng nó không thành công tại v.is_hash?(Array) hoặc v.is_a?(Array).

Tôi có thiếu gì đó không?

+1

kết quả mong muốn của bạn là gì? –

Trả lời

17

Nó không phải là hoàn toàn rõ ràng những gì bạn có thể muốn, nhưng cả hai ArrayHash thực hiện each (trong trường hợp của Hash, là bí danh cho each_pair).

Vì vậy, để có được chính xác đầu ra bạn sẽ nhận được nếu phương pháp của bạn sẽ làm việc, bạn có thể thực hiện nó như thế này:

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

Bạn đang gọi ihash (v), nếu v là một Mảng hoặc băm. cuộc gọi phương thức each_pair sẽ thất bại đối với mảng.

0

Bạn có thể bỏ qua đệ quy và sử dụng một cái gì đó như thế này:

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 

Output:

======== 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 
Các vấn đề liên quan