teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

ご教示いただいた箇所を反映。より表題に近い内容に変更しました。

2021/02/10 09:55

投稿

nakamu-
nakamu-

スコア3

title CHANGED
File without changes
body CHANGED
@@ -1,25 +1,29 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  下記のような連想配列を使って分岐・連動するセレクトボックスを作りたいと思っております。
4
- 配列をわけて、「1が選択された時は2の配列をセレクトボックスにいれてね」ということは、出来ましたが、
5
- これを同配列内で行う方法を教えていただきたいです。
6
4
 
7
-
8
5
  ■一つ前の選んだ項目で絞ったセレクトボックスを追加したい
9
6
  例えば、りんごが選択された時に、次のセレクトボックスの中身は「りんご」の中のplace一覧が表示され、
10
- その次のセレクトボックスが「りんご」-「place(例えば青森県産)」に紐づくpriceを表示させるというものです。
7
+ その次のセレクトボックスが「りんご」-「place(例えば青森県産)」に紐づくset - toyを表示させるイメージです。
11
8
 
9
+ 商品の情報は紐付けしておきたいので、(例えば 「りんご - 青森産 - 2パックセット - おもちゃつき」 など)
10
+ セレクトボックスが5個くらいになった時に連想配列の階層がとんでもなく深くなってしまうのですが、
11
+ 情報が多い場合この配列の書き方・使い方であっているのでしょうか??
12
+ 別なやりかたの方が実装・運用が簡単という方法があればご教示時ください。
12
13
 
13
- ■セレクトボックス内で重複している項目は除外したい
14
- 使用したい配列ですと、中身をセレクトボックスに入れた場合「りんご りんご りんご りんご バナナ バナナ バナナ」
15
- というようになってしまうので「りんご バナナ」というようにしたい
16
14
 
15
+ 2つ目までは連動できるのですが、どうしても3つ目以上ができません。
16
+ 3つ目以降を上の階層に紐づくセレクトボックスの作り方をご教示いただければと思います。
17
17
 
18
18
 
19
+
20
+
19
21
  ```html
20
22
  <select id="selName" onchange="selParts(this);"></select>
21
- <select id="selPlace"></select>
23
+ <select id="sel2"></select>
22
- <select id="selPrice"></select>
24
+ <select id="sel3"></select>
25
+ <select id="sel4"></select>
26
+ <select id="sel5"></select>
23
27
  ```
24
28
 
25
29
  現状の配列
@@ -27,105 +31,109 @@
27
31
  let data = [{
28
32
  cd: "1",
29
33
  name: "りんご",
34
+ place:[
35
+ {cd: "1",place: "青森県産",
36
+ set:[{cd:1,set:"2パックセット",
37
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
38
+ {cd:1,toy:"梨のおもちゃ",},]
39
+ },
40
+ {cd:1,set:"3パックセット",
41
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
42
+ {cd:1,toy:"梨のおもちゃ",},]
43
+ },
44
+ ]
45
+ },
46
+ {cd: "2",place: "長野県産",
47
+ set:[{cd:1,set:"特別セット",
48
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
49
+ {cd:2,toy:"梨のおもちゃ",},]
50
+ },
51
+ {cd:2,set:"激安セット",
52
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
53
+ {cd:2,toy:"梨のおもちゃ",},]
54
+ },
55
+ ]},
56
+ {cd: "3",place: "山形産",
57
+ set:[{cd:1,set:"2パック特別セット",
58
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
59
+ {cd:2,toy:"梨のおもちゃ",},]
60
+ },
61
+ {cd:1,set:"3パック激安セット",
62
+ toy:[{cd:1,toy:"りんごのおもちゃ",},
63
+ {cd:2,toy:"梨のおもちゃ",},]
64
+ },
65
+ ]},
66
+ ],
30
67
  },
31
68
  {
32
69
  cd: "2",
33
70
  name: "バナナ",
71
+ place:[
72
+ {cd: "1",place: "国産",
73
+ set:[{cd:1,set:"2パックセット",
74
+ toy:[{cd:1,toy:"バナナのおもちゃ",},
75
+ {cd:1,toy:"おもちゃなし",},]
76
+ },
77
+ {cd:1,set:"3パックセット",
78
+ toy:[{cd:1,toy:"パイナップルのおもちゃ",},
79
+ {cd:1,toy:"ハンカチ",},]
80
+ },
81
+ ]
82
+ },
83
+ {cd: "2",place: "インドネシア産",
84
+ set:[{cd:1,set:"特別セット",
85
+ toy:[{cd:1,toy:"タオル",},
86
+ {cd:2,toy:"ペン",},]
87
+ },
88
+ {cd:2,set:"激安セット",
89
+ toy:[{cd:1,toy:"シール",},
90
+ {cd:2,toy:"なし",},]
91
+ },
92
+ ]},
93
+ {cd: "3",place: "フィリピン産",
94
+ set:[{cd:1,set:"2パック特別セット",
95
+ toy:[{cd:1,toy:"シール",},
96
+ {cd:2,toy:"フィリピンのおもちゃ",},]
97
+ },
98
+ {cd:1,set:"3パック激安セット",
99
+ toy:[{cd:1,toy:"タオル",},
100
+ {cd:2,toy:"シール",},]
101
+ },
102
+ ]},
103
+ ],
34
104
  },
35
105
  ]
36
-
37
- let ApplePlace = [{
38
- cd: "1",
39
- place: "青森県産",
40
- },
41
- {
42
- cd: "2",
43
- place: "長野県産",
44
- },
45
- {
46
- cd: "3",
47
- place: "山形産",
48
- }
49
- ]
50
-
51
- let BananaPlace = [{
52
- cd: "1",
53
- place: "国産",
54
- },
55
- {
56
- cd: "2",
57
- place: "インドネシア産",
58
- },
59
- {
60
- cd: "3",
61
- place: "フィリピン産",
62
- }
63
- ]
64
106
  ```
65
107
 
66
108
  javascriptコード
67
109
  ```javascript
68
110
  for (var i = 0; i < data.length; i++) {
111
+ let op = document.createElement("option");
112
+ op.value = data[i].cd;
113
+ op.appendChild(document.createTextNode(data[i].name));
114
+ document.getElementById("selName").appendChild(op);
115
+ }
116
+
117
+
118
+
119
+ function selParts(obj) {
120
+ var targetArr;
121
+ if (obj.value == "1") {
122
+ targetArr = data[0].place;
123
+ } else if (obj.value == "2") {
124
+ targetArr = data[1].place;;
125
+ } else {
126
+ targetArr = new Array();
127
+ }
128
+ var selObj = document.getElementById('sel2');
129
+ while (selObj.lastChild) {
130
+ selObj.removeChild(selObj.lastChild);
131
+ }
132
+ for (var i = 0; i < targetArr.length; i++) {
69
133
  let op = document.createElement("option");
70
- op.value = data[i].name;
134
+ op.value = targetArr[i].place;
71
- op.appendChild(document.createTextNode(data[i].name));
135
+ op.text = targetArr[i].place;
72
- document.getElementById("selName").appendChild(op);
136
+ selObj.appendChild(op);
73
137
  }
74
-
75
- function selParts(obj) {
76
- var targetArr;
77
- if (obj.value == "りんご") {
78
- targetArr = ApplePlace;
79
- } else if (obj.value == "バナナ") {
80
- targetArr = BananaPlace;
81
- } else {
82
- targetArr = new Array();
83
- }
138
+ }
84
- var selObj = document.getElementById('selPlace');
85
- while (selObj.lastChild) {
86
- selObj.removeChild(selObj.lastChild);
87
- }
88
- for (var i = 0; i < targetArr.length; i++) {
89
- let op = document.createElement("option");
90
- op.value = targetArr[i].cd;
91
- op.text = targetArr[i].place;
92
- selObj.appendChild(op);
93
- }
94
- }
95
- ```
96
-
97
-
98
- 下記の配列を使いたい
99
- ```javascript
100
- let data = [{
101
- name: "りんご",
102
- place: "青森県産",
103
- price: 100
104
- },
105
- {
106
- name: "りんご",
107
- place: "青森県産",
108
- price: 200
109
- },
110
- {
111
- name: "りんご",
112
- place: "長野県産",
113
- price: 100
114
- },
115
- {
116
- name: "バナナ",
117
- place: "国産",
118
- price: 100
119
- },
120
- {
121
- name: "バナナ",
122
- place: "国産",
123
- price: 200
124
- },
125
- {
126
- name: "バナナ",
127
- place: "外国産",
128
- price: 100
129
- }
130
- ]
131
139
  ```