2015-12-23 25 views
0

内比方说,我有这样一个Hash:把每个哈希元素的数组的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"}}]} 
+0

@sergiotulentsev,现在两个答案都被删除。两者都应该变成社区wiki的答案。 –

+0

@TheTinMan:嗯,我看到一个人仍然站着。不需要两者都有。 –

+0

@SergioTulentsev,是的,其他人在评论交换后立即取消删除。 –

回答

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

好的,魔杖。你也可以写'hash [k] = [process(v)]'。 –

+0

@CarySwoveland我没有太多混淆原来的代码,它几乎是OP所拥有的。随意将其更新为其社区wiki –

2

周期性PROC大约是另一种方式:

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

它可与单做减少,但这样事情变得更加模糊处理。

相关问题