通过基于项的属性对对象数组进行分组来构建哈希

use*_*146 18 ruby arrays hash

我想知道在ruby 1.9中是否有更规范的方法可以做到这一点

我有一个包含大量对象的数组,我想使用数组中每个对象的属性将它们分组为Hash.

简单的例子:

> sh = {}
 => {} 
> aers = %w(a b c d ab bc de abc)
 => ["a", "b", "c", "d", "ab", "bc", "de", "abc"] 
> aers.each do |aer|
>     sh[aer.size] = [] if sh[aer.size].nil?
>     sh[aer.size] << aer
>   end
=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"] 
> sh
 => {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]} 
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它的输出是错误的(你可以看到):

 sh = Hash.new([])
 => {} 
> aers.each do |aer|
>     sh[aer.size] << aer
>   end
 => ["a", "b", "c", "d", "ab", "bc", "de", "abc"] 
> sh
 => {} 
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 39

Ruby已经预见到了您的需求,并且让您满意Enumerable#group_by:

irb(main):001:0> aers = %w(a b c d ab bc de abc)
#=> ["a", "b", "c", "d", "ab", "bc", "de", "abc"]

irb(main):002:0> aers.group_by{ |s| s.size }
#=> {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]}
Run Code Online (Sandbox Code Playgroud)

在Ruby 1.9中,您可以通过以下方式缩短它:

irb(main):003:0> aers.group_by(&:size)
#=> {1=>["a", "b", "c", "d"], 2=>["ab", "bc", "de"], 3=>["abc"]}
Run Code Online (Sandbox Code Playgroud)

  • 这就是Ruby非常酷的原因; 它甚至在我们做之前就知道我们想要什么. (3认同)