前端向我發送了一個字串,它在其中獲取用戶的會議安排,如下所示:
> payload
=> "Sun 10:00-20:00\nFri 05:00-10:00\nFri 16:30-23:50\nSat 10:00-24:00\nSun 01:00-04:00\nSat 02:00-06:00\nTue 03:30-18:15\nTue 19:00-20:00\nWed 04:25-15:14\nWed 15:14-22:40\nThu 00:00-23:59\nMon 05:00-13:00\nMon 15:00-21:00"
每行都是一個子字串,代表日程中的一次會議。一個字串代表一整周。我必須計算會議之間的空閑時間(以分鐘為單位)并將此資訊發送到前端。
我認為要做到這一點,我需要將字串更改為如下所示的哈希:
# first split payload
> splitted_dates = payload.split("\n").map { |date| date.split }
=> [["Sun", "10:00-20:00"], ["Fri", "05:00-10:00"], ["Fri", "16:30-23:50"], ["Sat", "10:00-24:00"], ["Sun", "01:00-04:00"], ["Sat", "02:00-06:00"], ["Tue", "03:30-18:15"], ["Tue", "19:00-20:00"], ["Wed", "04:25-15:14"], ["Wed", "15:14-22:40"], ["Thu", "00:00-23:59"], ["Mon", "05:00-13:00"], ["Mon", "15:00-21:00"]]
# then create a hash with structure { day:, time: }
> schedule_hash = splitted_dates.map { |d| { day: d[0], time: d[1] } }
=> [{:day=>"Sun", :time=>"10:00-20:00"},
{:day=>"Fri", :time=>"05:00-10:00"},
{:day=>"Fri", :time=>"16:30-23:50"},
{:day=>"Sat", :time=>"10:00-24:00"},
{:day=>"Sun", :time=>"01:00-04:00"},
{:day=>"Sat", :time=>"02:00-06:00"},
{:day=>"Tue", :time=>"03:30-18:15"},
{:day=>"Tue", :time=>"19:00-20:00"},
{:day=>"Wed", :time=>"04:25-15:14"},
{:day=>"Wed", :time=>"15:14-22:40"},
{:day=>"Thu", :time=>"00:00-23:59"},
{:day=>"Mon", :time=>"05:00-13:00"},
{:day=>"Mon", :time=>"15:00-21:00"}]
要計算空閑插槽,我首先必須schedule_hash按日期和時間排序。如果兩者都只是一個字串怎么辦?
uj5u.com熱心網友回復:
您可以按如下方式進行。
schedule_hash =[
{:day=>"Sun", :time=>"10:00-20:00"},
{:day=>"Fri", :time=>"05:00-10:00"},
{:day=>"Fri", :time=>"16:30-23:50"},
{:day=>"Sat", :time=>"10:00-24:00"},
{:day=>"Sun", :time=>"01:00-04:00"},
{:day=>"Sat", :time=>"02:00-06:00"},
{:day=>"Tue", :time=>"03:30-18:15"},
{:day=>"Tue", :time=>"19:00-20:00"},
{:day=>"Wed", :time=>"04:25-15:14"},
{:day=>"Wed", :time=>"15:14-22:40"},
{:day=>"Thu", :time=>"00:00-23:59"},
{:day=>"Mon", :time=>"05:00-13:00"},
{:day=>"Mon", :time=>"15:00-21:00"}
]
day_order = { "Sun"=>0, "Mon"=>1, "Tue"=>2, "Wed"=>3, "Thu"=>4, "Fri"=>5, "Sat"=>6 }
schedule_hash.sort_by { |h| [day_order[h[:day]], h[:time][0,5]] }
#=> [{:day=>"Sun", :time=>"01:00-04:00"},
# {:day=>"Sun", :time=>"10:00-20:00"},
# {:day=>"Mon", :time=>"05:00-13:00"},
# {:day=>"Mon", :time=>"15:00-21:00"},
# {:day=>"Tue", :time=>"03:30-18:15"},
# {:day=>"Tue", :time=>"19:00-20:00"},
# {:day=>"Wed", :time=>"04:25-15:14"},
# {:day=>"Wed", :time=>"15:14-22:40"},
# {:day=>"Thu", :time=>"00:00-23:59"},
# {:day=>"Fri", :time=>"05:00-10:00"},
# {:day=>"Fri", :time=>"16:30-23:50"},
# {:day=>"Sat", :time=>"02:00-06:00"},
# {:day=>"Sat", :time=>"10:00-24:00"}]
Enumerable#sort_by使用方法Array#<=>(“宇宙飛船運算子”)對陣列進行排序。尤其參見檔案的第三段<=>。
請注意,對 的元素schedule_hash進行排序的陣列如下所示。
schedule_hash.map { |h| [day_order[h[:day]], h[:time][0,5]] }
#=> [[0, "10:00"], [5, "05:00"], [5, "16:30"], [6, "10:00"],
# [0, "01:00"], [6, "02:00"], [2, "03:30"], [2, "19:00"],
# [3, "04:25"], [3, "15:14"], [4, "00:00"], [1, "05:00"],
# [1, "15:00"]]
uj5u.com熱心網友回復:
Ruby 類 Date 已經有一個帶有Date::ABBR_DAYNAMES. 您可以使用它(尤其是在已經包含它的 Rails 中 - 也許不要僅出于此目的添加它),但請注意“Sun”是第一位的,因此如果您的目標受眾在星期一開始他們的一周,就像大多數國家/地區一樣世界呢,你可以呼叫rotate得到的陣列。
我也可能將每個約會的開始時間和結束時間分開,以便以后更容易對它們執行計算:
require 'date'
daynames = Date::ABBR_DAYNAMES
=> ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
# Turn splitted_dates to a hash with day, start time and end time of appointment
schedule_hash = splitted_dates.map do |(day, time)|
{ day: day, start_time: time[0..4], end_time: time[-5..-1] }
end
# Sort the hash by the index of the day name within "daynames", and then by start_time
sorted = schedule_hash.sort_by { |h| [daynames.index(h[:day]), h[:start_time]] }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495304.html
標籤:红宝石
下一篇:帶有水豚的地圖元素
