在Ruby中进行分组的更简洁方法

时间:2011-01-22 18:58:38

标签: ruby-on-rails ruby arrays ruby-on-rails-3 group-by

好的,我有一个包含4个对象的数组,如

 => [#<Graphic id: 3...">, #<Collection id: 1....">, #<Category id:...">, #<Volume id: 15...">] 
 matches.size
 => 4 

有4个不同的对象(图形,集合,类别,卷)我现在需要根据对象将它们分成4个数组。所以我创建了这个方法并且它有效,但是它如此hackish ....关于如何以更简洁的方式实现同​​样的事情的任何想法...更多rubyesk

这是我的方法

def self.get_results(matches)
  graphics =  [], collections =  [], categories =  [], sub_categories =  []
  matches.group_by(&:class).each do |key, group|
    case group.first.class.to_s     
    when "Graphic"
     graphics << group
    when "Category"                
     categories << group
    when "SubCategory"      
     sub_categories << group
    when "Collection"        
     collections << group
    end
  end
  [graphics.flatten, collections.flatten, categories.flatten, sub_categories.flatten]
end  

2 个答案:

答案 0 :(得分:6)

matches_by = matches.group_by {|m| m.class.to_s }
%w{Graphic Category SubCategory Collection}.map do |class_name|
  matches_by[class_name] || [] 
end

如果你不在乎他们的订单,试试这个

matches.group_by {|m| m.class.to_s }.values

如果你只想要一个Hash,由类名索引(其中每个条目的值是该类型的对象数组),它只是

matches.group_by {|m| m.class.to_s }

答案 1 :(得分:2)

ret = {}
matches.group_by(&:class).each do |klass, item|
  ret[klass.to_s] = item
end
ret.values