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'
    }
  }
}

到目前为止,我有以下代码,我如何循环遍历 ruby​​ 中的哈希哈希迭代 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)or处失败v.is_a?(Array)

我错过了什么吗?

4

3 回答 3

19

您可能想要什么并不完全清楚,但两者都ArrayHash实现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
于 2013-05-07T07:32:04.163 回答
1

如果 v 是 Array 或 Hash,您正在调用 ihash(v)。数组的 each_pair 方法调用将失败。

于 2013-05-07T06:02:29.863 回答
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
于 2013-05-07T06:05:30.823 回答