将每个Hash元素放在Array Ruby中

时间:2015-12-23 17:35:42

标签: ruby

让我们说我有这样的哈希:

my_hash = {"a"=>{"a1"=>"b1"}, "b"=>"b", "c"=>{"c1"=>{"c2"=>"c3"}}}

我想转换散列内的每个元素,这也是放在数组内的散列。

例如,我希望完成的Hash看起来像这样:

{"a"=>[{"a1"=>"b1"}], "b"=>"b", "c"=>[{"c1"=>[{"c2"=>"c3"}]}]}

这是我到目前为止所尝试的内容,但我需要它以递归方式工作,而且我不太确定如何做到这一点:

my_hash.each do |k,v|
  if v.class == Hash
    my_hash[k] = [] << v
  end
end
 => {"a"=>[{"a1"=>"b1"}], "b"=>"b", "c"=>[{"c1"=>{"c2"=>"c3"}}]}

2 个答案:

答案 0 :(得分:4)

您需要将代码包装到方法中并递归调用它。

my_hash = {"a"=>{"a1"=>"b1"}, "b"=>"b", "c"=>{"c1"=>{"c2"=>"c3"}}}

def process(hash)
    hash.each do |k,v|
      if v.class == Hash
        hash[k] = [] << process(v)
      end
    end
end

p process(my_hash)
#=> {"a"=>[{"a1"=>"b1"}], "b"=>"b", "c"=>[{"c1"=>[{"c2"=>"c3"}]}]}

答案 1 :(得分:2)

重复触发是另一种方式:

h = {"a"=>{"a1"=>"b1"}, "b"=>"b", "c"=>{"c1"=>{"c2"=>"c3"}}}
h.map(&(p = proc{|k,v| {k => v.is_a?(Hash) ? [p[*v]] : v}}))
 .reduce({}, &:merge)
# => {"a"=>[{"a1"=>"b1"}], "b"=>"b", "c"=>[{"c1"=>[{"c2"=>"c3"}]}]}

可以通过单一减少来完成,但这会使事情变得更加模糊。