如果您有一组具有两个属性的对象,a和b,例如
$ irb
2.1.3 :001 > D = Struct.new(:a, :b)
=> D
2.1.3 :002 > data = [] << D.new('e', 'f') << D.new('g', 'h') << D.new('e', 'i') << D.new('j', 'h')
=> [#<struct D a="e", b="f">, #<struct D a="g", b="h">, #<struct D a="e", b="i">, #<struct D a="j", b="h">]
并希望从中产生哈希,其中属性a是键,属性b是值的集合,例如
{"e"=>["f", "i"], "g"=>["h"], "j"=>["h"]}
在Ruby中执行此操作的简单方法是什么?
(我已经分享了使用each_with_object
的答案,但也许有更简单或更清晰的方法。)
答案 0 :(得分:1)
这可以通过each_with_object完成:
2.1.3 :003 > data.each_with_object({}) {|p, h| (h[p.a] ||= []) << p.b}
=> {"e"=>["f", "i"], "g"=>["h"], "j"=>["h"]}
答案 1 :(得分:0)
另一种方法是
1.9.3-p327 :023 > hash = data.inject(Hash.new {|h, k| h[k] = []}) {|h, i| h[i.a] << i.b; h}
=> {"e"=>["f", "i"], "g"=>["h"], "j"=>["h"]}