如何将哈希数组排序为具有多个键值的哈希值?

MBJ*_*BJH 2 ruby arrays hash

我正在使用rails4处理Ruby on Rails项目.

场景:

我有一系列哈希.数组包含键相同的哈希值.

 a = [{132=>[1000.0]}, {132=>[4000.0]}, {175=>[1000.0]}, {175=>[1000.0]}, {133=>[1200.0]}]
 h = a.each {|key,value| key.each {|k| value}}
#{132=>[1000.0]}
#{132=>[4000.0]}
#{175=>[1000.0]}
#{175=>[1000.0]}
#{133=>[1200.0]}
Run Code Online (Sandbox Code Playgroud)

问题:

如何摆脱重复键,但将值添加到唯一键,如下所示:

 {132=>[1000,4000]}
 {175=>[1000,1000]}
 {133=>[1200]}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Bro*_*tse 7

那会这样做:

a.inject({}) {|sum, hash| sum.merge(hash) {|_, old, new| old + new }}
Run Code Online (Sandbox Code Playgroud)


zis*_*she 6

这对我有用:

p a.each_with_object(Hash.new([])) { |e, h| e.each { |k, v| h[k] += v } }

# => {132=>[1000.0, 4000.0], 175=>[1000.0, 1000.0], 133=>[1200.0]}
Run Code Online (Sandbox Code Playgroud)

  • 我没有表达自己,但我的意思是我喜欢'Hash.new([])`和`h [k] + = v`比我认为的主要选择更好:`Hash.new {| H,K | h [k] = []}`和`h [k] << v.first`.然而,在反射时,前者可能效率较低,因为在添加每个元素时会创建一个新数组.嗯.你介意做一个编辑,所以我可以回滚我的+1?实际上,`(h [k] || = [])<< ...`可能会快得多.(Nix编辑请求.:-)). (2认同)