ar.group_by(&:last).map{ |x, y| [y.inject(0){ |sum, i| sum + i.first }, x] }
编辑以添加解释:
我们按最后一个值(日期)进行分组,得到一个哈希表:
{"2014-01-27"=>[[5, "2014-01-27"]], "2014-01-28"=>[[20, "2014-01-28"], [5, "2014-01-28"], [10, "2014-01-28"]], "2014-01-29"=>[[15, "2014-01-29"], [5, "2014-01-29"]], "2014-01-30"=>[[5, "2014-01-30"], [10, "2014-01-30"], [5, "2014-01-30"]]}
然后以
x
为哈希键,将
y
作为
[[number, date],[number,date]]
对数组的存储。使用
.inject(0)
是指将
sum
初始化为
0
,然后我们将每个数组的第一个项(数字)加到该总和中,直到所有数组都被迭代并且所有数字都被添加。 然后我们对
[y,x]
进行操作,其中
x
是哈希键(日期),
y
是所有数字的总和。由于我们在映射时交换了它们的位置,因此此方法非常有效,因为我们使用了inject来避免对数组进行两次映射,并且不必在之后反转值。编辑:有趣的是,@bjhaid和我的答案之间的基准测试非常接近:
user system total real
5.117000 0.000000 5.117000 ( 5.110292)
5.632000 0.000000 5.632000 ( 5.644323)
1000000
次迭代 - 我的方法是最慢的
[3,3,1,3,3].chunk {|e| e}.to_a # => [[3, [3, 3]], [1, [1]], [3, [3, 3]]
- Cary Swoveland