2013-07-02 9 views
0

У меня есть следующий массив:Преобразовать рубин массив хэшей в один хэш

array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 

Я хочу, чтобы преобразовать его в 1 большой хэш, но сохранить все значения, поэтому я хочу, чтобы это выглядеть следующим образом:

{"a" => [2, nil], "b" => [3, nil], "c" => [2]} 

Я могу подобраться делать array.inject({}) {|s, h| s.merge(h)}}, но перезаписывает значения.

любые идеи оцениваются!

+1

бы не больше смысла иметь ' "с"=> [2]' в хэш? –

+0

yea, который также работает – BC00

ответ

2
array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 
a = array.each_with_object(Hash.new([])) do |h1,h| 
    h1.each{|k,v| h[k] = h[k] + [v]} 
end 
a # => {"a"=>[2, nil], "b"=>[3, nil], "c"=>[2]} 
0
array = [{"a" => 2}, {"b" => 3}, {"a" => nil}, {"c" => 2}, {"b" => nil}] 
res = {} 

array.each do |hash| 
    hash.each do |k, v| 
    res[k] ||= [] 
    res[k] << v 
    end 
end 
+0

Вы можете избавиться от строки 'res [k] || = []', если вы меняете 'res = {}' на 'res = Hash.new []' – naomik

+0

спасибо @naomik, но я нравится так. Есть странные вещи, когда вы используете Hash со значениями по умолчанию –

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