紅寶石聚集可以說我有這樣的事情:使用對象
class FruitCount
attr_accessor :name, :count
def initialize(name, count)
@name = name
@count = count
end
end
obj1 = FruitCount.new('Apple', 32)
obj2 = FruitCount.new('Orange', 5)
obj3 = FruitCount.new('Orange', 3)
obj4 = FruitCount.new('Kiwi', 15)
obj5 = FruitCount.new('Kiwi', 1)
fruit_counts = [obj1, obj2, obj3, obj4, obj5]
現在我需要的,是一個功能build_fruit_summary
這是由於給定fruit_counts
陣列,它返回以下總結:
fruits_summary = {
fruits: [
{
name: 'Apple',
count: 32
},
{
name: 'Orange',
count: 8
},
{
name: 'Kiwi',
count: 16
}
],
total: {
name: 'AllFruits',
count: 56
}
}
我只是無法弄清楚聚合的最佳方式。
編輯:
在我的例子中,我有一個以上的計數。
class FruitCount
attr_accessor :name, :count1, :count2
def initialize(name, count1, count2)
@name = name
@count1 = count1
@count2 = count2
end
end
但你添加的每個FruitCount到列表中,我希望聚合也由水果名稱。看看示例中的結果。我已經設法通過單次注入來完成,在每次迭代中查看我想要添加到其計數的水果,但我仍然想要一個更簡單的方法。 –
很棒的回答。一些小的改進: 1)'fruit_counts'不需要'each_with_object',因爲'@ fruits'已經是一個數組/可枚舉:'map {| fruit | {name:fruit.name,...}}。 2)你可以避免循環的兩次運行,並簡化'total':'count:reduce(0){| total,fruit | total + fruit.count}'。 – coreyward
請注意,在示例中,我將爲每個水果設置多個FruitCount,例如'Orange'...我也想通過水果名稱進行聚合,請查看示例。我相信這裏最難的事情是用更少的運行來解決它。順便說一句,我真的很喜歡這個答案是如何解釋的 –