2015-12-23 4 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. Не стесняйтесь обновлять его как свою вики сообщества –

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

Это может быть сделано с одним уменьшить, но что путь все становится еще более запутанным.

Смежные вопросы