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
  • 細かい仕事がたくさんある