Rubyで時間の選択肢に使える配列を生成する
0時から23時まで15分刻みの選択肢を用意したい、なんてときにRubyだとこんな感じに書ける。
フォームの項目に時間帯の選択肢を持ちたい、みたいなときにこんな感じのが必要になると思う。
もっと短く書けるよ!というのがあったら教えてください。
(0..23).map { |h| [0, 15, 30, 45].map { |m| "#{h.to_s.rjust(2, '0')}:#{m.to_s.rjust(2, '0')}" } }
上記でやっているのは0から23、0から45の2回ループをして、その中で文字列を組み立てる、という流れ。
mapでループしているので、返り値は配列になる。
rjust
は第一引数に指定した桁数に満たない文字列の場合、第二引数の文字列で足りない長さを補うというもの。
よくいうゼロパディングということをしている。
rjustは文字列に生えているメソッドなので、ループから受け取る数値型のデータをto_s
で文字列に変換した上でrjustを実行している。
これでやってみると、0時から23時までの時間ごとに二次元の配列で15分刻みの配列ができる。
irb(main):002:0> (0..23).map { |h| [0, 15, 30, 45].map { |m| "#{h.to_s.rjust(2, '0')}:#{m.to_s.rjust(2, '0')}" } }
=>
[["00:00", "00:15", "00:30", "00:45"],
["01:00", "01:15", "01:30", "01:45"],
["02:00", "02:15", "02:30", "02:45"],
["03:00", "03:15", "03:30", "03:45"],
# 途中省略
["22:00", "22:15", "22:30", "22:45"],
["23:00", "23:15", "23:30", "23:45"]]
あとは末尾にflatten
を付けてあげれば、二次元配列からフラットな配列ができる!
irb(main):003:0> (0..23).map { |h| [0, 15, 30, 45].map { |m| "#{h.to_s.rjust(2, '0')}:#{m.to_s.rjust(2, '0')}" } }.flatten
=>
["00:00",
"00:15",
"00:30",
"00:45",
# 途中省略
"23:15",
"23:30",
"23:45"]
余談だけど、flattenはそのままだと再起的にフラットを解消してくれる。
3次元、4次元の配列も全てバラして1次元の配列になっちゃう。
引数に数字を与えると、その解消具合を調整できる。flatten(1)
とすると、最初のネストのみを解消してくれるので場合によって使い分けていきたい。
この記事の環境情報
- Ruby 3.1.2
- 細かい仕事がたくさんある
Rubyに関する他の記事を読む
- slimでtype='application/ld+json'のscriptタグを書く
- Slack APIによる自動メッセージでユーザーグループにメンションする方法
- RubyでUnixtimeからTimeオブジェクトを生成する
- gemインストール時にUndefined symbols for architecture arm64と出たときの対応
- RubyでUTCの時刻情報をJST基準に変換する
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら