2013-07-02 161 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

不會更有意義有' 「C」=> [2]'中的散列? –

+0

也可以, – 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 = {}'改爲res = Hash.new []' – naomik

+0

謝謝@naomik,您可以擺脫'res [k] || = []'行,但是我會像這樣。當你用默認值使用Hash時,會出現一些奇怪的事情 –