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
这使用了(akamerge!
)的形式,它使用一个块来确定被合并的两个散列共享的每个键的值
注意:我允许: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"]}]