Ruby 按日期分组和求和哈希数组
我有这样一个哈希数组:Ruby 按日期分组和求和哈希数组,ruby,arrays,hash,Ruby,Arrays,Hash,我有这样一个哈希数组: [{:created=>Fri, 22 Jan 2014 13:02:13 UTC +00:00, :amount=>20}, {:created=>Fri, 27 Jan 2014 13:14:57 UTC +00:00, :amount=>15}, {:created=>Fri, 27 Jan 2014 14:42:40 UTC +00:00, :amount=>10}, {:created=>Fri, 28 Jan 2
[{:created=>Fri, 22 Jan 2014 13:02:13 UTC +00:00, :amount=>20},
{:created=>Fri, 27 Jan 2014 13:14:57 UTC +00:00, :amount=>15},
{:created=>Fri, 27 Jan 2014 14:42:40 UTC +00:00, :amount=>10},
{:created=>Fri, 28 Jan 2014 15:26:58 UTC +00:00, :amount=>10},
{:created=>Fri, 28 Jan 2014 15:30:18 UTC +00:00, :amount=>20},
{:created=>Fri, 31 Jan 2014 15:32:46 UTC +00:00, :amount=>50},
{:created=>Fri, 31 Jan 2014 15:33:29 UTC +00:00, :amount=>40}]
我想按日期对这些散列进行分组,并求和金额。因此,在我的示例中,输出将是:
[{:created=>"2014-01-22", :amount=>20},
{:created=>"2014-01-27", :amount=>25},
{:created=>"2014-01-28", :amount=>30},
{:created=>"2014-01-31", :amount=>90}]
我会这样做:
require 'date'
a = [{:created=> 'Fri, 22 Jan 2014 13:02:13 UTC +00:00', :amount=>20},
{:created=>'Fri, 27 Jan 2014 13:14:57 UTC +00:00', :amount=>15},
{:created=>'Fri, 27 Jan 2014 14:42:40 UTC +00:00', :amount=>10},
{:created=>'Fri, 28 Jan 2014 15:26:58 UTC +00:00', :amount=>10},
{:created=>'Fri, 28 Jan 2014 15:30:18 UTC +00:00', :amount=>20},
{:created=>'Fri, 31 Jan 2014 15:32:46 UTC +00:00', :amount=>50},
{:created=>'Fri, 31 Jan 2014 15:33:29 UTC +00:00', :amount=>40}]
hsh = a.group_by { |h| Date.parse h[:created] }.map do |k,v|
{:created => k.to_s,:amount => v.map {|h1| h1[:amount]}.inject(:+)}
end
hsh
# => [{:created=>"2014-01-22", :amount=>20},
# {:created=>"2014-01-27", :amount=>25},
# {:created=>"2014-01-28", :amount=>30},
# {:created=>"2014-01-31", :amount=>90}]
我认为Arup将字符串解析为日期是明智的,但是
…group_by{h | h[:created]。first(16)}…
也可以工作(或者您可以使用正则表达式)。使用Date.parse
的一个优点是,如果发现日期字符串不合法,将引发异常。除了OP的日期值不是字符串之外;它们是Date
对象(否则会被引用)。@Matt没什么大不了的。。。在这种情况下,我将使用h[:created].to_s
而不是Date.parse h[:created]
。。我将编写:created=>k..
,而不是:created=>k..
。但我写的,就是这个想法。