Создайте инвертированный массив дат - PullRequest
1 голос
/ 10 июля 2020

Я дал список таких дат:

['2020-02-01', '2020-02-05', '2020-02-08']

Я хочу, чтобы этот диапазон был обратным (недостающие даты в этом диапазоне):

['2020-02-02', '2020-02-03', '2020-02-04', '2020-02-06', '2020-02-07']

Я конечно, я могу построить своего рода l oop, который начинается с первой даты, а затем проходит итерацию, чтобы построить этот второй массив. Есть ли шанс, что есть способ / трюк ruby, чтобы сделать это быстрее?

Ответы [ 3 ]

2 голосов
/ 11 июля 2020

Вы можете использовать Array # разница или Array # - в диапазоне объектов Date. Например, с Ruby 2.7.1:

require "date"

dates = ['2020-02-01', '2020-02-05', '2020-02-08']

# convert sorted strings to date objects
dates.sort.map! { Date.strptime _1, "%Y-%m-%d" }

# use first and last date to build an array of dates
date_range = (dates.first .. dates.last).to_a

# remove your known dates from the range - dates).map &:to_s
(date_range - dates).map &:to_s
#=> ["2020-02-02", "2020-02-03", "2020-02-04", "2020-02-06", "2020-02-07"]

Для компактности и при условии, что ваши строки даты в датах уже отсортированы, вы также можете использовать крушение поезда следующим образом:

((dates[0]..dates[-1]).to_a - dates).map &:to_s
1 голос
/ 11 июля 2020

Вы можете использовать Array # min, Array # max и Array # - чтобы легко решить эту проблему:

dates = ['2020-02-01', '2020-02-05', '2020-02-08']
missing_dates = ((dates.min..dates.max).to_a) - dates
=> [‘2020-02-02’, ‘2020-02-03’, ‘2020-02-04’, ‘2020-02-06’, ‘2020-02-07’]
1 голос
/ 10 июля 2020
require 'date'

arr = ['2020-02-26', '2020-03-02', '2020-03-04']

first, last = arr.map { |s| Date.strptime(s, '%Y-%m-%d') }.minmax
  #=> [#<Date: 2020-02-26 ((2458906j,0s,0n),+0s,2299161j)>,
  #    #<Date: 2020-03-04 ((2458913j,0s,0n),+0s,2299161j)>] 
(first..last).map { |d| d.strftime('%Y-%m-%d') } - arr 
  #=> ["2020-02-27", "2020-02-28", "2020-02-29", "2020-03-01",
  #    "2020-03-03"]

См. Date :: strptime и Date # strftime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...