您还可以使用Hash#update(也称为merge!
)的形式执行此操作,该表格使用块来解析包含在两个正在合并的散列中的键的值。
代码
def aggregate(arr)
arr.each_with_object({}) do |g,h|
f = { g["book_id"]=>{ "id"=>[g["id"]], "book_id"=>g["book_id"] } }
h.update(f) do |_,ov,nv|
ov["id"] << nv["id"].first
ov
end
end.values
end
例
arr = [{"id"=>8, "book_id"=>14238}, {"id"=>5, "book_id"=>14238},
{"id"=>7, "book_id"=>10743}, {"id"=>9, "book_id"=>10743},
{"id"=>6, "book_id"=>10511}]
aggregate(arr)
#=> [{"id"=>[8, 5], "book_id"=>14238},
# {"id"=>[7, 9], "book_id"=>10743},
# {"id"=>[6], "book_id"=>10511}]
替代输出
根据您的要求,您可以考虑建立一个单一的哈希,而不是散列的另一个数组:
def aggregate(arr)
arr.each_with_object({}) { |g,h|
h.update({ g["book_id"]=>[g["id"]] }) { |_,ov,nv| ov+nv } }
end
aggregate(arr)
#=> {14238=>[8, 5], 10743=>[7, 9], 10511=>[6]}
我复制我的解决方案,从IRB,在这里贴,我看到我的回答是完全按照你的+1 – Santhosh 2014-12-04 05:57:03
我的答案是非常接近你一样'锡Man'我已删除BCZ很不满意预期产出。 1+ – 2014-12-04 06:00:11
@Santosh:伟大的思想家一样思考! – 2014-12-04 06:04:35