Объединение двух хэшей путем объединения массивов - PullRequest
4 голосов
/ 19 марта 2012

Учитывая два хеша, значения которых являются массивами, каков наилучший способ объединить их так, чтобы, когда эти два ключа совместно использовали какой-либо ключ, полученное значение было бы объединением значений исходных двух хешей?Например, учитывая два хеша h1 и h2:

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

Ответы [ 2 ]

12 голосов
/ 19 марта 2012

Это именно то, что Hash#merge делает, если вы даете ему блок:

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

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

2 голосов
/ 19 марта 2012

Если вас не волнует изменение 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 }

И если вы хотите этот конкретный заказ:

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