我有一个哈希,我正在尝试为它提取键和值。散列具有嵌套散列和/或散列数组。
在检查了这个网站和几个样本后,我得到了关键和值。但是如果它是一系列哈希值,则很难提取出来。
示例:
{
: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)
失败。
我错过了什么吗?
答案 0 :(得分:19)
您可能想要的内容并不完全清楚,但Array
和Hash
都会实现each
(在Hash
的情况下,它是{的别名{1}})。
因此,如果您的方法可以正常工作,那么为了获得准确的输出,您可以像这样实现它:
each_pair
答案 1 :(得分:1)
如果v是数组或哈希,则调用ihash(v)。对于数组,each_pair方法调用将失败。
答案 2 :(得分: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