当存在空条目时,如何在数组中添加值?

Tim*_* T. 0 ruby arrays statistics ruby-on-rails time-series

我想创建一个真正的时间序列数组.目前,我使用统计信息宝石来为每个'日'提取值:

define_statistic :sent_count, :count
=> :all, :group => 'DATE(date_sent)',    
:filter_on => {:email_id => 'email_id
> = ?'}, :order => 'DATE(date_sent) ASC'
Run Code Online (Sandbox Code Playgroud)

这样做是为了创建一个数组,其中有一个日期值,例如

[["12-20-2010",1], ["12-24-2010",3]]
Run Code Online (Sandbox Code Playgroud)

但是我需要它来填充空值,所以它看起来更像:

[["12-20-2010",1], ["12-21-2010",0], ["12-22-2010",0], ["12-23-2010",0], ["12-24-2010",3]]
Run Code Online (Sandbox Code Playgroud)

请注意第二个示例如何在第一个数组中缺少的日期中具有"0"值.

Way*_*rad 5

#!/usr/bin/ruby1.8

require 'date'
require 'pp'

def add_missing_dates(series)
  series.map do |date, value|
    [Date.strptime(date, '%m-%d-%Y'), value]
  end.inject([]) do |series, date_and_value|
    filler = if series.empty?
               []
             else
               ((series.last[0]+ 1)..(date_and_value[0] - 1)).map do |date|
                 [date, 0]
               end
             end
    series + filler + [date_and_value]
  end.map do |date, value|
    [date.to_s, value]
  end
end

a = [["12-20-2010",1], ["12-24-2010",3]]
pp add_missing_dates(a)
# => [["2010-12-20", 1],
# =>  ["2010-12-21", 0],
# =>  ["2010-12-22", 0],
# =>  ["2010-12-23", 0],
# =>  ["2010-12-24", 3]]
Run Code Online (Sandbox Code Playgroud)

我建议不要使用猴子修补基类来包含这种方法:这不是全部目的; 即使它是,它只是不需要在那里.我会把它放在一个模块中,你可以将它混合到任何需要它的代码中:

module AddMissingDates
  def add_missing_dates(series)
    ...
  end
end

class MyClass
  include AddMissingDates
  ...
end
Run Code Online (Sandbox Code Playgroud)

但是,如果你真的想:

def Array.add_missing_dates(series)
  ...
end
Run Code Online (Sandbox Code Playgroud)