递归地将键值对推送到具有无差别访问权限的哈希值

时间:2011-09-21 10:01:58

标签: ruby-on-rails

我是ruby on rails的新手,我正在尝试做类似的事情, 我有哈希

hash1 = {"a"=>"1","b"=>{"c"=>"3","d"=>{"e"=>"5"}},"f"=>"6","g"=>{"h"=>"7","i"=>"8"}}

然后我使用递归方法来读取键值对,如下所示:

def traverse_hash_recursively(words)
  words.each_pair do |key,value|
    if value.is_a?(String)
      puts "#{key}=>#{value}"
    else
      traverse_hash_recursively(value)
    end
  end
end

这样调用上面的方法:

traverse_hash_recursively(hash1)

,输出如下:

a=>1
c=>3
e=>5
f=>6
h=>7
i=>8

但这不是我想要的输出,我希望输出为

hash[a]=1
hash[b][c]=3
hash[b][d][e]=5
hash[f]=6
hash[g][h]=7
hash[g][i]=8

我知道我在代码中写的内容会给我输出的结果,但我将如何获得所需的输出? 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我们需要一个能够跟踪密钥的堆栈

def traverse_hash_recursively(keys, words)
  words.each_pair do |key,value| 
    keys << key
    if value.is_a?(String)
      puts "#{keys.join(',')}=>#{value}"
      keys.pop
    else
      traverse_hash_recursively(keys, value)
      keys.pop
    end
  end
end

你应该用空堆栈调用该函数。

traverse_hash_recursively([], hash1)

输出=&gt;

a=>1
b,c=>3
b,d,e=>5
f=>6
g,h=>7
g,i=>8

现在,其余的只是格式化。