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

Posted

技术标签:

【中文标题】在 Ruby 中进行分组的更简洁的方法【英文标题】:More concise way of doing the grouping in Ruby 【发布时间】:2011-06-13 18:47:06 【问题描述】:

好的,我有一个由 4 个对象组成的数组,例如

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

有 4 个不同的对象(图形、集合、类别、体积)我现在需要根据对象将它们分成 4 个数组。所以我创建了这个方法,它可以工作,但它太老套了......关于如何以更简洁的方式实现同​​样事情的任何想法......更多 ruby​​esk

这是我的方法

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  

【问题讨论】:

请注意,“case group.first”和“when Graphic”应该足够了,case 更广泛 ===,而不是 == 【参考方案1】:
matches_by = matches.group_by |m| m.class.to_s 
%wGraphic Category SubCategory Collection.map do |class_name|
  matches_by[class_name] || [] 
end

如果你不在乎它们的顺序,试试这个

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

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

matches.group_by |m| m.class.to_s 

【讨论】:

我有点认为更“红宝石”的方式是不硬编码这些类,除非他真的需要它们。【参考方案2】:
ret = 
matches.group_by(&:class).each do |klass, item|
  ret[klass.to_s] = item
end
ret.values

【讨论】:

我认为 .each ... 部分是不必要的 散列或数组(来自 group_by),以类名为键。只需要在最后调用值。我会更新的。 我必须使用 .each 如果我没有收到此错误 rb:42: both block arg and actual block given 这将教会我在不仔细检查的情况下听随机的路过。固定。

以上是关于在 Ruby 中进行分组的更简洁的方法的主要内容,如果未能解决你的问题,请参考以下文章

对数组中的项目进行分组和计数的简洁方法

更新数组中对象的更简洁方法

仅在 C 中执行一次代码的更简洁的方法?

在 React 中将状态变量和方法传递给子组件的更简洁的方法?

使用千位分隔符格式化 COUNT 结果的更简洁方法?

编写代码片段的更简洁的方法