合并具有相同键的值

3

我需要一些用于绘图的数值,希望所有相同日期的数值合并到一起。

这是我现在拥有的数组:

[ ['2012-10-09', 1], ['2012-10-09', 2], ['2012-10-10', 1], ['2012-10-10', 4], ['2012-10-10', 1], ['2012-10-11', 3] ]

And the result I want:

[ ['2012-10-09', 3], ['2012-10-10', 6], ['2012-10-11', 3] ]

有没有简单的方法来做到这一点?
4个回答

4

就是这么简单:

a.inject({}) { |h,(date, count)| h[date] ||= 0; h[date] += count; h }.to_a

+1 不错。根据@dquimper的建议,使用sum函数,我发现group_by的替代方案稍微更易读一些,但是你的答案并不依赖于activesupport。 - Chris Salzberg
这是一个经典的“reduce”任务 ;) - Roman

3
使用Rails的group_by,可以这样做:
x = [ ['2012-10-09', 1], ['2012-10-09', 2], ['2012-10-10', 1], ['2012-10-10', 4], ['2012-10-10', 1], ['2012-10-11', 3] ]
x.group_by(&:first).map { |k, v| [k, v.map(&:last).inject(0,&:+)] }

1

Mapreduce是一个非常强大的工具,但有点难以理解。 所以使用sum方法是相同的事情:

x = [ ['2012-10-09', 1], ['2012-10-09', 2], ['2012-10-10', 1], ['2012-10-10', 4], ['2012-10-10', 1], ['2012-10-11', 3] ]
expected = [ ['2012-10-09', 3], ['2012-10-10', 6], ['2012-10-11', 3] ]

x.group_by(&:first).map { |k, v| [k, v.sum(&:last)] }.should == expected

0

这与Roman的答案类似,但使用了三元运算符。

a.inject({}) { |h,(date,count)| h.has_key?(date) ? h[date] += count : h[date] = count; h }.to_a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接