有效的方法来分组这个ruby对象数组

时间:2013-02-25 04:06:14

标签: ruby-on-rails ruby enumerable

我有一组模型Foo的实例。 Foo是一个基于欧姆的数据存储。 Foo的每个实例都有an_id和整数属性,例如followslikes。如果有两个Foo实例具有相同的an_id,我很乐意将followslikes属性添加到一起。我的解决方案是创建一个散列,其中每个键都是数组的an_id,并保持状态。如果数组足够大,这是无效的,因为我需要将每个对象重新放回到数组中。我希望通过Foo#an_id对数组进行分组,并将计数器属性合并/添加到一起,然后将其弹回到数组中。目前是否支持此类内容?

2 个答案:

答案 0 :(得分:1)

group_bysum

首先,这样的事情:

grouped_hash = your_array.group_by(&:an_id)
sums_by_id = {}
grouped_hash.each do |id,values|
  sums_by_id[id] = {}
  # you could also just iterate over values once and += :follows and :likes
  sums_by_id[id][:follows] = values.sum(&:follows)
  sums_by_id[id][:likes]   = values.sum(&:likes)
end

示例输出:     sums_by_id => {1 => {:follow => 2,:likes => 4},2 => ...

另外,请看一下:

inject

(5..10).inject {|sum, n| sum + n }  # 45

答案 1 :(得分:0)

您可以使用inject获取值的总和:

array = *array of Foo*
total = array.inject { |sum, x| sum + x.likes }