繁体   English   中英

将每个哈希元素放入数组Ruby中

[英]Put every Hash Element inside of an Array Ruby

假设我有一个这样的哈希:

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

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

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

{"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"}}]}

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

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"}]}]}

重复处理是另一种解决方法:

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"}]}]}

可以通过一次reduce来完成,但是那样会使事情变得更加混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM