質問編集履歴

9

タイトルの変更

2019/02/12 04:35

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
@@ -1 +1 @@
1
- Javascript: カレンダーに関する繰り返し処理について
1
+ Javascript: カレンダーに関する繰り返し処理について(休みを設けるプログラム)
test CHANGED
File without changes

8

タイトルの変更

2019/02/12 04:35

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
@@ -1 +1 @@
1
- Javascript: for文の繰り返し処理がうまく出来な
1
+ Javascript: カレンダーに関する繰り返し処理につ
test CHANGED
File without changes

7

質問内容を綺麗にまとめました。

2019/02/12 04:34

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -122,7 +122,11 @@
122
122
 
123
123
  ### 補足情報(FW/ツールのバージョンなど)
124
124
 
125
+ 以前の質問に関連しているので、参照していただけるともう少しコードが見れるかと思います。
125
126
 
127
+ [以前の質問](https://teratail.com/questions/172721)
128
+
129
+ [リンク先でコードを動かすことができます](https://jsfiddle.net/wm6r921d/7/)
126
130
 
127
131
  ```JavaScript```
128
132
 

6

訂正

2019/02/12 02:54

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -122,11 +122,7 @@
122
122
 
123
123
  ### 補足情報(FW/ツールのバージョンなど)
124
124
 
125
- 以前の質問に関連しているので、参照していただけるともう少しコードが見れるかと思います。
126
125
 
127
- [以前の質問](https://teratail.com/questions/172721)
128
-
129
- [リンク先でコードを動かすことができます](https://jsfiddle.net/wm6r921d/7/)
130
126
 
131
127
  ```JavaScript```
132
128
 
@@ -181,337 +177,3 @@
181
177
  ...etc
182
178
 
183
179
  ]
184
-
185
-
186
-
187
- ```
188
-
189
- ```js
190
-
191
- {
192
-
193
- const
194
-
195
- day_name = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
196
-
197
- day_jname = ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],
198
-
199
- doc = document;
200
-
201
-
202
-
203
- const
204
-
205
- A = (e, ...a) => a.map (a => e.appendChild (doc.createElement (a))),
206
-
207
- B = (d, n) => d.setDate (d.getDate () + n),
208
-
209
- C = d => [d.getFullYear (), '年', d.getMonth () + 1 , '月'].join (''),
210
-
211
- D = d => [('0' + d.getHours ()).slice (-2), ('0' + d.getMinutes ()).slice (-2)].join (':'),
212
-
213
- E = (e, d) => {
214
-
215
- let
216
-
217
- [a,,b] = A (e, 'label', 'br', 'label'),
218
-
219
- w = d.getDay () ;
220
-
221
- a.textContent = d.getDate ();
222
-
223
- b.textContent = day_jname[w];
224
-
225
- e.classList.add (day_name[w]);
226
-
227
- },
228
-
229
- F = d => {
230
-
231
- let m = d.getMonth ();
232
-
233
- return [0,31,59,90,120,151,181,212,243,273,304,334][m] + d.getDate() - 1 +
234
-
235
- (new Date (d.getFullYear (), m + 1,0) === 29 && 0 < m);
236
-
237
- },
238
-
239
- G = ary => ary.reduce ((a, b) => {
240
-
241
- let
242
-
243
- c = typeof b === 'string' ? new Date (b +':00.000+09:00'): b,
244
-
245
- d = D (c);
246
-
247
- if (! (d in a)) a[d] = [];
248
-
249
- a[d][F(c)] = true;
250
-
251
- return a;
252
-
253
- }, { })
254
-
255
- ,
256
-
257
- H = d => new Date (d.getFullYear (), d.getMonth (), d.getDate ()),
258
-
259
- I = d => [('0' + d.getUTCHours ()).slice (-2), ('0' + d.getUTCMinutes ()).slice (-2)].join (':')
260
-
261
- ;
262
-
263
-
264
-
265
-
266
-
267
- class Shedule {
268
-
269
- constructor (date = new Date, range = 7, plan = []) {
270
-
271
- this.current = H (date);
272
-
273
- this.date = H (date);
274
-
275
- this.range = range;
276
-
277
- this.plan = G (plan);
278
-
279
- this.table = document.createElement ('table');
280
-
281
-
282
-
283
- this.remake ();
284
-
285
- }
286
-
287
-
288
-
289
-
290
-
291
- add (day = this.range) {
292
-
293
- let d = H (this.current);
294
-
295
- d.setDate (d.getDate () + day);
296
-
297
- if (+this.date <= +d) {
298
-
299
- this.current = d;
300
-
301
- this.remake ();
302
-
303
- }
304
-
305
- }
306
-
307
-
308
-
309
-
310
-
311
- remake () {
312
-
313
- this.prev_btn = this.next_btn = null;
314
-
315
- let t = this.table;
316
-
317
- [...t.childNodes].forEach (e => e.remove ());
318
-
319
-
320
-
321
- let
322
-
323
- h = t.createTHead (),
324
-
325
- tr0 = h.insertRow (-1),
326
-
327
- tr1 = h.insertRow (-1),
328
-
329
- d = H (this.current),
330
-
331
- s = tr0.insertCell (-1),
332
-
333
- c = 1,
334
-
335
- m = d.getMonth ();
336
-
337
-
338
-
339
- for (let i = 0; i < this.range; i++, c++, B (d, 1)) {
340
-
341
- let td = tr1.insertCell (-1);
342
-
343
- if (m !== d.getMonth ()) {
344
-
345
- s.colSpan = c - 1;
346
-
347
- s = tr0.insertCell (-1);
348
-
349
- m = d.getMonth ();
350
-
351
- c = 1;
352
-
353
- }
354
-
355
- s.textContent = C (d);
356
-
357
- E (td, d);
358
-
359
- }
360
-
361
- s.colSpan = c - 1;
362
-
363
-
364
-
365
- let e = tr0.insertCell (0);
366
-
367
- e.textContent = '前の一週間';
368
-
369
- e.classList.add ('button');
370
-
371
- e.rowSpan = 2;
372
-
373
- this.prev_btn = e;
374
-
375
-
376
-
377
- e = tr0.insertCell (-1);
378
-
379
- e.textContent = '次の一週間';
380
-
381
- e.classList.add ('button');
382
-
383
- e.rowSpan = 2;
384
-
385
- this.next_btn = e;
386
-
387
-
388
-
389
- //start--時間の時と分の分割処理
390
-
391
- var name_start = document.getElementById('sample').value;
392
-
393
-
394
-
395
- var result = name_start.substr( 0, 2 );
396
-
397
- var result2 = name_start.substr( 3, 4 );
398
-
399
-
400
-
401
- var hour_start = result, minutes_start = result2;
402
-
403
- //---end
404
-
405
-
406
-
407
- //finish
408
-
409
- var name_finish = document.getElementById('sample2').value;
410
-
411
-
412
-
413
- var result_finish = name_finish.substr( 0, 2 );
414
-
415
- var result2_finish = name_finish.substr( 3, 4 );
416
-
417
-
418
-
419
- var hour_end = result_finish, minutes_end = result2_finish;
420
-
421
-
422
-
423
- //---end
424
-
425
- let
426
-
427
- begin = new Date (Date.UTC (1970,0,1, hour_start, minutes_start)),//列のスタート時間 //ここをどうにかしたい。
428
-
429
- end = new Date (Date.UTC (1970,0,1, hour_end, minutes_end)),//列の終了時間 //ここをどうにかしたい
430
-
431
- step = new Date (Date.UTC (1970,0,1, 0,30)),//列の感覚調整時間
432
-
433
- o = F (this.current),
434
-
435
- rst = [ ];
436
-
437
-
438
-
439
- for (let d = begin; d < end; d = new Date (+step + (+d))) {
440
-
441
- let
442
-
443
- a = new Array (this.rangi),
444
-
445
- b = I (d),
446
-
447
- c = this.plan[b] || [];
448
-
449
-
450
-
451
- for (let i = 0; i < this.range; i++)
452
-
453
- a[i] = c[o + i] ? '-' : '◎';
454
-
455
-
456
-
457
- rst.push ([b, ...a, b]);
458
-
459
- }
460
-
461
-
462
-
463
- let [tb] = A (t, 'tbody');
464
-
465
- rst.forEach (r => {
466
-
467
- let tr = tb.insertRow (-1);
468
-
469
- r.forEach (c => tr.insertCell (-1).textContent = c)
470
-
471
- });
472
-
473
-
474
-
475
- }
476
-
477
-
478
-
479
- handleEvent ({target: t}) {
480
-
481
- if (t === this.prev_btn) this.add (-this.range);
482
-
483
- if (t === this.next_btn) this.add (this.range);
484
-
485
- }
486
-
487
-
488
-
489
- }
490
-
491
-
492
-
493
- this.Shedule = Shedule;
494
-
495
- }
496
-
497
- const BUSY = [
498
-
499
- '2019-02-12T10:00',
500
-
501
- '2019-02-09T23:30'
502
-
503
- ];
504
-
505
-
506
-
507
-
508
-
509
- let a = new Shedule (new Date, 14, BUSY), {table: b} = a;
510
-
511
- document.querySelector ('#calendar').appendChild (b);
512
-
513
- b.addEventListener ('click', a, false);
514
-
515
- ```
516
-
517
- ```

5

リンクの追記

2019/02/12 02:49

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -126,7 +126,7 @@
126
126
 
127
127
  [以前の質問](https://teratail.com/questions/172721)
128
128
 
129
- [リンク先でコードを動かすことができます](<div id="calendar"></div>)
129
+ [リンク先でコードを動かすことができます](https://jsfiddle.net/wm6r921d/7/)
130
130
 
131
131
  ```JavaScript```
132
132
 

4

コードの追記

2019/02/11 15:33

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -126,6 +126,8 @@
126
126
 
127
127
  [以前の質問](https://teratail.com/questions/172721)
128
128
 
129
+ [リンク先でコードを動かすことができます](<div id="calendar"></div>)
130
+
129
131
  ```JavaScript```
130
132
 
131
133
 

3

コードの追記

2019/02/11 15:32

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -182,7 +182,9 @@
182
182
 
183
183
 
184
184
 
185
+ ```
186
+
185
- ```Javascript
187
+ ```js
186
188
 
187
189
  {
188
190
 
@@ -509,3 +511,5 @@
509
511
  b.addEventListener ('click', a, false);
510
512
 
511
513
  ```
514
+
515
+ ```

2

コードの追記

2019/02/11 14:50

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -179,3 +179,333 @@
179
179
  ...etc
180
180
 
181
181
  ]
182
+
183
+
184
+
185
+ ```Javascript
186
+
187
+ {
188
+
189
+ const
190
+
191
+ day_name = [ 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
192
+
193
+ day_jname = ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],
194
+
195
+ doc = document;
196
+
197
+
198
+
199
+ const
200
+
201
+ A = (e, ...a) => a.map (a => e.appendChild (doc.createElement (a))),
202
+
203
+ B = (d, n) => d.setDate (d.getDate () + n),
204
+
205
+ C = d => [d.getFullYear (), '年', d.getMonth () + 1 , '月'].join (''),
206
+
207
+ D = d => [('0' + d.getHours ()).slice (-2), ('0' + d.getMinutes ()).slice (-2)].join (':'),
208
+
209
+ E = (e, d) => {
210
+
211
+ let
212
+
213
+ [a,,b] = A (e, 'label', 'br', 'label'),
214
+
215
+ w = d.getDay () ;
216
+
217
+ a.textContent = d.getDate ();
218
+
219
+ b.textContent = day_jname[w];
220
+
221
+ e.classList.add (day_name[w]);
222
+
223
+ },
224
+
225
+ F = d => {
226
+
227
+ let m = d.getMonth ();
228
+
229
+ return [0,31,59,90,120,151,181,212,243,273,304,334][m] + d.getDate() - 1 +
230
+
231
+ (new Date (d.getFullYear (), m + 1,0) === 29 && 0 < m);
232
+
233
+ },
234
+
235
+ G = ary => ary.reduce ((a, b) => {
236
+
237
+ let
238
+
239
+ c = typeof b === 'string' ? new Date (b +':00.000+09:00'): b,
240
+
241
+ d = D (c);
242
+
243
+ if (! (d in a)) a[d] = [];
244
+
245
+ a[d][F(c)] = true;
246
+
247
+ return a;
248
+
249
+ }, { })
250
+
251
+ ,
252
+
253
+ H = d => new Date (d.getFullYear (), d.getMonth (), d.getDate ()),
254
+
255
+ I = d => [('0' + d.getUTCHours ()).slice (-2), ('0' + d.getUTCMinutes ()).slice (-2)].join (':')
256
+
257
+ ;
258
+
259
+
260
+
261
+
262
+
263
+ class Shedule {
264
+
265
+ constructor (date = new Date, range = 7, plan = []) {
266
+
267
+ this.current = H (date);
268
+
269
+ this.date = H (date);
270
+
271
+ this.range = range;
272
+
273
+ this.plan = G (plan);
274
+
275
+ this.table = document.createElement ('table');
276
+
277
+
278
+
279
+ this.remake ();
280
+
281
+ }
282
+
283
+
284
+
285
+
286
+
287
+ add (day = this.range) {
288
+
289
+ let d = H (this.current);
290
+
291
+ d.setDate (d.getDate () + day);
292
+
293
+ if (+this.date <= +d) {
294
+
295
+ this.current = d;
296
+
297
+ this.remake ();
298
+
299
+ }
300
+
301
+ }
302
+
303
+
304
+
305
+
306
+
307
+ remake () {
308
+
309
+ this.prev_btn = this.next_btn = null;
310
+
311
+ let t = this.table;
312
+
313
+ [...t.childNodes].forEach (e => e.remove ());
314
+
315
+
316
+
317
+ let
318
+
319
+ h = t.createTHead (),
320
+
321
+ tr0 = h.insertRow (-1),
322
+
323
+ tr1 = h.insertRow (-1),
324
+
325
+ d = H (this.current),
326
+
327
+ s = tr0.insertCell (-1),
328
+
329
+ c = 1,
330
+
331
+ m = d.getMonth ();
332
+
333
+
334
+
335
+ for (let i = 0; i < this.range; i++, c++, B (d, 1)) {
336
+
337
+ let td = tr1.insertCell (-1);
338
+
339
+ if (m !== d.getMonth ()) {
340
+
341
+ s.colSpan = c - 1;
342
+
343
+ s = tr0.insertCell (-1);
344
+
345
+ m = d.getMonth ();
346
+
347
+ c = 1;
348
+
349
+ }
350
+
351
+ s.textContent = C (d);
352
+
353
+ E (td, d);
354
+
355
+ }
356
+
357
+ s.colSpan = c - 1;
358
+
359
+
360
+
361
+ let e = tr0.insertCell (0);
362
+
363
+ e.textContent = '前の一週間';
364
+
365
+ e.classList.add ('button');
366
+
367
+ e.rowSpan = 2;
368
+
369
+ this.prev_btn = e;
370
+
371
+
372
+
373
+ e = tr0.insertCell (-1);
374
+
375
+ e.textContent = '次の一週間';
376
+
377
+ e.classList.add ('button');
378
+
379
+ e.rowSpan = 2;
380
+
381
+ this.next_btn = e;
382
+
383
+
384
+
385
+ //start--時間の時と分の分割処理
386
+
387
+ var name_start = document.getElementById('sample').value;
388
+
389
+
390
+
391
+ var result = name_start.substr( 0, 2 );
392
+
393
+ var result2 = name_start.substr( 3, 4 );
394
+
395
+
396
+
397
+ var hour_start = result, minutes_start = result2;
398
+
399
+ //---end
400
+
401
+
402
+
403
+ //finish
404
+
405
+ var name_finish = document.getElementById('sample2').value;
406
+
407
+
408
+
409
+ var result_finish = name_finish.substr( 0, 2 );
410
+
411
+ var result2_finish = name_finish.substr( 3, 4 );
412
+
413
+
414
+
415
+ var hour_end = result_finish, minutes_end = result2_finish;
416
+
417
+
418
+
419
+ //---end
420
+
421
+ let
422
+
423
+ begin = new Date (Date.UTC (1970,0,1, hour_start, minutes_start)),//列のスタート時間 //ここをどうにかしたい。
424
+
425
+ end = new Date (Date.UTC (1970,0,1, hour_end, minutes_end)),//列の終了時間 //ここをどうにかしたい
426
+
427
+ step = new Date (Date.UTC (1970,0,1, 0,30)),//列の感覚調整時間
428
+
429
+ o = F (this.current),
430
+
431
+ rst = [ ];
432
+
433
+
434
+
435
+ for (let d = begin; d < end; d = new Date (+step + (+d))) {
436
+
437
+ let
438
+
439
+ a = new Array (this.rangi),
440
+
441
+ b = I (d),
442
+
443
+ c = this.plan[b] || [];
444
+
445
+
446
+
447
+ for (let i = 0; i < this.range; i++)
448
+
449
+ a[i] = c[o + i] ? '-' : '◎';
450
+
451
+
452
+
453
+ rst.push ([b, ...a, b]);
454
+
455
+ }
456
+
457
+
458
+
459
+ let [tb] = A (t, 'tbody');
460
+
461
+ rst.forEach (r => {
462
+
463
+ let tr = tb.insertRow (-1);
464
+
465
+ r.forEach (c => tr.insertCell (-1).textContent = c)
466
+
467
+ });
468
+
469
+
470
+
471
+ }
472
+
473
+
474
+
475
+ handleEvent ({target: t}) {
476
+
477
+ if (t === this.prev_btn) this.add (-this.range);
478
+
479
+ if (t === this.next_btn) this.add (this.range);
480
+
481
+ }
482
+
483
+
484
+
485
+ }
486
+
487
+
488
+
489
+ this.Shedule = Shedule;
490
+
491
+ }
492
+
493
+ const BUSY = [
494
+
495
+ '2019-02-12T10:00',
496
+
497
+ '2019-02-09T23:30'
498
+
499
+ ];
500
+
501
+
502
+
503
+
504
+
505
+ let a = new Shedule (new Date, 14, BUSY), {table: b} = a;
506
+
507
+ document.querySelector ('#calendar').appendChild (b);
508
+
509
+ b.addEventListener ('click', a, false);
510
+
511
+ ```

1

質問の補足

2019/02/11 14:48

投稿

rails_ruby
rails_ruby

スコア87

test CHANGED
File without changes
test CHANGED
@@ -64,9 +64,9 @@
64
64
 
65
65
  <input type="date" value="2019-01-01" id="dates"> <!-- 火曜日 -->
66
66
 
67
- <input type="time" value="00:00" id="time_start">
67
+ <input type="time" value="08:00" id="time_start"> <!-- 変更前: 00:00-->
68
68
 
69
- <input type="time" value="23:30" id="time_finish">
69
+ <input type="time" value="10:00" id="time_finish"><!-- 変更前: 23:30 -->
70
70
 
71
71
  ```
72
72
 
@@ -122,6 +122,60 @@
122
122
 
123
123
  ### 補足情報(FW/ツールのバージョンなど)
124
124
 
125
+ 以前の質問に関連しているので、参照していただけるともう少しコードが見れるかと思います。
126
+
125
127
  [以前の質問](https://teratail.com/questions/172721)
126
128
 
127
129
  ```JavaScript```
130
+
131
+
132
+
133
+ ### 追記
134
+
135
+ 文字数の制約上、実際の処理に関わる部分のみを抜粋しています。
136
+
137
+ (練習で色々な処理を試しているので現在のコードがぐちゃぐちゃで載せるに載せないのも理由の一つです...)
138
+
139
+
140
+
141
+ **forを使わないときの処理内容**
142
+
143
+ d0,t1,t2の変数において、querySelectorを用いてinputのvalueを取得しています。
144
+
145
+ 取得した、valueを変数d1,d2でdateとtimeを結合?しています。
146
+
147
+ そしてmではtime_startからtime_finishまでの時間帯を30分おきに配列にしています。
148
+
149
+ そして、本質問内にはありませんが定数BUSYにpushしています。
150
+
151
+ console.logで見ると下記のようになります。
152
+
153
+ ### コンソール
154
+
155
+ ["2019-01-01T08:00","2019-01-01T08:30","2019-01-01T09:00","2019-01-01T09:30","2019-01-01T10:00"]
156
+
157
+
158
+
159
+ ### for文を使った場合 ← ここを実現したいです。
160
+
161
+ **1週目**
162
+
163
+ ["2019-01-01T08:00","2019-01-01T08:30","2019-01-01T09:00","2019-01-01T09:30","2019-01-01T10:00",
164
+
165
+ **2週目**
166
+
167
+ "2019-01-08T08:00","2019-01-08T08:30","2019-01-08T09:00","2019-01-08T09:30","2019-01-08T10:00",
168
+
169
+ **3週目**
170
+
171
+ "2019-01-15T08:00","2019-01-15T08:30","2019-01-15T09:00","2019-01-15T09:30","2019-01-15T10:00",
172
+
173
+ **4週目**
174
+
175
+ "2019-01-22T08:00","2019-01-22T08:30","2019-01-22T09:00","2019-22-01T09:30","2019-01-22T10:00"
176
+
177
+ **5週目**
178
+
179
+ ...etc
180
+
181
+ ]