Более краткий способ сделать группировку в Ruby - PullRequest
0 голосов
/ 22 января 2011

Хорошо, у меня есть массив из 4 объектов, таких как

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

с 4 различными объектами (Графика, Коллекция, Категория, Объем) Теперь мне нужно разделить их на 4 массива на основе объектов. Итак, я создал этот метод, и он работает, но он настолько хакерский ... любые идеи о том, как добиться того же самого в более краткой форме ... подробнее 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 ]

6 голосов
/ 22 января 2011
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 }
2 голосов
/ 22 января 2011
ret = {}
matches.group_by(&:class).each do |klass, item|
  ret[klass.to_s] = item
end
ret.values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...