我有一个数组的数组
[
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
如果日期相等,我想获得它们值的平均值,因此上面的数组将变成
[
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[17, "2014-07-02"],
]
数组已经按日期排序。
我该怎么做呢?我要用递归函数吗?
arr = [
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
arr.group_by(&:last).map do |k, vs|
av = vs.map(&:first).inject(:+) / vs.size.to_f
[av, k]
end
#=> [
#=> [3.0, "2014-06-28"],
#=> [3.0, "2014-06-29"],
#=> [3.0, "2014-06-30"],
#=> [17.0, "2014-07-02"]
#=> ]
如果您正在寻找更优化但不太习惯的解决方案(并且您的数据集按日期排序),您可以遵循以下命令:
arr = [
[3, "2014-06-28"],
[3, "2014-06-29"],
[3, "2014-06-30"],
[27, "2014-07-02"],
[7, "2014-07-02"]
]
res = []
tmp = [0]
cnt = 0
arr.each do |num, date|
if tmp[1] && tmp[1] != date
tmp[0] /= cnt.to_f
res << tmp
tmp = [0]
cnt = 0
end
tmp[0] += num
tmp[1] = date
cnt += 1
end
tmp[0] /= cnt.to_f
res << tmp
res
#=> [
#=> [3.0, "2014-06-28"],
#=> [3.0, "2014-06-29"],
#=> [3.0, "2014-06-30"],
#=> [17.0, "2014-07-02"]
#=> ]