2012-03-19 59 views
4

給定兩個值爲數組的散列,合併它們的最好方法是什麼,以便當兩者共享一些密鑰時,結果值將是原始兩個散列值的串聯?例如,給定兩個散列h1h2通過連接數組合並兩個散列

h1 = Hash.new{[]}.merge(a: [1], b: [2, 3]) 
h2 = Hash.new{[]}.merge(b: [4], c: [5]) 

我期望方法convolute會給:

h1.convolute(h2) #=> {:a => [1], b: [2, 3, 4], c: [5]} 

回答

12

這就是如果你給它一個塊:

h1.merge(h2) do |key, v1, v2| 
    v1 + v2 
end 

http://rubydoc.info/stdlib/core/1.9.2/Hash:merge

+2

+1。也許'''而不是'+'更好,而不是創建一個新的數組。 – steenslag 2012-03-19 10:05:29

+0

@steenslag但是v1和v2都是數組。 – sawa 2012-03-19 17:26:20

+0

@sawa是的,但v1 + v2創建一個新的(第三個)數組。 「總數保持在兩位。同樣的事情與串btw。 – steenslag 2012-03-19 17:38:31

2

如果你不關心修改h2則:

h1.each_with_object(h2) { |(k, v), h| h[k] += v } 

如果你想單獨離開h2

h1.each_with_object(h2.dup) { |(k, v), h| h[k] += v } 

如果你想要那個特定的順序:什麼Hash#merge確實

h2.each_with_object(h1.dup) { |(k, v), h| h[k] += v } 
+0

第三個是一個。謝謝。 – sawa 2012-03-19 05:14:33