回答編集履歴

6

テキスト修正

2020/05/09 08:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- まず、考え方として、`.checkbox_1` のほうで選ばれている値の配列と、`.checkbox_2` のほうで選ばれている値の配列を、それぞれ集合と考えれば、result2 はこれら2つの集合の[直積集合](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)から作ることができます。そこで、直積集合に相当する配列を得るにはどうしたらよいかと考えると、自分で書くのももちろんよいですが、ライブラリの力を借ります。配列やオブジェクトの操作で便利な [lodash](https://lodash.com/) と、これのプラグイン直積を作ってくれる[lodash.product](https://github.com/SeregPie/lodash.product)を使うと、result2は以下で得られます。
9
+ まず、考え方として、`.checkbox_1` のほうで選ばれている値の配列と、`.checkbox_2` のほうで選ばれている値の配列を、それぞれ集合と考えれば、result2 はこれら2つの集合の[直積集合](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)から作ることができます。そこで、直積集合に相当する配列を得るにはどうしたらよいかと考えると、自分で書くのももちろんよいですが、ライブラリの力を借りるという手もあります。配列やオブジェクトの操作で便利なライブラリ [lodash](https://lodash.com/) と、これのプラグインとして、直積を作ってくれる[lodash.product](https://github.com/SeregPie/lodash.product) を使うと、result2は以下で得られます。
10
10
 
11
11
 
12
12
 

5

テキスト修正

2020/05/09 08:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -276,7 +276,7 @@
276
276
 
277
277
 
278
278
 
279
- - プログラムのほうを、 `div.check-boxes` が何個あっても対応できるように修正し、これが分かるように、3個目の`<div>`を追加nameを仮に `score` としました。さらに同じ構造の`div.check-boxes`を追加していっても、プログラム側は修正不要になっているはずです。
279
+ - プログラムのほうを、 `div.check-boxes` が何個あっても対応できるように修正しています。その確認のため、3個目の`<div>`を追加、data-nameを仮に `score` としました。さらに同じ構造の`div.check-boxes`をいくつ追加していっても、プログラム側は修正不要になっているはずです。
280
280
 
281
281
 
282
282
 

4

テキスト修正

2020/05/09 03:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -268,7 +268,7 @@
268
268
 
269
269
  ```
270
270
 
271
- 上記のコードでは、質問への追記内容に対応した他、以下の修正を入れています。
271
+ 上記のコードでは、質問への追記内容に対応した他、以下の点でも修正ています。
272
272
 
273
273
 
274
274
 

3

テキスト修正

2020/05/08 23:55

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -276,7 +276,7 @@
276
276
 
277
277
 
278
278
 
279
- - プログラムのほうを、 `div.check-boxes` が何個あっても対応できるように修正し、これが分かるように、3個目の`<div>`を追加(nameを仮に `score` としました。さらに同じ構造の `div`を追加しても、プログラム側修正不要になっているはずです。)
279
+ - プログラムのほうを、 `div.check-boxes` が何個あっても対応できるように修正し、これが分かるように、3個目の`<div>`を追加(nameを仮に `score` としました。さらに同じ構造の`div.check-boxes`を追加していっても、プログラム側修正不要になっているはずです。)
280
280
 
281
281
 
282
282
 

2

テキスト修正

2020/05/08 20:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,9 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 考え方として、`.checkbox_1` のほうで選ばれている値の配列と、`.checkbox_2` のほうで選ばれている値の配列を、それぞれ集合と考えれば、result2 はこれら2つの集合の[直積集合](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)から作ることができます。
10
-
11
- 次に、直積集合に相当する配列を得るにはどうしたらよいかと考えると、自分で書くのももちろんよいですが、ライブラリの力を借ります。配列やオブジェクトの操作で便利な [lodash](https://lodash.com/) と、これのプラグインで直積を作ってくれる[lodash.product](https://github.com/SeregPie/lodash.product)というのがあるのでお借りしますと、result2は以下で得られます。
9
+ まず、考え方として、`.checkbox_1` のほうで選ばれている値の配列と、`.checkbox_2` のほうで選ばれている値の配列を、それぞれ集合と考えれば、result2 はこれら2つの集合の[直積集合](https://ja.wikipedia.org/wiki/%E7%9B%B4%E7%A9%8D%E9%9B%86%E5%90%88)から作ることができます。そこで、直積集合に相当する配列を得るにはどうしたらよいかと考えると、自分で書くのももちろんよいですが、ライブラリの力を借ります。配列やオブジェクトの操作で便利な [lodash](https://lodash.com/) と、これのプラグインで直積を作ってくれる[lodash.product](https://github.com/SeregPie/lodash.product)を使うと、result2は以下で得られます。
12
10
 
13
11
 
14
12
 

1

テキスト追加

2020/05/08 20:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -135,3 +135,157 @@
135
135
 
136
136
 
137
137
  以上、参考になれば幸いです。
138
+
139
+
140
+
141
+ ### 補足:追記への対応
142
+
143
+
144
+
145
+ ご質問に追記された内容に対応したコードの一例を挙げます。
146
+
147
+
148
+
149
+ ```html
150
+
151
+ <!DOCTYPE html>
152
+
153
+ <html lang="ja">
154
+
155
+ <head>
156
+
157
+ <meta charset="UTF-8">
158
+
159
+ <title>Q259669</title>
160
+
161
+ <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
162
+
163
+ <script src="https://unpkg.com/lodash"></script>
164
+
165
+ <script src="https://unpkg.com/lodash.product"></script>
166
+
167
+ <script>
168
+
169
+ $(function() {
170
+
171
+ $('button').on('click', function() {
172
+
173
+
174
+
175
+ const checkedValues = $('.check-boxes').map(function() {
176
+
177
+ const values = $(this).find(':checked').get().map(e => +e.value);
178
+
179
+ return { name: $(this).data('name'), values: values.length ? values : [0] };
180
+
181
+ }).get();
182
+
183
+
184
+
185
+ const names = checkedValues.map(({ name }) => name);
186
+
187
+ const product = _.product(...checkedValues.map(({ values }) => values));
188
+
189
+ const result = product.map(values => Object.fromEntries(_.zip(names, values)));
190
+
191
+
192
+
193
+ // resultをJSONにして hr の下に表示する。
194
+
195
+ $('#result').text(JSON.stringify(result, null , "\t"));
196
+
197
+ });
198
+
199
+ });
200
+
201
+ </script>
202
+
203
+ </head>
204
+
205
+ <body>
206
+
207
+
208
+
209
+ <h3>size要素</h3>
210
+
211
+ <div class="check-boxes" data-name="size">
212
+
213
+ <label><input type="checkbox" value="1100">1100</label>
214
+
215
+ <label><input type="checkbox" value="1200">1200</label>
216
+
217
+ <label><input type="checkbox" value="1300">1300</label>
218
+
219
+ <label><input type="checkbox" value="1400">1400</label>
220
+
221
+ </div>
222
+
223
+
224
+
225
+ <h3>use要素</h3>
226
+
227
+ <div class="check-boxes" data-name="use">
228
+
229
+ <label><input type="checkbox" value="11">11</label>
230
+
231
+ <label><input type="checkbox" value="12">12</label>
232
+
233
+ <label><input type="checkbox" value="13">13</label>
234
+
235
+ </div>
236
+
237
+
238
+
239
+ <h3>score要素</h3>
240
+
241
+ <div class="check-boxes" data-name="score">
242
+
243
+ <label><input type="checkbox" value="91">91</label>
244
+
245
+ <label><input type="checkbox" value="92">92</label>
246
+
247
+ <label><input type="checkbox" value="93">93</label>
248
+
249
+ <label><input type="checkbox" value="94">94</label>
250
+
251
+ <label><input type="checkbox" value="95">95</label>
252
+
253
+ </div>
254
+
255
+
256
+
257
+ <button type="button" style="margin: 50px;">検索</button>
258
+
259
+
260
+
261
+ <hr />
262
+
263
+ <pre id="result"/>
264
+
265
+
266
+
267
+ </body>
268
+
269
+ </html>
270
+
271
+ ```
272
+
273
+ 上記のコードでは、質問への追記内容に対応した他、以下の修正を入れています。
274
+
275
+
276
+
277
+ - `<form>` を `<div>` にして、チェックボックスを囲むdivであることを示すclassを `check-boxes` とし、かつ、 `data-name` 属性にこのdivが含むチェックボックスの値の(`size` だったり `use`だったりの)名前を入れておく。
278
+
279
+
280
+
281
+ - プログラムのほうを、 `div.check-boxes` が何個あっても対応できるように修正し、これが分かるように、3個目の`<div>`を追加(nameを仮に `score` としました。さらに同じ構造の `div`を追加しても、プログラム側が修正不要になっているはずです。)
282
+
283
+
284
+
285
+ - 各チェックボックスの (`checkbox_1` などの) class は、プログラム側からは不要になったので、いったん削除
286
+
287
+
288
+
289
+
290
+
291
+ 上記に挙げた回答コードは(補足のほうも含め)、もしかすると、uwanosoraさんが作ろうとしているものの要件に対して、オーバースペック気味のものになっているかもしれませんので、あくまで参考に留めて頂ければ幸いです。