Без использования 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?
сможет просто сравнивать конечные точки, так как для строк используется <=>
. Не так; он применяется только тогда, когда значения являются числовыми или одиночными символьными строками (иначе это super
с до 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
Если какой-либо из ответов были в использовании, рассмотреть вопрос о выборе тот, который наиболее полезным для вас. –