質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

2回答

351閲覧

Javascriptで、関数の検索方法がわかりません。

Pieshin

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

2クリップ

投稿2023/06/02 10:57

実現したいこと

現在、現在時刻をもとにした「バスの発車時間を表示する」プログラムを作成しており、「現在の時刻」から最も近い「バスの発車時刻」を表示するプログラムが作りたいです。

前提

DBでの時間管理は挫折したため、簡易的な方法として、Javascriptの関数varで、発車時刻を全て定義しました。そして、現在時刻も「発車時刻」と同じ形の値で定義しました。

発生している問題・エラーメッセージ

Javascriptの関数から決まった値を検索する条件式を用いて「現在時刻」から最も近い(未来の)発車時刻を出力する条件式が作りたいです。それができません。

該当のソースコード

Javascript

1 let mfNEYAGAWA = [ '06:40', '06:56', '07:16' ,'07:36', '07:57', '08:17','08:37', '08:58', '09:18','09:38', '09:58', '10:20','10:40', '11:00', '11:20','11:40', '12:00', '12:20','12:40', '13:00', '13:20', '13:40','14:00', '14:20', '14:40','15:00', '15:18', '15:38','15:58', '16:18', '16:38','17:08', '17:37', '18:08', '18:38', '19:09', '19:38','20:08', '20:39', '21:03','21:34', '22:13']; 2 let sNEYAGAWA = [ '06:53', '07:25', '07:40' ,'07:55', '08:17', '08:37','08:58', '09:18', '09:38','09:58', '10:20', '10:40','11:00', '11:20', '11:40','12:00', '12:20', '12:40','13:00', '13:20', '13:40', '14:00','14:20', '14:40', '15:00', '15:20', '15:40','16:00', '16:20', '16:40','17:00', '17:19', '17:39', '18:00', '18:20', '18:40','19:01', '19:20', '19:50','20:10', '20:36','21:04','21:35', '22:04']; 3 let mfKORIEN = [ '06:15', '06:52', '07:27' ,'07:53', '08:26', '08:50','09:10', '09:30', '09:50','10:10', '10:30', '10:52','11:12', '11:32', '11:52','12:12', '12:32', '12:52','13:12', '13:32', '13:52', '14:12','14:32', '14:52', '15:30', '15:50', '16:10','16:30', '16:50', '17:10','17:30', '17:51', '18:11', '18:31', '18:51', '19:10','19:30', '19:50', '20:10','20:40', '21:09','21:39']; 4 let sKORIEN = [ '06:46', '07:15', '07:53' ,'08:25', '08:50', '09:10','09:30', '09:50', '10:10','10:30', '10:52', '11:12','11:32', '11:52', '12:12','12:32', '12:52', '13:12','13:32', '13:52', '14:12', '14:32','14:52', '15:12', '15:32', '15:52', '16:12','16:32', '16:52', '17:12','17:32', '17:53', '18:13', '18:33', '18:53', '19:12','19:32', '19:52', '20:10','20:37', '21:09','21:39']; 5 6 //現在時刻を取得し「〇〇:〇〇」という形で変数nowtimeに代入、および日付を取得し、土曜日か平日かを区別する数字をdayOfweekに代入。 7 var nowhour = getHours(); 8 var nowminutes = getMinutes(); 9 var nowtime = nowhour+":"+nowminutes; 10 11 var dayOfWeek = date.getDay() ; 12 13 14 if (dayOfWeek = 6) { 15 var dayname = "s" 16 }else{ 17 var dayname = "mf" 18 }

試したこと

時間と分ごとに検索をかけてみようとしましたが、うまく実現できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2023/06/02 11:25

> 時間と分ごとに検索をかけてみようとしましたが、うまく実現できませんでした。 どのようなコードを書いて、どんな結果になったのでしょうか?
Pieshin

2023/06/02 12:13

この変数には時間を入れているつもりですが、Javascriptが入れている値を「時間」として扱っていないため、現在時刻から最も未来に近い発車時刻を検索、表示しようと.indexOf( ' ' );を使って検索をかけてみても、結果が複数出たり一つも出なかったりと、検索がうまくいかなかったため、どの時間でもその時間から最も近い発車時刻1つを出力する方法が知りたいです。
maisumakun

2023/06/02 12:27

> .indexOf( ' ' );を使って検索をかけてみても indexOfは「完全一致」する値しか検索できません。
guest

回答2

0

元のプログラムの何処がおかしいか書くと切りが無いので、ゼロから書くとこんな感じです。
・時、分をそれぞれ数値で取得すると頭ゼロが面倒なので、時刻文字列の先頭5文字を取る
・曜日の処理は普通はこうは書かないと思うけど、初心者に分かり易いだろうと思うのでこれで(日曜日に実行することは無いという前提のようですね)
・終バス過ぎてると、undefinedが返るけど、結果を人間が目で見るのであれば、時刻配列の最後に"99:99"とか入れておいて、99:99が表示されたら「終バス終わった」と思えば良い

肝心の、配列からの検索法は、findを使って、x => x > now_timeで、
now_timeと比較してそれより文字列比較で大きな最初の要素」が返ります。
こういう記法を知らないかも知れないので、別の記法でも書いておきます。

JavaScript

1let now = new Date(); 2let now_time = now.toTimeString().slice(0,5); 3let NEYAGAWA; 4let KORIEN; 5if(now.getDay() == 6){ 6 NEYAGAWA = sNEYAGAWA; 7 KORIEN = sKORIEN; 8}else{ 9 NEYAGAWA = mfNEYAGAWA; 10 KORIEN = mfKORIEN; 11} 12 13let next_time_neyagawa = NEYAGAWA.find(x => x > now_time); 14function first_greater(x){ return x > now_time;} 15let next_time_korien = KORIEN.find(first_greater);

再代入しない変数はconstにする方が良いですがまあ一旦はletで。

投稿2023/06/02 12:15

otn

総合スコア84645

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

終バスが翌日にならないのであればこんな感じ。
ただし終バス以降に検索するとundefinedが返ります

javascript

1Date.prototype.getHM=function(){return this.toLocaleTimeString('en-US',{hour:"numeric",minute:"2-digit",hour12:false})}; 2const hm0=new Date().getHM(); 3console.log(hm0); 4const hm1=mfNEYAGAWA.filter(x=>hm0<x).shift(); 5console.log(hm1); 6const hm2=sNEYAGAWA.filter(x=>hm0<x).shift(); 7console.log(hm2); 8const hm3=mfKORIEN.filter(x=>hm0<x).shift(); 9console.log(hm3); 10const hm4=sKORIEN.filter(x=>hm0<x).shift(); 11console.log(hm4);

投稿2023/06/02 11:42

編集2023/06/02 11:43
yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問