Ruby 合并并合并哈希数组

Ruby 合并并合并哈希数组,ruby,arrays,hash,enumerable,Ruby,Arrays,Hash,Enumerable,我正在尝试获取此哈希值数组 items => [{:name=>"item a", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}, {:name=>"item b", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}, {:name=>"item a", :count=>1, :contributors=>

我正在尝试获取此哈希值数组

items => [{:name=>"item a", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 {:name=>"item b", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 {:name=>"item a", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 {:name=>"item b", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 {:name=>"item c", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 {:name=>"item d", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}]
并得到一个如下所示的输出

items => [{:name=>"item a", :count=>2, :contributors=>["51db6d58bd02861e96000004", "51db6d58bd02861e96000004"]},
     {:name=>"item b", :count=>2, :contributors=>["51db6d58bd02861e96000004, 51db6d58bd02861e96000004"]},
     {:name=>"item c", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
     {:name=>"item d", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}]
我想按姓名分组并合并计数和贡献者,如上所示。我该怎么做?分组,减少?有人能举个例子吗?

使用:


我最初发布了另一个解决方案,结果发现@falsetru已经发布了一个几乎相同的答案,所以它又回到了绘图板上。不完全是,实际上,因为对于这类问题有两种常见的攻击方式,所以我选择了另一种

def combine(items)
  items.each_with_object({}) do |g,h|
    h.update({ g[:name] => g }) do |k,ov,nv|
      { name: g[:name], count: (ov[:count] + nv[:count]),
        contributors: (ov[:contributors] + nv[:contributors]) }
    end
  end.values
end
这使用了(aka
merge!
)的形式,它使用一个块来确定被合并的两个散列共享的每个键的值

注意:我允许
:count
具有除
1
以外的值,并且
:contributors
具有包含多个值的值(数组)

combine(items)
 #=>[{:name=>"item a", :count=>2,
 #    :contributors=>["51db6d58bd02861e96000004", "51db6d58bd02861e96000004"]},
 #   {:name=>"item b", :count=>2,
 #    :contributors=>["51db6d58bd02861e96000004", "51db6d58bd02861e96000004"]},
 #   {:name=>"item c", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 #   {:name=>"item d", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}]

请显示到目前为止您尝试过的内容。什么是
items=>
?该部分使您的表达式无效。您的意思是
items=[…]
?您选择了@falsetru的答案(好的选择),但没有投票支持他的答案。我只是想让yoy知道你可以同时做这两件事,以防你不知道。考虑到我最初发布的是同一个解决方案(然后看到你的解决方案已经发布,删除了它),+1是一个不需要动脑筋的问题。这非常有效,因为它是第一个答案,我接受了它。谢谢你的帮助。祝贺你打了10万!谢谢Cary,这似乎也是一个很好的方法,并且得到了很好的解释。
combine(items)
 #=>[{:name=>"item a", :count=>2,
 #    :contributors=>["51db6d58bd02861e96000004", "51db6d58bd02861e96000004"]},
 #   {:name=>"item b", :count=>2,
 #    :contributors=>["51db6d58bd02861e96000004", "51db6d58bd02861e96000004"]},
 #   {:name=>"item c", :count=>1, :contributors=>["51db6d58bd02861e96000004"]},
 #   {:name=>"item d", :count=>1, :contributors=>["51db6d58bd02861e96000004"]}]