環境
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などのエラーが出てしまいます……これは多分私の扱いが悪いと思うのですが……
お力添えを頂けると助かります。
質問に際してやったこと・作ったもの
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
追記部分
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/18 17:15
2019/12/18 22:31 編集
2019/12/19 12:47
2019/12/19 17:27
2019/12/19 20:27 編集
2019/12/19 20:29
2019/12/20 02:02 編集
2019/12/20 10:51
2019/12/20 11:02
2019/12/20 14:33
2019/12/20 15:03
2019/12/20 15:12