我有一個模型Foo
實例的數組。 Foo
是基於歐姆的數據存儲。 Foo
的每個實例具有an_id
和整數屬性,如follows
,likes
。如果Foo
有兩個相同的an_id
,我希望將follows
和likes
屬性加在一起。我的解決方案是創建一個散列,其中每個鍵都是數組的an_id
,並保持該狀態。如果數組足夠大,這不是有效的,因爲我需要將每個對象都放回到數組中。我很樂意按Foo#an_id
對數組進行分組,並將計數器屬性合併/添加到一起並將其彈回到數組中。目前支持這樣的東西嗎?高效的方法來組合這個紅寶石對象數組
0
A
回答
1
作爲開始,是這樣的:
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 => {:如下=> 2,:喜歡=> 4} ,2 => ...
此外,看一看:
(5..10).inject {|sum, n| sum + n } # 45
0
您可以使用inject
得到值的總和:
array = *array of Foo*
total = array.inject { |sum, x| sum + x.likes }
相關問題
- 1. 紅寶石中的對象數組
- 2. 紅寶石:添加對象數組
- 3. 紅寶石對象數組...或哈希
- 4. 紅寶石字符串數組方法
- 5. 紅寶石數組
- 6. 紅寶石數組 - 最高整數
- 7. 紅寶石散列組合
- 8. 紅寶石,從組合
- 9. 結合數組對的高效方法?
- 10. 合併兩個紅寶石對象
- 11. 紅寶石:結合數組值
- 12. 紅寶石:合併數組或哈希
- 13. 紅寶石合併數組有條件
- 14. 是否有更有效的方法來組合這些對象?
- 15. 紅寶石,一次添加多個對象到一個數組
- 16. 紅寶石二維數組:找到一個對象的座標
- 17. 紅寶石DataMapper的組與最高
- 18. 紅寶石數組對象減對象值
- 19. 紅寶石,數組,對象 - 選擇對象
- 20. 紅寶石數組排序
- 21. 紅寶石:訪問數組
- 22. 遍歷數組紅寶石
- 23. 紅寶石多維數組
- 24. 紅寶石數組哈希
- 25. 紅寶石:數組操作
- 26. 拆分數組。紅寶石
- 27. 紅寶石數組值串
- 28. 紅寶石 - 從JSON數組
- 29. 紅寶石 - 訂購數組
- 30. 紅寶石數組輸入
我認爲問題與解決方案上面是我需要這回一個數組,所以我可以進行排序操作。理想情況下,我想按照/喜歡等進行排序。使用上面構建的數據結構有沒有一種簡單的方法? – randombits 2013-02-25 04:32:25
sums_by_id.to_a.sort_by {| obj |塊}→數組 – 2013-02-25 04:45:22
您可能想要考慮在數據庫中執行此操作。 Model.where(:some_id_attr => an_id).all.order('DESC'後面),或使用活動記錄:group和:sum – 2013-02-25 04:58:40