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]]
pairs.
.inject(0)
means sum
开始为0
,然后我们将每个数组的第一项(数字)添加到该总和中,直到迭代所有数组并将所有数字相加。
然后我们就做[y, x]
where x
是哈希键(日期),并且y
是所有数字的总和。
此方法非常有效,因为我们使用注入来避免映射数组两次,并且之后不必反转值,因为我们在映射数组时交换了它们的位置。
编辑:有趣的是,@bjhaid 和我的答案之间的基准很接近:
user system total real
5.117000 0.000000 5.117000 ( 5.110292)
5.632000 0.000000 5.632000 ( 5.644323)
1000000
迭代 - 我的方法是最慢的