回答編集履歴

3

数字に対応した検索

2019/03/12 09:24

投稿

sauzar18
sauzar18

スコア163

test CHANGED
@@ -14,6 +14,58 @@
14
14
 
15
15
 
16
16
 
17
+ ```json
18
+
19
+ {
20
+
21
+ "result": [
22
+
23
+ {
24
+
25
+ "id": "001",
26
+
27
+ "date": "2019-03-11 00:00:00",
28
+
29
+ "anime": "ワンピース",
30
+
31
+ "status": "未視聴"
32
+
33
+ },
34
+
35
+ {
36
+
37
+ "id": "002",
38
+
39
+ "date": "2019-03-10 00:00:00",
40
+
41
+ "anime": "ナルト",
42
+
43
+ "status": "視聴済"
44
+
45
+ },
46
+
47
+ {
48
+
49
+ "id": "003",
50
+
51
+ "date": "2019-03-09 00:00:00",
52
+
53
+ "anime": "銀魂",
54
+
55
+ "status": "保留"
56
+
57
+ }
58
+
59
+ ]
60
+
61
+ }
62
+
63
+ ```
64
+
65
+
66
+
67
+ クリックアクションに応じて行うなら
68
+
17
69
  ```html
18
70
 
19
71
  <template>
@@ -40,6 +92,18 @@
40
92
 
41
93
  </div>
42
94
 
95
+ <button
96
+
97
+ type="button"
98
+
99
+ @click="isSearch"
100
+
101
+ >
102
+
103
+ 検索
104
+
105
+ </button>
106
+
43
107
  </div>
44
108
 
45
109
  <!-- アニメのセレクト -->
@@ -200,7 +264,15 @@
200
264
 
201
265
  selectedStatus: ''
202
266
 
203
- }
267
+ },
268
+
269
+ anime: '',
270
+
271
+ status: '',
272
+
273
+ start: '',
274
+
275
+ end: ''
204
276
 
205
277
  }
206
278
 
@@ -212,21 +284,367 @@
212
284
 
213
285
  let list = this.data
214
286
 
287
+ const anime = this.anime
288
+
289
+ const status = this.status
290
+
291
+ const start = this.start
292
+
293
+ const end = this.end
294
+
295
+ list = list.filter(function (row) {
296
+
297
+ if (anime) {
298
+
299
+ if (row['anime'] !== anime) {
300
+
301
+ return false
302
+
303
+ }
304
+
305
+ }
306
+
307
+ if (status) {
308
+
309
+ if (row['status'] !== status) {
310
+
311
+ return false
312
+
313
+ }
314
+
315
+ }
316
+
317
+ if (start || end) {
318
+
319
+ const time = moment(row['date']).format("YYYY-MM-DD")
320
+
321
+ if (time < start || time > end) {
322
+
323
+ return false
324
+
325
+ }
326
+
327
+ }
328
+
329
+ return row
330
+
331
+ })
332
+
333
+ return list
334
+
335
+ }
336
+
337
+ },
338
+
339
+ methods: {
340
+
341
+ isSearch() {
342
+
215
- const selectAnime = this.formOptions.selectedAnime
343
+ this.anime = this.formOptions.selectedAnime
216
-
344
+
217
- const selectStatus = this.formOptions.selectedStatus
345
+ this.status = this.formOptions.selectedStatus
218
346
 
219
347
  const selectedDate = this.formOptions.selectedDate
220
348
 
221
- const start = moment(selectedDate.start).format("YYYY-MM-DD")
349
+ this.start = moment(selectedDate.start).format("YYYY-MM-DD")
222
-
350
+
223
- const end = moment(selectedDate.end).format("YYYY-MM-DD")
351
+ this.end = moment(selectedDate.end).format("YYYY-MM-DD")
352
+
353
+ }
354
+
355
+ }
356
+
357
+ }
358
+
359
+ </script>
360
+
361
+
362
+
363
+ <style>
364
+
365
+ /* スタイルは省略 */
366
+
367
+ </style>
368
+
369
+
370
+
371
+ ```
372
+
373
+
374
+
375
+ JSONの値を戻して数字ベースの絞り込み
376
+
377
+ ```json
378
+
379
+ {
380
+
381
+ "result": [
382
+
383
+ {
384
+
385
+ "id": "001",
386
+
387
+ "date": "2019/03/11 00:00:00",
388
+
389
+ "anime": 1,
390
+
391
+ "status": 1
392
+
393
+ },
394
+
395
+ {
396
+
397
+ "id": "002",
398
+
399
+ "date": "2019/03/10 00:00:00",
400
+
401
+ "anime": 2,
402
+
403
+ "status": 2
404
+
405
+ },
406
+
407
+ {
408
+
409
+ "id": "003",
410
+
411
+ "date": "2019/03/09 00:00:00",
412
+
413
+ "anime": 3,
414
+
415
+ "status": 3
416
+
417
+ }
418
+
419
+ ]
420
+
421
+ }
422
+
423
+ ```
424
+
425
+ ```html
426
+
427
+ <template>
428
+
429
+ <section>
430
+
431
+ <header class="header">
432
+
433
+ <!-- 録画日時のセレクト-->
434
+
435
+ <div class="input__item">
436
+
437
+ <span>録画日時</span>
438
+
439
+ <div class="date-picker__wrapper">
440
+
441
+ <v-date-picker
442
+
443
+ v-model="formOptions.selectedDate"
444
+
445
+ mode="range"
446
+
447
+ />
448
+
449
+ </div>
450
+
451
+ <button
452
+
453
+ type="button"
454
+
455
+ @click="isSearch"
456
+
457
+ >
458
+
459
+ 検索
460
+
461
+ </button>
462
+
463
+ </div>
464
+
465
+ <!-- アニメのセレクト -->
466
+
467
+ <div class="input__item">
468
+
469
+ <label for="anime">アニメ</label>
470
+
471
+ <select id="anime" v-model="formOptions.selectedAnime">
472
+
473
+ <option value="">
474
+
475
+ すべて
476
+
477
+ </option>
478
+
479
+ <option value="1">ワンピース</option>
480
+
481
+ <option value="2">ナルト</option>
482
+
483
+ <option value="3">銀魂</option>
484
+
485
+ </select>
486
+
487
+ </div>
488
+
489
+
490
+
491
+ <!-- ステータスのセレクト -->
492
+
493
+ <div class="input__item">
494
+
495
+ <label for="status">ステータス</label>
496
+
497
+ <select id="status" v-model="formOptions.selectedStatus">
498
+
499
+ <option value="">
500
+
501
+ すべて
502
+
503
+ </option>
504
+
505
+ <option value="1">未視聴</option>
506
+
507
+ <option value="2">視聴済</option>
508
+
509
+ <option value="3">保留</option>
510
+
511
+ </select>
512
+
513
+ </div>
514
+
515
+ </header>
516
+
517
+ <!-- 以下にテーブルを表示 -->
518
+
519
+ <div class="table__wrapper">
520
+
521
+ <table class="table">
522
+
523
+ <thead>
524
+
525
+ <tr>
526
+
527
+ <th>ID</th>
528
+
529
+ <th>録画日時</th>
530
+
531
+ <th>アニメ</th>
532
+
533
+ <th>ステータス</th>
534
+
535
+ </tr>
536
+
537
+ </thead>
538
+
539
+ <tbody>
540
+
541
+ <tr
542
+
543
+ v-for="(item, index) in doSearch"
544
+
545
+ :key="index"
546
+
547
+ >
548
+
549
+ <td>{{ item.id }}</td>
550
+
551
+ <td>{{ item.date }}</td>
552
+
553
+ <td>
554
+
555
+ <span v-if="item.anime === 1">ワンピース</span>
556
+
557
+ <span v-else-if="item.anime === 2">ナルト</span>
558
+
559
+ <span v-else>銀魂</span>
560
+
561
+ </td>
562
+
563
+ <td>
564
+
565
+ <span v-if="item.status == 1">未視聴</span>
566
+
567
+ <span v-else-if="item.status == 2">視聴済</span>
568
+
569
+ <span v-else>保留</span>
570
+
571
+ </td>
572
+
573
+ </tr>
574
+
575
+ </tbody>
576
+
577
+ </table>
578
+
579
+ </div>
580
+
581
+ </section>
582
+
583
+ </template>
584
+
585
+
586
+
587
+ <script>
588
+
589
+ import sampleJson from '~/static/sample.json'
590
+
591
+ import moment from 'moment'
592
+
593
+ export default {
594
+
595
+ data() {
596
+
597
+ return {
598
+
599
+ data: sampleJson.result,
600
+
601
+ formOptions: {
602
+
603
+ selectedDate: {
604
+
605
+ start: new Date(),
606
+
607
+ end: new Date()
608
+
609
+ },
610
+
611
+ selectedAnime: '',
612
+
613
+ selectedStatus: ''
614
+
615
+ },
616
+
617
+ anime: '',
618
+
619
+ status: '',
620
+
621
+ start: '',
622
+
623
+ end: ''
624
+
625
+ }
626
+
627
+ },
628
+
629
+ computed: {
630
+
631
+ doSearch() {
632
+
633
+ let list = this.data
634
+
635
+ const anime = this.anime
636
+
637
+ const status = this.status
638
+
639
+ const start = this.start
640
+
641
+ const end = this.end
224
642
 
225
643
  list = list.filter(function (row) {
226
644
 
227
- if (selectAnime) {
645
+ if (anime) {
228
-
646
+
229
- if (row['anime'] !== selectAnime) {
647
+ if (row['anime'] !== Number(anime)) {
230
648
 
231
649
  return false
232
650
 
@@ -234,9 +652,9 @@
234
652
 
235
653
  }
236
654
 
237
- if (selectStatus) {
655
+ if (status) {
238
-
656
+
239
- if (row['status'] !== selectStatus) {
657
+ if (row['status'] !== Number(status)) {
240
658
 
241
659
  return false
242
660
 
@@ -244,7 +662,7 @@
244
662
 
245
663
  }
246
664
 
247
- if (selectedDate) {
665
+ if (start || end) {
248
666
 
249
667
  const time = moment(row['date']).format("YYYY-MM-DD")
250
668
 
@@ -264,6 +682,24 @@
264
682
 
265
683
  }
266
684
 
685
+ },
686
+
687
+ methods: {
688
+
689
+ isSearch() {
690
+
691
+ this.anime = this.formOptions.selectedAnime
692
+
693
+ this.status = this.formOptions.selectedStatus
694
+
695
+ const selectedDate = this.formOptions.selectedDate
696
+
697
+ this.start = moment(selectedDate.start).format("YYYY-MM-DD")
698
+
699
+ this.end = moment(selectedDate.end).format("YYYY-MM-DD")
700
+
701
+ }
702
+
267
703
  }
268
704
 
269
705
  }
@@ -281,361 +717,3 @@
281
717
 
282
718
 
283
719
  ```
284
-
285
-
286
-
287
- ```json
288
-
289
- {
290
-
291
- "result": [
292
-
293
- {
294
-
295
- "id": "001",
296
-
297
- "date": "2019-03-11 00:00:00",
298
-
299
- "anime": "ワンピース",
300
-
301
- "status": "未視聴"
302
-
303
- },
304
-
305
- {
306
-
307
- "id": "002",
308
-
309
- "date": "2019-03-10 00:00:00",
310
-
311
- "anime": "ナルト",
312
-
313
- "status": "視聴済"
314
-
315
- },
316
-
317
- {
318
-
319
- "id": "003",
320
-
321
- "date": "2019-03-09 00:00:00",
322
-
323
- "anime": "銀魂",
324
-
325
- "status": "保留"
326
-
327
- }
328
-
329
- ]
330
-
331
- }
332
-
333
- ```
334
-
335
-
336
-
337
- クリックアクションに応じて行うなら
338
-
339
- ```html
340
-
341
- <template>
342
-
343
- <section>
344
-
345
- <header class="header">
346
-
347
- <!-- 録画日時のセレクト-->
348
-
349
- <div class="input__item">
350
-
351
- <span>録画日時</span>
352
-
353
- <div class="date-picker__wrapper">
354
-
355
- <v-date-picker
356
-
357
- v-model="formOptions.selectedDate"
358
-
359
- mode="range"
360
-
361
- />
362
-
363
- </div>
364
-
365
- <button
366
-
367
- type="button"
368
-
369
- @click="isSearch"
370
-
371
- >
372
-
373
- 検索
374
-
375
- </button>
376
-
377
- </div>
378
-
379
- <!-- アニメのセレクト -->
380
-
381
- <div class="input__item">
382
-
383
- <label for="anime">アニメ</label>
384
-
385
- <select id="anime" v-model="formOptions.selectedAnime">
386
-
387
- <option value="">
388
-
389
- すべて
390
-
391
- </option>
392
-
393
- <option value="ワンピース">
394
-
395
- ワンピース
396
-
397
- </option>
398
-
399
- <option value="ナルト">
400
-
401
- ナルト
402
-
403
- </option>
404
-
405
- <option value="銀魂">
406
-
407
- 銀魂
408
-
409
- </option>
410
-
411
- </select>
412
-
413
- </div>
414
-
415
-
416
-
417
- <!-- ステータスのセレクト -->
418
-
419
- <div class="input__item">
420
-
421
- <label for="status">ステータス</label>
422
-
423
- <select id="status" v-model="formOptions.selectedStatus">
424
-
425
- <option value="">
426
-
427
- すべて
428
-
429
- </option>
430
-
431
- <option value="未視聴">
432
-
433
- 未視聴
434
-
435
- </option>
436
-
437
- <option value="視聴済">
438
-
439
- 視聴済
440
-
441
- </option>
442
-
443
- <option value="保留">
444
-
445
- 保留
446
-
447
- </option>
448
-
449
- </select>
450
-
451
- </div>
452
-
453
- </header>
454
-
455
- <!-- 以下にテーブルを表示 -->
456
-
457
- <div class="table__wrapper">
458
-
459
- <table class="table">
460
-
461
- <thead>
462
-
463
- <tr>
464
-
465
- <th>ID</th>
466
-
467
- <th>録画日時</th>
468
-
469
- <th>アニメ</th>
470
-
471
- <th>ステータス</th>
472
-
473
- </tr>
474
-
475
- </thead>
476
-
477
- <tbody>
478
-
479
- <tr
480
-
481
- v-for="(item, index) in doSearch"
482
-
483
- :key="index"
484
-
485
- >
486
-
487
- <td>{{ item.id }}</td>
488
-
489
- <td>{{ item.date }}</td>
490
-
491
- <td>{{ item.anime }}</td>
492
-
493
- <td>{{ item.status }}</td>
494
-
495
- </tr>
496
-
497
- </tbody>
498
-
499
- </table>
500
-
501
- </div>
502
-
503
- </section>
504
-
505
- </template>
506
-
507
-
508
-
509
- <script>
510
-
511
- import sampleJson from '~/static/sample.json'
512
-
513
- import moment from 'moment'
514
-
515
- export default {
516
-
517
- data() {
518
-
519
- return {
520
-
521
- data: sampleJson.result,
522
-
523
- formOptions: {
524
-
525
- selectedDate: {
526
-
527
- start: new Date(),
528
-
529
- end: new Date()
530
-
531
- },
532
-
533
- selectedAnime: '',
534
-
535
- selectedStatus: ''
536
-
537
- },
538
-
539
- anime: '',
540
-
541
- status: '',
542
-
543
- start: '',
544
-
545
- end: ''
546
-
547
- }
548
-
549
- },
550
-
551
- computed: {
552
-
553
- doSearch() {
554
-
555
- let list = this.data
556
-
557
- const anime = this.anime
558
-
559
- const status = this.status
560
-
561
- const start = this.start
562
-
563
- const end = this.end
564
-
565
- list = list.filter(function (row) {
566
-
567
- if (anime) {
568
-
569
- if (row['anime'] !== anime) {
570
-
571
- return false
572
-
573
- }
574
-
575
- }
576
-
577
- if (status) {
578
-
579
- if (row['status'] !== status) {
580
-
581
- return false
582
-
583
- }
584
-
585
- }
586
-
587
- if (start || end) {
588
-
589
- const time = moment(row['date']).format("YYYY-MM-DD")
590
-
591
- if (time < start || time > end) {
592
-
593
- return false
594
-
595
- }
596
-
597
- }
598
-
599
- return row
600
-
601
- })
602
-
603
- return list
604
-
605
- }
606
-
607
- },
608
-
609
- methods: {
610
-
611
- isSearch() {
612
-
613
- this.anime = this.formOptions.selectedAnime
614
-
615
- this.status = this.formOptions.selectedStatus
616
-
617
- const selectedDate = this.formOptions.selectedDate
618
-
619
- this.start = moment(selectedDate.start).format("YYYY-MM-DD")
620
-
621
- this.end = moment(selectedDate.end).format("YYYY-MM-DD")
622
-
623
- }
624
-
625
- }
626
-
627
- }
628
-
629
- </script>
630
-
631
-
632
-
633
- <style>
634
-
635
- /* スタイルは省略 */
636
-
637
- </style>
638
-
639
-
640
-
641
- ```

2

回答の追記

2019/03/12 09:24

投稿

sauzar18
sauzar18

スコア163

test CHANGED
@@ -331,3 +331,311 @@
331
331
  }
332
332
 
333
333
  ```
334
+
335
+
336
+
337
+ クリックアクションに応じて行うなら
338
+
339
+ ```html
340
+
341
+ <template>
342
+
343
+ <section>
344
+
345
+ <header class="header">
346
+
347
+ <!-- 録画日時のセレクト-->
348
+
349
+ <div class="input__item">
350
+
351
+ <span>録画日時</span>
352
+
353
+ <div class="date-picker__wrapper">
354
+
355
+ <v-date-picker
356
+
357
+ v-model="formOptions.selectedDate"
358
+
359
+ mode="range"
360
+
361
+ />
362
+
363
+ </div>
364
+
365
+ <button
366
+
367
+ type="button"
368
+
369
+ @click="isSearch"
370
+
371
+ >
372
+
373
+ 検索
374
+
375
+ </button>
376
+
377
+ </div>
378
+
379
+ <!-- アニメのセレクト -->
380
+
381
+ <div class="input__item">
382
+
383
+ <label for="anime">アニメ</label>
384
+
385
+ <select id="anime" v-model="formOptions.selectedAnime">
386
+
387
+ <option value="">
388
+
389
+ すべて
390
+
391
+ </option>
392
+
393
+ <option value="ワンピース">
394
+
395
+ ワンピース
396
+
397
+ </option>
398
+
399
+ <option value="ナルト">
400
+
401
+ ナルト
402
+
403
+ </option>
404
+
405
+ <option value="銀魂">
406
+
407
+ 銀魂
408
+
409
+ </option>
410
+
411
+ </select>
412
+
413
+ </div>
414
+
415
+
416
+
417
+ <!-- ステータスのセレクト -->
418
+
419
+ <div class="input__item">
420
+
421
+ <label for="status">ステータス</label>
422
+
423
+ <select id="status" v-model="formOptions.selectedStatus">
424
+
425
+ <option value="">
426
+
427
+ すべて
428
+
429
+ </option>
430
+
431
+ <option value="未視聴">
432
+
433
+ 未視聴
434
+
435
+ </option>
436
+
437
+ <option value="視聴済">
438
+
439
+ 視聴済
440
+
441
+ </option>
442
+
443
+ <option value="保留">
444
+
445
+ 保留
446
+
447
+ </option>
448
+
449
+ </select>
450
+
451
+ </div>
452
+
453
+ </header>
454
+
455
+ <!-- 以下にテーブルを表示 -->
456
+
457
+ <div class="table__wrapper">
458
+
459
+ <table class="table">
460
+
461
+ <thead>
462
+
463
+ <tr>
464
+
465
+ <th>ID</th>
466
+
467
+ <th>録画日時</th>
468
+
469
+ <th>アニメ</th>
470
+
471
+ <th>ステータス</th>
472
+
473
+ </tr>
474
+
475
+ </thead>
476
+
477
+ <tbody>
478
+
479
+ <tr
480
+
481
+ v-for="(item, index) in doSearch"
482
+
483
+ :key="index"
484
+
485
+ >
486
+
487
+ <td>{{ item.id }}</td>
488
+
489
+ <td>{{ item.date }}</td>
490
+
491
+ <td>{{ item.anime }}</td>
492
+
493
+ <td>{{ item.status }}</td>
494
+
495
+ </tr>
496
+
497
+ </tbody>
498
+
499
+ </table>
500
+
501
+ </div>
502
+
503
+ </section>
504
+
505
+ </template>
506
+
507
+
508
+
509
+ <script>
510
+
511
+ import sampleJson from '~/static/sample.json'
512
+
513
+ import moment from 'moment'
514
+
515
+ export default {
516
+
517
+ data() {
518
+
519
+ return {
520
+
521
+ data: sampleJson.result,
522
+
523
+ formOptions: {
524
+
525
+ selectedDate: {
526
+
527
+ start: new Date(),
528
+
529
+ end: new Date()
530
+
531
+ },
532
+
533
+ selectedAnime: '',
534
+
535
+ selectedStatus: ''
536
+
537
+ },
538
+
539
+ anime: '',
540
+
541
+ status: '',
542
+
543
+ start: '',
544
+
545
+ end: ''
546
+
547
+ }
548
+
549
+ },
550
+
551
+ computed: {
552
+
553
+ doSearch() {
554
+
555
+ let list = this.data
556
+
557
+ const anime = this.anime
558
+
559
+ const status = this.status
560
+
561
+ const start = this.start
562
+
563
+ const end = this.end
564
+
565
+ list = list.filter(function (row) {
566
+
567
+ if (anime) {
568
+
569
+ if (row['anime'] !== anime) {
570
+
571
+ return false
572
+
573
+ }
574
+
575
+ }
576
+
577
+ if (status) {
578
+
579
+ if (row['status'] !== status) {
580
+
581
+ return false
582
+
583
+ }
584
+
585
+ }
586
+
587
+ if (start || end) {
588
+
589
+ const time = moment(row['date']).format("YYYY-MM-DD")
590
+
591
+ if (time < start || time > end) {
592
+
593
+ return false
594
+
595
+ }
596
+
597
+ }
598
+
599
+ return row
600
+
601
+ })
602
+
603
+ return list
604
+
605
+ }
606
+
607
+ },
608
+
609
+ methods: {
610
+
611
+ isSearch() {
612
+
613
+ this.anime = this.formOptions.selectedAnime
614
+
615
+ this.status = this.formOptions.selectedStatus
616
+
617
+ const selectedDate = this.formOptions.selectedDate
618
+
619
+ this.start = moment(selectedDate.start).format("YYYY-MM-DD")
620
+
621
+ this.end = moment(selectedDate.end).format("YYYY-MM-DD")
622
+
623
+ }
624
+
625
+ }
626
+
627
+ }
628
+
629
+ </script>
630
+
631
+
632
+
633
+ <style>
634
+
635
+ /* スタイルは省略 */
636
+
637
+ </style>
638
+
639
+
640
+
641
+ ```

1

追記

2019/03/12 01:21

投稿

sauzar18
sauzar18

スコア163

test CHANGED
@@ -4,6 +4,12 @@
4
4
 
5
5
 
6
6
 
7
+ やってることとしては、jsonをdataに読み込んで、filterで各keyに対応するvalueと選択された値が合わないものを全てfalseにし、配列から除外する。
8
+
9
+ 期間に関しては、データ型を合わせるためにmoment.jsを今回は使ってそろえて大小判定をしてstartより小さくendより大きい値にマッチするものを除外しています。
10
+
11
+
12
+
7
13
  参考例
8
14
 
9
15