如何收集对象的属性/属性作为值数组的键的哈希?

时间:2014-10-14 13:57:36

标签: ruby

如果您有一组具有两个属性的对象,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的答案,但也许有更简单或更清晰的方法。)

2 个答案:

答案 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"]}