質問編集履歴

5

お礼と解決したコードについて

2019/04/21 03:02

投稿

nanase21
nanase21

スコア144

test CHANGED
File without changes
test CHANGED
@@ -269,3 +269,89 @@
269
269
  [エラーが出る時のcodepenプロジェクト](https://codepen.io/nanase/pen/pBevoj)
270
270
 
271
271
  ![エラー詳細](2dcc637c57651eb91b564e40f88525b4.png)
272
+
273
+
274
+
275
+ #解決した方法
276
+
277
+ 私の力ではどうしても分からなかったため、@hai_haiさんからご教示いただきました。
278
+
279
+ ``a = Array(24).fill(0).reduce((a,b,c)=>(b=('0'+c).slice(-2),[...a,b+':00',b+':30']),[]).reduce((a,b)=>(a[b]=Array(366).fill(false),a),{});``
280
+
281
+
282
+
283
+ **実際のコード**
284
+
285
+ ```js
286
+
287
+ setHoliday (...dayNo) {
288
+
289
+ let
290
+
291
+ year = this.current.getFullYear (),
292
+
293
+ start = new Date (year, 0, 1),
294
+
295
+ end = new Date (year, 12, 1),
296
+
297
+ // ここでdayNoが0の時に実行される処理。全てを初期化する。this.planにaを代入する。
298
+
299
+ a = Array(24).fill(0).reduce((a,b,c)=>(b=('0'+c).slice(-2),[...a,b+':00',b+':30']),[]).reduce((a,b)=>(a[b]=Array(366).fill(false),a),{}),
300
+
301
+ b = new Date (Date.UTC (1970,0,1, 0, 0)),//列のスタート時間
302
+
303
+ e = new Date (Date.UTC (1970,0,1,24, 30)),//列の終了時間
304
+
305
+ s = new Date (Date.UTC (1970,0,1, 0,30));//列の感覚調整時間
306
+
307
+ //setHolidayのdayNoに戻り値が返されるので、dayNoの中の配列が空かどうか確認し、空の場合のみにthis.planにaを代入する。
308
+
309
+ if (!dayNo.length > 0){
310
+
311
+ this.plan = a;
312
+
313
+ }
314
+
315
+ dayNo.forEach (n => {
316
+
317
+ let current = new Date (start);
318
+
319
+
320
+
321
+ current.setDate (7 - current.getDate () + n);
322
+
323
+
324
+
325
+ for (; current < end; current.setDate (current.getDate () + 7)) {
326
+
327
+ let idx = F (current);
328
+
329
+
330
+
331
+ for (let c = b; c < e; c = new Date (+s + (+c))) {
332
+
333
+ let key = I (c);
334
+
335
+ if (! this.plan[key])
336
+
337
+ this.plan[key] = [ ];
338
+
339
+ this.plan[key][idx] = true;
340
+
341
+ }
342
+
343
+ }
344
+
345
+ });
346
+
347
+ ```
348
+
349
+
350
+
351
+ #今後について
352
+
353
+ 今回質問させていただくにあたり、ご回答して頂いた多数の方から身の丈にあったところから勉強していくべきとご指摘を受けたことを踏まえ、私もその通りだと感じました。
354
+
355
+ 今後については、javascriptをちゃんと勉強した上で再度カレンダーの実装について取り組んでいきたいと思います。
356
+
357
+ 何度も質問してしまいご迷惑をおかけして申し訳ございませんでした。

4

エラー内容の追記

2019/04/21 03:02

投稿

nanase21
nanase21

スコア144

test CHANGED
File without changes
test CHANGED
@@ -266,4 +266,6 @@
266
266
 
267
267
 
268
268
 
269
- [エラーが出る時](https://codepen.io/nanase/pen/pBevoj)
269
+ [エラーが出る時のcodepenプロジェクト](https://codepen.io/nanase/pen/pBevoj)
270
+
271
+ ![エラー詳細](2dcc637c57651eb91b564e40f88525b4.png)

3

エラーが出る時のcodepenリンク先を追記

2019/04/10 07:04

投稿

nanase21
nanase21

スコア144

test CHANGED
File without changes
test CHANGED
@@ -263,3 +263,7 @@
263
263
  エラーが起きる時
264
264
 
265
265
  ``schedule.setHoliday()``とsetHolidayの中に、数字がない場合、カレンダー内の◎のセルをクリックしてもアラートが表示されなくなります。
266
+
267
+
268
+
269
+ [エラーが出る時](https://codepen.io/nanase/pen/pBevoj)

2

エラーの再現方法について追記させて頂きました。

2019/04/10 07:02

投稿

nanase21
nanase21

スコア144

test CHANGED
File without changes
test CHANGED
@@ -249,3 +249,17 @@
249
249
  }, false);
250
250
 
251
251
  ```
252
+
253
+
254
+
255
+ **問題の再現方法**
256
+
257
+ 通常処理
258
+
259
+ ``schedule.setHoliday(1)``or``schedule.setHoliday(1,3,6)``とsetHolidayの中に、数字がある場合、カレンダー内の◎のセルをクリックすると「エラーは取れましたね」とアラートが表示されます。
260
+
261
+
262
+
263
+ エラーが起きる時
264
+
265
+ ``schedule.setHoliday()``とsetHolidayの中に、数字がない場合、カレンダー内の◎のセルをクリックしてもアラートが表示されなくなります。

1

該当コードの追記

2019/04/10 03:34

投稿

nanase21
nanase21

スコア144

test CHANGED
File without changes
test CHANGED
@@ -47,3 +47,205 @@
47
47
  #実現したいこと
48
48
 
49
49
  現状では、定休日を最低1日セットしないとエラーが出てしまうので、それを``setHoilday()``と定休日をセットしない時でもクリック時にアラートを表示できるようにしたい。
50
+
51
+
52
+
53
+ #追記
54
+
55
+ **ご指摘を受けた点**
56
+
57
+ codepenのcssとjsを分けました。
58
+
59
+ コード量が文字数上、全てお載せすることができないため、該当するコードを追記しました。
60
+
61
+
62
+
63
+ **該当コード**
64
+
65
+ ```js
66
+
67
+ setHoliday (...dayNo) {
68
+
69
+ let
70
+
71
+ year = this.current.getFullYear (),
72
+
73
+ start = new Date (year, 0, 1),
74
+
75
+ end = new Date (year, 12, 1),
76
+
77
+
78
+
79
+ b = new Date (Date.UTC (1970,0,1, 0, 0)),//列のスタート時間
80
+
81
+ e = new Date (Date.UTC (1970,0,1,24, 30)),//列の終了時間
82
+
83
+ s = new Date (Date.UTC (1970,0,1, 0,30));//列の感覚調整時間
84
+
85
+
86
+
87
+ //schedule.setHoliday();の時コンソール結果が配列が空になっている。
88
+
89
+ console.log(dayNo);
90
+
91
+
92
+
93
+ dayNo.forEach (n => {
94
+
95
+ let current = new Date (start);
96
+
97
+
98
+
99
+ current.setDate (7 - current.getDate () + n);
100
+
101
+
102
+
103
+ for (; current < end; current.setDate (current.getDate () + 7)) {
104
+
105
+ let idx = F (current);
106
+
107
+
108
+
109
+ for (let c = b; c < e; c = new Date (+s + (+c))) {
110
+
111
+ let key = I (c);
112
+
113
+ if (! this.plan[key])
114
+
115
+ this.plan[key] = [ ]; //ここの配列が空によりエラーが起きている?
116
+
117
+ this.plan[key][idx] = true;
118
+
119
+ }
120
+
121
+ }
122
+
123
+ });
124
+
125
+
126
+
127
+ return this;
128
+
129
+ }
130
+
131
+
132
+
133
+ // 定休日と昼休みの設定
134
+
135
+ //0:sun 1:mon 2:tue 3:wed 4:thu 5:fri 6:sat
136
+
137
+ //setHolidayを設定しないとエラーが起きる。setHoliday()だとエラーになる。なんで?
138
+
139
+ schedule.setHoliday(1).setLunchTime (0, 2, 4, 6);
140
+
141
+
142
+
143
+ //クリック処理
144
+
145
+ table.addEventListener('click', event => {
146
+
147
+ const target = event.target;
148
+
149
+
150
+
151
+ if (target.nodeName !== 'TD')
152
+
153
+ return;
154
+
155
+
156
+
157
+ if ('◎' !== target.textContent)
158
+
159
+ return;
160
+
161
+
162
+
163
+ let booktime = parseInt (document.querySelector ('#booktime').value, 10);
164
+
165
+ //表の始まりの日付
166
+
167
+ let cur = schedule.current;
168
+
169
+ //クリック時の表の(セル)座標x
170
+
171
+ let x = target.cellIndex;
172
+
173
+ //クリック時の表の(セル)座標y
174
+
175
+ let y = target.parentNode.rowIndex - 2;
176
+
177
+ //クリックされた列の日付を取得
178
+
179
+ let tgt = new Date (cur);
180
+
181
+ tgt.setDate (tgt.getDate () + x -1);
182
+
183
+ //その日のスケジュールを取得
184
+
185
+ ////schedule.setHoliday();の時下記のコードでエラーが発生
186
+
187
+ let plan = Schedule.getDayPlan (schedule, tgt);
188
+
189
+ // console.log(plan);
190
+
191
+ //plan から9時~15時までを抜き出す
192
+
193
+ plan = plan.slice (18, 31);
194
+
195
+ //予約コースの判定
196
+
197
+ let rng = booktime / 30 |0;
198
+
199
+ plan = plan.slice (y, y + rng);
200
+
201
+
202
+
203
+ if (rng === plan.length && plan.every (a=> !a[1])){
204
+
205
+ //console.log (rng ? 'ok': 'Invalid');
206
+
207
+ var id = Array.from(document.getElementsByName('id'), x => x.value);
208
+
209
+
210
+
211
+ if (!(target.closest('tbody') && 1 <= target.cellIndex && target.cellIndex <= 14)) {
212
+
213
+ return true;
214
+
215
+ }
216
+
217
+ const
218
+
219
+ time = target.parentNode.cells[0].textContent,
220
+
221
+ table = target.closest('table'),
222
+
223
+ date = table.tHead.rows[1].cells[target.cellIndex - 1].textContent.replace(/[^0-9]/g, ''),
224
+
225
+ ymrow = table.tHead.rows[0],
226
+
227
+ ym = (target.cellIndex <= ymrow.cells[1].colSpan ? ymrow.cells[1] : ymrow.cells[2]).textContent;
228
+
229
+
230
+
231
+ let
232
+
233
+ value = ym + date + '日' + time,
234
+
235
+ param = document.getElementById( "booktime" ).value;
236
+
237
+ //newに飛ぶ
238
+
239
+ alert('エラーは取れましたね');
240
+
241
+ //window.location.href = `new.${id}`+`confirm?datetime=${value + '-' + param + '分コース' + id}`;
242
+
243
+ }else{
244
+
245
+ alert("その時間帯は予約は出来ません。");
246
+
247
+ }
248
+
249
+ }, false);
250
+
251
+ ```