如何在ruby中合并基于哈希的相同键的数组?

tar*_*djo 6 ruby arrays hash

如何在ruby中合并基于哈希的相同键的数组?

例如:

a = [{:a=>1},{:a=>10},{:b=>8},{:c=>7},{:c=>2}]
Run Code Online (Sandbox Code Playgroud)

如何获得这样的结果?

a = [{:a=>[1, 10]},{:b=>8},{:c=>[7, 2]}]
Run Code Online (Sandbox Code Playgroud)

谢谢你

Ari*_*iao 10

尝试

a.flat_map(&:entries)
  .group_by(&:first)
  .map{|k,v| Hash[k, v.map(&:last)]}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ers 5

另一种选择:

a = [{:a=>1},{:a=>10},{:b=>8},{:c=>7},{:c=>2}]

p a.each_with_object({}) { |h, o| h.each { |k,v| (o[k] ||= []) << v } }
# => {:a=>[1, 10], :b=>[8], :c=>[7, 2]}
Run Code Online (Sandbox Code Playgroud)

当哈希具有多个键/值组合时,例如:

b = [{:a=>1, :b=>5, :x=>10},{:a=>10, :y=>2},{:b=>8},{:c=>7},{:c=>2}]
p b.each_with_object({}) { |h, o| h.each { |k,v| (o[k] ||= []) << v } }
# => {:a=>[1, 10], :b=>[5, 8], :x=>[10], :y=>[2], :c=>[7, 2]}
Run Code Online (Sandbox Code Playgroud)