在红宝石中合并和附加哈希值

时间:2016-09-08 13:52:10

标签: ruby hash

我有两个像这样的哈希

h1 = {:a=>[:client]}
h2 = {:a=>[:user]}

我希望将它们合并在一起但保留两个哈希的值,如:

{:a=>[:user, :client]}

我尝试了合并方法,但它删除了一个值,只保留一个。我正在使用ruby 2.2

2 个答案:

答案 0 :(得分:5)

由于您的值已经是数组,因此您可以将merge与块一起使用并调用Array#+

h1.merge(h2) { |key, oldval, newval| oldval + newval }
#=> {:a=>[:client, :user]}

答案 1 :(得分:1)

尝试inject

h1.inject(h2.dup) do |memo, (k,v)| 
  memo[k] ||= []
  memo[k] += v
  memo
end

memo在值传递给inject h2时开始。它在每次迭代时被块的返回值替换。在我们的例子中,我们更新memo并返回它,从而构建备忘录,直到最后一次迭代它作为答案返回。

如果没有memo[k] ||= []值或缺少键,则不会严格需要块nil中的第一行。

h2.dup用于避免变异h2