使用Ruby在日期范围之间选择数组
我有一个数组数组,我想选择日期落在一定范围内的数组。
ar = [[72162, "2014-01-21"], [53172, "2014-01-22"], [49374, "2014-01-23"], [41778, "2014-01-24"], [34182, "2014-01-25"], [58869, "2014-01-26"], [72162, "2014-01-27"], [43677, "2014-01-28"], [37980, "2014-01-29"], [87354, "2014-01-30"], [43677, "2014-01-31"]]
例如,我想在2014-01-24
和2014-01-29
之间获得所有arrays。
不使用Date
:
ar.select { |_,d| d >= "2014-01-24" && d <= "2014-01-29" } => [[41778, "2014-01-24"], [34182, "2014-01-25"], [58869, "2014-01-26"], [72162, "2014-01-27"], [43677, "2014-01-28"], [37980, "2014-01-29"]]
要么
ar.select { |_,d| ("2014-01-24".."2014-01-29").cover?(d) }
请注意,这取决于以年 – 月 – 日订单表示的日期。
编辑:我以前用的是我认为的Range #include? ,但@ toro2k指出实际上是Enumerable #include ? ,这很慢。 我原以为Range#include?
能够只比较端点,因为<=>
是为字符串定义的。 不是这样; 它仅适用于值为数字或单个字符串的情况(否则它Enumerable#include?
)。 那让我很困惑。 对于任何有兴趣的人,我想我现在明白限制申请的原因。
我们希望('aa'..'zz').include?('mno')
的行为与…相同
('aa'..'zz').to_a.include?('mno') => false
假设我们这样做:
class String alias :spaceship :<=> def <=>(other) spaceship(other.size > 1 ? other[0,2] : other) end end
然后
"mno" >= 'aa' # => true "mno" <= 'zz' # => true
所以如果Range#include?
只考虑了端点,
('aa'..'zz').include?("mno") # => true
require 'date' range = Date.parse("2014-01-24")..Date.parse("2014-01-29") ar.select { |x| range.include?(Date.parse(x[1])) } => [[41778, "2014-01-24"], [34182, "2014-01-25"], [58869, "2014-01-26"], [72162, "2014-01-27"], [43677, "2014-01-28"], [37980, "2014-01-29"]]
我会Comparable#between?
使用Comparable#between?
ar = [ [72162, "2014-01-21"], [53172, "2014-01-22"], [49374, "2014-01-23"], [41778, "2014-01-24"], [34182, "2014-01-25"], [58869, "2014-01-26"], [72162, "2014-01-27"], [43677, "2014-01-28"], [37980, "2014-01-29"], [87354, "2014-01-30"], [43677, "2014-01-31"] ] ar.select { |_,e| e.between?("2014-01-24","2014-01-29") } # => [[41778, "2014-01-24"], # [34182, "2014-01-25"], # [58869, "2014-01-26"], # [72162, "2014-01-27"], # [43677, "2014-01-28"], # [37980, "2014-01-29"]]