通过基于该项目的属性分组的对象的阵列构建哈希 [英] Building Hash by grouping array of objects based on a property of the items

查看:105
本文介绍了通过基于该项目的属性分组的对象的阵列构建哈希的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道,如果在Ruby 1.9的做到这一点更规范的方法

我有一大堆对象的数组,我使用阵列中的每个对象的属性要它们分成一个Hash。

非常简单的例子:

 > SH = {}
 = GT; {}
> AERS =%W(A B C D AB BC德ABC)
 = GT; [A,B,C,D,AB,BC,德,ABC]
> aers.each做| AER |
> SH [aer.size] = []如果SH [aer.size] .nil?
> SH [aer.size<< AER
>结束
= GT; [A,B,C,D,AB,BC,德,ABC]
> SH
 = GT; {1 =>A,B,C,D],2 =>AB,BC,德],3 =>ABC] }

我想这一点,但它的输出是错误的(因为你可以看到):

  SH = Hash.new([])
 = GT; {}
> aers.each做| AER |
> SH [aer.size<< AER
>结束
 = GT; [A,B,C,D,AB,BC,德,ABC]
> SH
 = GT; {}


解决方案

红宝石一直期待您的需要,并已经得到了你覆盖着<一个href=\"http://ruby-doc.org/core/classes/Enumerable.html#M001497\"><$c$c>Enumerable#group_by:

  IRB(主):001:0&GT; AERS =%W(A B C D AB BC德ABC)
#=&GT; [A,B,C,D,AB,BC,德,ABC]IRB(主):002:0&GT; aers.group_by {| S | s.size}
#=&GT; {1 =&GT;A,B,C,D],2 =&GT;AB,BC,德],3 =&GT;ABC] }

在Ruby 1.9的,你可以使这个甚至更短:

  IRB(主):003:0&GT; aers.group_by(安培;:大小)
#=&GT; {1 =&GT;A,B,C,D],2 =&GT;AB,BC,德],3 =&GT;ABC] }

I'm wondering if there is a more canonical way to do this in ruby 1.9

I have an array with a bunch of objects and I want to group them into a Hash using a property of each object in the array.

Very simplified example:

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

I tried this, but its output is wrong (as you can see):

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

解决方案

Ruby has anticipated your need, and has got you covered with 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"]}

In Ruby 1.9, you can make this even shorter with:

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

这篇关于通过基于该项目的属性分组的对象的阵列构建哈希的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆