2014-09-19 179 views

回答

2

這是因爲Hash#merge調用該塊ly爲重複密鑰。


a = { :a => 'a', :b => 'b', :d => 'd' } 
b = { :a => '1', :b => 'b', :c => 'c' } 

Hash[(a.keys|b.keys).map { |key| 
    [key, [a.fetch(key, nil), b.fetch(key, nil)]] 
}] 
# => {:a=>["a", "1"], :b=>["b", "b"], :d=>["d", nil], :c=>[nil, "c"]} 

# In Ruby 2.1+ 
(a.keys|b.keys).map { |key| 
    [key, [a.fetch(key, nil), b.fetch(key, nil)]] 
}.to_h 
+0

太棒了!感謝您的快速回答! – thecooltodd 2014-09-19 17:34:21

2
(a.keys | b.keys).each_with_object({}) { |k,h| h[k] = [a[k], b[k]] } 
    #=> {:a=>["a", "1"], :b=>["b", "b"], :d=>["d", nil], :c=>[nil, "c"]} 

這是很容易泛指散列任意數量。

arr = [{ :a => 'a', :b => 'b',   :d => 'd' }, 
     { :a => '1', :b => 'b', :c => 'c'   }, 
     {   :b => '0', :c => 'b', :d => 'c' }] 

arr.reduce([]) { |ar,h| ar | h.keys } 
    .each_with_object({}) { |k,h| h[k] = arr.map { |g| g[k] } } 
    #=> {:a=>["a", "1", nil], :b=>["b", "b", "0"], 
    # :d=>["d", nil, "c"], :c=>[nil, "c", "b"]} 
+0

'#each_with_object'是個不錯的方法。我喜歡它.. +1 – 2014-09-19 18:15:02