🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

5930閲覧

Javascriptにおいて配列の中の時間の最大値や最小値、及び間の時刻を取得したい。

kamille-mio

総合スコア24

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2019/12/17 20:54

編集2019/12/20 10:53

環境

Laravel 6.5.0
Homestead
使っているライブラリ
→flatpickr(日付)、datetimepicker(時間)、moment.js、holiday_jp.js

やろうとしていること

テーブルからその日の予約情報を取得して、それを参照しDatetimepickerの時間選択で予約が入っている時間は選択できないようにしたい。
今回の場合は9時13時と15時17時で予約が入っていることを前提としています。

質問したいこと

datetimepickerは

javascript

1jQuery('#datetimepicker5').datetimepicker({ 2 datepicker:false, 3 allowTimes:[ 4 '12:00', '13:00', '15:00', 5 '17:00', '17:05', '17:20', '19:00', '20:00' 6 ] 7});

とallowTimes以下に配列を指定すればその時間のみを選択できるようになるので、そのためにAjaxでPHP(Laravel)から予約情報を受けとってそれを元にallowTimesに当たる配列を作ろうと思っているのですが、返ってきた予約情報からstart_timeとend_timeキーごとに配列を分けるところまでは来たのですが、そこから各配列の中の時刻の最大値や最小値、および例えば9時~13時の間の時刻を取得するといったことをどうやればいいのかで詰まっています。
当然2つの配列の値は2つのみとは限らないので繰り返し文に条件をつけて比較をしていかないといけないのですが、間違っていることを前提で下に例示しますが、forEach文で

javascript

1Object.keys(start_times).forEach(key => { 2 if(moment(start_times[key]).format('YYYY-MM-DD HH:mm:ss') <   3   moment(start_times[key+1]).format('YYYY-MM-DD HH:mm:ss') 4 5// これは当然正しく行われない

といったように配列の値同士での比較をしたいところがmoment(start_times[key+1]).format('YYYY-MM-DD HH:mm:ss')の部分で現在の日付を取得してしまうためそれもできずに詰まってしまったという感じです。

そこでとりあえず最大や最小からどうにかしてみようとmoment.maxやMath.max.applyなどは前者はis not function、後者はNaNやinvaild dateなどのエラーが出てしまいます……これは多分私の扱いが悪いと思うのですが……

お力添えを頂けると助かります。

質問に際してやったこと・作ったもの

PHPから返ってきたテーブルから取得したデータ
イメージ説明

start_time及びend_timeで配列を分けたもの
イメージ説明

Javascript

1window.onload = function () { 2 $(document).on("click", "#date-select", function () { 3 init_set_reservations(); 4 }); // 1で発火したajaxでデータベースにアクセスして、テーブルから取得した日付の予約情報を取り出す。 5 6 function init_set_reservations() { 7 var server_url = "http://localhost:8000/"; // 使用しているサーバーのURLを定義 8 // フォームで送信されるデータの確認、本番ではコメントアウト。 9 // var formData = $('#test').serialize(); 10 // console.log(formData); 11 // Ajax。今回は非同期で行いたい。 12 13 $.ajax({ 14 type: 'POST', 15 headers: { 16 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') // CSRF対策、Ajax使う場合はLaravel側と合わせてこの項目も記載する。 17 18 }, 19 url: server_url + "/get-reserve", 20 datatype: 'json', 21 data: { 22 dateinfo: $('#dateinfo').val(), 23 // 日付選択のためのinputタグからの情報 24 facility_name: $('#facility_name').val() // 施設名選択のためのinputタグからの情報 25 26 } 27 }).done(function (data) { 28 console.log(data); 29 30 31 var data = JSON.parse(data); 32 var isArray = Array.isArray; 33 34 // オブジェクトや配列から特定のキーに該当する値を取得して配列にする 35 // 引用 (https://s8a.jp/javascript-object-array-property-function) 36 function property(object, path) { 37 if (object == null || _typeof(object) != 'object') return; 38 return isArray(object) ? object.map(createProcessFunction(path)) : createProcessFunction(path)(object); 39 } 40 41 function createProcessFunction(path) { 42 if (typeof path == 'string') path = path.split('.'); 43 if (!isArray(path)) path = [path]; 44 return function (object) { 45 var index = 0, 46 length = path.length; 47 48 while (index < length) { 49 object = object[toString(path[index++])]; 50 } 51 52 return index && index == length ? object : void 0; 53 }; 54 } 55 56 function toString(value) { 57 if (value == null) return ''; 58 if (typeof value == 'string') return value; 59 if (isArray(value)) return value.map(toString) + ''; 60 var result = value + ''; 61 return '0' == result && 1 / value == -(1 / 0) ? '-0' : result; 62 } 63 64 var start_times = property(data, 'start_time'); 65 var end_times = property(data, 'end_time'); 66 console.log(start_times); 67 console.log(end_times); 68 69 Object.keys(start_times).forEach(key => { 70 var result2 = moment(start_times[key]).format('YYYY-MM-DD HH:mm:ss'); 71 72 console.log(result2); 73 }); 74 75 // result2 = []; 76 77 // Object.keys(start_times).forEach(key => { 78 // result2.push(moment(start_times[key]).format('HH:mm:ss')); 79 // }); // 日付の部分を削除して時間のみに整形、ひとまずコメントアウト。 80 81 82 // Object.keys(start_times).filter(key => { 83 // var result3 = moment.max(start_times).format('YYYY-MM-DD HH:mm:ss'); 84 85 // }); // moment.max() is not function または .format以下を削除して実行するとt[s].isvalid is not a functionとなる。 86 87 Object.keys(end_times).forEach(key => { 88 var result4 = moment(end_times[key]).format('YYYY-MM-DD HH:mm:ss'); 89 console.log(result4); 90 }); 91

追記部分

定義しているテーブル
イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

処理対象の配列を、はじめから momentの配列にしておくと楽かもしれません。

"HH:mm"形式の文字列の配列から momentの配列を作り、その配列に対して

  • 最大値(最も遅い時刻)を取得
  • 最小値(最も早い時刻)を取得
  • 与えられた時間帯に含まれる時刻の配列を取得

するサンプルを以下に挙げます。

javascript

1const times = [ 2 '14:15', 3 '07:00', 4 '23:45', 5 '11:30', 6 '21:15', 7 '09:15', 8 '22:00', 9 '18:45' 10]; 11 12// moment の配列を取得 13const timeMoments = times.map(t => moment(t, 'HH:mm')); 14 15// 最大値(最も遅い時刻)を取得 16const max = moment.max(timeMoments); 17console.log(max.format('HH:mm')); // "23:45" 18 19// 最小値(最も早い時刻)を取得 20const min = moment.min(timeMoments); 21console.log(min.format('HH:mm')); // "07:00" 22 23 24// 11:00 から 15:00までの間に含まれる時刻を昇順に取得 25const MT11 = moment('11:00', 'HH:mm'); 26const MT15 = moment('15:00', 'HH:mm'); 27 28 29const momentsFrom11to15 = timeMoments 30 .filter(m => m - MT11 >= 0 && m - MT15 <= 0) 31 .sort((m1, m2) => m1 - m2); 32 33console.log(momentsFrom11to15.map(m => m.format('HH:mm'))); // ["11:30", "14:15"] 34 35 36 37

参考になれば幸いです。

追記

コメントで頂いたコードの意図を把握しましたので、以下の JSON

json

1[ 2 { 3 "id":"1", 4 "start_time":"2019-11-30 09:00:00", 5 "end_time":"2019-11-30 13:00:00" 6 }, 7 { 8 "id":"2", 9 "start_time":"2019-11-30 15:00:00", 10 "end_time":"2019-11-30 17:00:00" 11 } 12]

から、 配列selectStarttime として、以下

javascript

1[ '13:00', '14:00', '17:00', '18:00' ]

を得るためのコードを、私が書くとしたら、こう書きますというのを挙げておきます。

なお、以下の手順 **1. 〜 7. **に挙げたコードは

にも上げています。

1. フォーマット文字列

はじめに、moment と文字列との変換のためのフォーマットとして以下の3つを用意しておきます。

javascript

1const FORMAT_DATE = 'YYYY-MM-DD'; 2const FORMAT_DATETIME = 'YYYY-MM-DD HH:mm:ss'; 3const FORMAT_TIME = 'HH:mm';

2. 開始と終了の間にある日時を1時間おきに発生するジェネレータ

次に、momentで与えられる2つの日時(開始日時と終了日時)との間にある日時を1時間おきに取得する仕組みとして、ジェネレータを使います。発生する日時に、開始は含み、終了は含まないものとします。また、引数は、ともにmomentであるstartendプロパティを持つオブジェクトです。

javascript

1function* range({ start, end }) { 2 let m = start; 3 while (m.isBefore(end)) { 4 yield m; 5 m = moment(m).add(1, 'hour'); 6 } 7}

上記を使うと、たとえば 2019-12-20 11:00 から 2019-12-20 16:00 までの1時間おきの時刻の文字列を配列で得るには、以下のようにします。

javascript

1const sample = { 2 start: moment('2019-12-20 11:00:00', FORMAT_DATETIME), 3 end: moment('2019-12-20 16:00:00', FORMAT_DATETIME) 4}; 5 6const timeStrings = [...range(sample)].map(m => m.format(FORMAT_TIME)); 7 8// => ["11:00", "12:00", "13:00", "14:00", "15:00"] (※ "16:00" は含まれない)

3.JSONのパース

上記1.と2.を用意しておいたうえで、下記のようなJSON文字列を処理して、selectStarttime を得ることを考えます。

javascript

1const responseJson = ` 2[ 3 { 4 "id":"1", 5 "start_time":"2019-11-30 09:00:00", 6 "end_time":"2019-11-30 13:00:00" 7 }, 8 { 9 "id":"2", 10 "start_time":"2019-11-30 15:00:00", 11 "end_time":"2019-11-30 17:00:00" 12 } 13] 14`;

上記の JSONをパースした結果を変数data に入れますが、単にパースするだけではなく、配列の各要素のstart_timeend_time の文字列形式の日時を moment に変換したプロパティを持つ要素の配列として、data を得るようにします。

javascript

1const data = JSON.parse(responseJson).map(e => ({ 2 start: moment(e.start_time, FORMAT_DATETIME), 3 end: moment(e.end_time, FORMAT_DATETIME) 4}));

ここでは、上記のように、data の要素には id は含めませんでした。これは selectStarttime を得るためには不要なためです。もし他の何らかの処理のために必要であれば含めるようにします。

4.日付部分の文字列の取得

上記で得られたdata の先頭要素の start から日付の文字列を取得します。

javascript

1// 日付部分の文字列を取得(例: 2019-11-30) 2const dateStr = data[0].start.format(FORMAT_DATE);

5.営業時間帯の開始と終了を持つオブジェクト

上記4.で得た日付の営業開始日時と終了日時の moment を持つオブジェクトを作成します。

javascript

1const businessHours = { 2 start: moment(`${dateStr} 09:00:00`, FORMAT_DATETIME), 3 end: moment(`${dateStr} 19:00:00`, FORMAT_DATETIME) 4};

6.営業時間帯に含まれる日時の中で、選択可能なものだけを取得

上記5.で作成した営業時間帯に含まれる日時の中で、選択可能なものだけを含む配列 selectableStartMoments を得ることを考えます。

先の2.に書いたジェネレータ関数 range を使って、[...range(businessHours)]とすると、9時始まりで(19時は含まない)営業時間帯に含まれる、1時間おきのmomentの配列が得られますので、これをfilterします。filter に与える条件は、ある時刻が、data のどの要素eについても、e.start未満の時刻であるか、e.end以上の時刻となっていることですので、selectableStartMoments は以下のようにして得られます。

javascript

1const selectableStartMoments = [...range(businessHours)].filter(m => 2 data.every(e => m.isBefore(e.start) || m.isSameOrAfter(e.end)) 3);

7.文字列に変換して結果を出力

上記6.で得られた selectableStartMoments の各要素のmomentを、HH:mm形式の文字列に変換すれば、目的の selectStarttime が得られます。

javascript

1const selectStarttime = selectableStartMoments.map(m => m.format(FORMAT_TIME)); 2 3console.log(selectStarttime); // => ["13:00", "14:00", "17:00", "18:00"]

投稿2019/12/18 00:37

編集2019/12/20 14:42
jun68ykt

総合スコア9058

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

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

kamille-mio

2019/12/18 17:15

お返事ありがとうございます。 返信が遅くなって申し訳ないです。 ```Javascript var result2 = []; Object.keys(start_times).forEach(key => { result2.push(moment(start_times[key]).format('HH:mm:ss')); }); var result3 = []; Object.keys(start_times).forEach(key => { result3.push(moment(end_times[key]).format('HH:mm:ss')); }); Object.keys(start_times).forEach(key => { result3.push(moment(end_times[key]).format('HH:mm:ss')); }); ``` この形でそれぞれ配列を作り、サンプルにあるコードを使ってみたところ最大と最小は取得できました。 momentの配列にし直すというのはわかっていたのですが、.mapを使うということがわからなかったみたいで大変助かりました。 ただ、「与えられた時間帯に含まれる時刻の配列を取得」という部分に関してなのですがサンプルにあるように間の時間がある配列ではなく、今回の例でいうと var result2 =  ["09:00:00", "15:00:00"]; // start_timesの時刻の部分のみ抽出した配列 var result3 = ["13:00:00", "17:00:00"]; // end_timesの時刻の部分のみを抽出した配列 という配列になるのでつまるところ result2[key]とresult3[key](ex.result2[0]とresult3[0])の間に含まれる時刻を昇順に取得したいということになりここをどうしたものかと思っています。 差分の時間が何時間かはmomentのドキュメントに書いてあるとおりできるので、その差分(4時間)をforの繰り返しの上限にして1時間ずつ足していくか、引いていくかして得た時刻を配列に加えていくといった処理になるのでしょうか?
jun68ykt

2019/12/18 22:31 編集

@kamille-mioさん コメントありがとうございます。 > result2[key]とresult3[key](ex.result2[0]とresult3[0])の間に含まれる時刻を昇順に取得したいということになりここをどうしたものかと思っています。 についてですが、たとえば、"09:00:00" と "13:00:00" が与えられた場合、 [ "09:00:00", "10:00:00", "11:00:00", "12:00:00", "13:00:00" ] という、文字列(または各時刻を保持するmomentオブジェクト)の配列を得たい、ということでしょうか? もしそうだとすると、基本的な考え方としては > 1時間ずつ足していくか、引いていくかして得た時刻を配列に加えていく という処理でよいと思います。ただし、 > その差分(4時間)をforの繰り返しの上限にして とありますが、ループさせるときに、1時間を加算する回数(いまの例だと 4 )を、あらかじめ求めておく必要はないかと思います。 以下は、 そのサンプルコードです。 https://codepen.io/jun68ykt/pen/NWPdEvK?editors=0012 FYI???? Is Same or Before : https://momentjs.com/docs/#/query/is-same-or-before/
kamille-mio

2019/12/19 12:47

@jun68yktさん コメントありがとうございます。 まさにこういうことです。 助かります。 これであとは配列にあるだけresult2[key]とresult3[key]を比較して重複は外しつつ、新しい配列に加えるというところまでもってこれました。 初学者なのでこれもまた難儀することにはなりますが今回は本当にありがとうございました。
jun68ykt

2019/12/19 17:27

どういたしまして。先に進められそうで、よかったです????
kamille-mio

2019/12/19 20:27 編集

とりあえず解決はしたので良かったのですが、それでも申し訳ないのでお詫びをさせてください。 質問の内容で >> allowTimes以下に配列を指定すればその時間を時間選択から外せる としていますが、正しくは「allowTimes以下に配列を指定すればその時間のみ選択できるようになる」でした。 大変失礼致しました。 質問文の方は訂正させていただきます。
kamille-mio

2019/12/19 20:29

そしてその上で改めてになりますが今回、時刻の取り扱いでかなり詰まっていたので本当に助かりました。 Laravel(PHP)でも結構壁なのですが、Javascriptだと余計に難しく感じました。 まだまだ基本がなってないのを痛感した次第です。 ちなみに恥を忍んでよろしければ正しいallowTimesの求め方について、一応繰り返しの処理もできたので後学のためにお聞きしたいのですが、 // 'HH:mm:ss'形式(時間だけ)に整形する。 var result2 = []; Object.keys(start_times).forEach(key => { result2.push(moment(start_times[key]).format('HH:mm')); }); var result3 = []; Object.keys(end_times).forEach(key => { result3.push(moment(end_times[key]).format('HH:mm')); }); console.log(result3); // 整形したstart_times及びend_timesをさらにmoment()形式に変換して'HH:mm'の形に整形して配列にする const start_timeMoments = result2.map(t => moment(t, 'HH:mm')); const end_timeMoments = result3.map(t => moment(t, 'HH:mm')); console.log(end_timeMoments); // startとendの間の時間を取得 var timeStrings = [],i; for( i = 0; i < start_timeMoments.length; i++) { while (start_timeMoments[i].isSameOrBefore(end_timeMoments[i])) { timeStrings.push(start_timeMoments[i].format('HH:mm')); start_timeMoments[i].add(1, 'hour'); } } console.log(timeStrings); // 作った配列から利用時間開始の時刻から外したい時間の配列を作る。そのためend_timeに設定している時刻は先の配列から削除する。 const rejectStarttime = timeStrings.filter(i=> result3.indexOf(i)==-1); console.log(rejectStarttime); // 営業時間 const business_hours = ["09:00","19:00"]; const t = moment(business_hours[0], 'HH:mm'); const max = moment(business_hours[1], 'HH:mm'); // 営業時間帯1時間ごとの時刻をmaxに達するまで取得し、文字列にして配列に追加 const business_hoursStrings = []; while (t.isSameOrBefore(max)) { business_hoursStrings.push(t.format('HH:mm')); t.add(1, 'hour'); } // 作った配列から営業時間時間の終わりの時間を削除する(利用開始時間の選択肢には入らないため) const arr_startTime = business_hoursStrings.filter(i=> i !== business_hours[1]); console.log(arr_startTime); // allowTimesに登録する配列(選択可能となる時刻) const selectStarttime = arr_startTime.filter(i=> rejectStarttime.indexOf(i)==-1); console.log(selectStarttime); というコードで期待している結果は得られたのですが、変数名がテスト用なので少し雑ということを除いて問題ありそうなところや冗長かもしれないところはあるでしょうか? 一応比較等に使っている変数をconsole.logした結果は以下の通りになってます。 result3 = ["13:00", "17:00"] timeStrings = ["09:00", "10:00", "11:00", "12:00", "13:00", "15:00", "16:00", "17:00"] rejectStarttime = ["09:00", "10:00", "11:00", "12:00", "15:00", "16:00"] business_hoursStrings = ["09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00","19:00"] array_start_time = ["09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00"] selectStarttime(最終的に利用開始時間選択のdatetimepickerのallowTimesに設定する配列) =["13:00", "14:00", "17:00", "18:00"]
jun68ykt

2019/12/20 02:02 編集

上記のコードを拝読しまして、 > 問題ありそうなところや冗長かもしれないところ を考えるための前提としてご教示いただきたいのですが、上記のコードの冒頭では、 ・オブジェクト start_times の内容から 配列result2 を ・オブジェクトend_timesの内容から 配列result3 を それぞれ作っていますが、コードから推測するに、オブジェクト start_times, end_times は以下のようなものを想像しています。 オブジェクト start_times : { '2019-12-20': '2019-12-20 09:00:00', '2019-12-21': '2019-12-21 11:00:00', '2019-12-22': '2019-12-22 13:00:00', '2019-12-23': '2019-12-23 10:00:00', '2019-12-24': '2019-12-24 09:00:00', '2019-12-25': '2019-12-25 10:00:00', '2019-12-26': '2019-12-26 08:00:00', '2019-12-27': '2019-12-27 10:00:00' } オブジェクト end_times : { '2019-12-20': '2019-12-20 20:00:00', '2019-12-21': '2019-12-21 19:00:00', '2019-12-22': '2019-12-22 18:00:00', '2019-12-23': '2019-12-23 18:00:00', '2019-12-24': '2019-12-24 21:00:00', '2019-12-25': '2019-12-25 20:00:00', '2019-12-26': '2019-12-26 20:00:00', '2019-12-27': '2019-12-27 19:00:00' } 上記は、キーが YYYY-MM-DD 形式の文字列で、値が YYYY-MM-DD HH:mm:ss 形式の日時の文字列であるようなプロパティを持つオブジェクトです。このようなものを想像していますが、(だいたい)合ってますでしょうか? もし違っていたら、オブジェクト start_times と end_timesは、どのようなオブジェクトを想定すればよいか、ご教示ください。
kamille-mio

2019/12/20 10:51

まずAjaxを用いてPHPから返ってきたデータが質問文にある通り [ { "id": "1", "start_time": "2019-11-30 09:00:00", "end_time": "2019-11-30 13:00:00" }, { "id": "2", "start_time": "2019-11-30 15:00:00", "end_time": "2019-11-30 17:00:00" } ] になります。 このデータから上手いこと今回のような処理を引き出すのは私には難しかったので 「特定のキーを持つ値を抽出して個別に配列にし直す」という処理を一回挟むのはどうかと考えたので、検索をして引用させて頂いたproperty関数を使って var start_times = property(data, 'start_time'); var end_times = property(data, 'end_time'); として元のデータからstart_timeとend_timeがキーとなっている値を抽出してそれぞれ配列にしているため、したがって console.log(start_times); console.log(end_times); 上記2つの処理結果は以下の通りとなっています。 start_times = ["2019-11-30 09:00:00", "2019-11-30 15:00:00"] end_times = ["2019-11-30 13:00:00", "2019-11-30 17:00:00"] こちらでよろしいでしょうか? 引用部分については今回の質問内容含めて一連の処理に一応完結が見えたら、改めて処理全体含めて、自分で処理や仕組みを洗い直します。 引用部以外にも自力でコードを書き上げたとはお世辞にも言えないので……
kamille-mio

2019/12/20 11:02

それと合わせてテーブル図を質問文に追記しておきました。 予約情報は上記の通り id (予約番号はテーブルのidカラムの値にPHP側でランダム数字列を作って結合させる形で表現しようと考えています) user_id(外部キーでユーザー情報テーブルとリレーションしている) facility_id(同じく外部キー、施設情報テーブルとリレーションしている) start_time end_time で管理しています。 Ajaxは施設名と利用日を選択させて決定ボタンを押したら発火、施設名からfacility_idを検索して、それと利用日を参照してその施設に選択された利用日の予約が入っているか検索して、あれば質問文にある通りデータを返すというコードを書いています。
jun68ykt

2019/12/20 14:33

@kamille-mioさん ご返信ありがとうございます。 コメントで頂きましたコードやテーブルのER図から、何を意図しているのかを把握できましたので、与えられたJSONから selectStarttime を得るコードを、私ならこう書きますという案を、回答のほうに追記しました。参考になれば幸いです。
kamille-mio

2019/12/20 15:03

@jun68ykt 丁寧な解説の追記、大変助かります。とてもわかりやすいです。 書ける人が書くとここまで圧縮されるものなのですね。 余談ではありますが、本当は上記のように営業時間のテーブルも作ってあるのでAjaxで取得してこなければいけないところなのですが、今回はまず見せられるものをというのが最優先なのでコードの方で直接定義をしてしまっています。お恥ずかしい限りです。 今は今回の書き方でいうとselectEndtimeに当たる部分(利用終了時間の選択部分、今回の例なら14時、15時、18時、19時のみ選択できるようにしないといけない)の値を得るためには如何したものかと頭を捻っていますが、この追記の部分も含め大変参考にさせていただきたいと思います。 ありがとうございました。
jun68ykt

2019/12/20 15:12

どういたしまして。少しでも何かヒントになれば幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問