こんにちは
自分ならこうやるかなと思ったコードを挙げておきます。
まず、考え方として、.checkbox_1
のほうで選ばれている値の配列と、.checkbox_2
のほうで選ばれている値の配列を、それぞれ集合と考えれば、result2 はこれら2つの集合の直積集合から作ることができます。そこで、直積集合に相当する配列を得るにはどうしたらよいかと考えると、自分で書くのももちろんよいですが、ライブラリの力を借りるという手もあります。配列やオブジェクトの操作で便利なライブラリ lodash と、これのプラグインとして、直積を作ってくれるlodash.product を使うと、result2は以下で得られます。
javascript
1$('[type=checkbox]').on('change', function() {
2 const checkedValues = [1, 2].map(i => $(`.checkbox_${i}:checked`).get().map(e => +e.value));
3 const result2 = _.product(...checkedValues).map(([size, use]) => ({ size, use }));
4});
以下は、上記の動作確認用のHTMLです。<hr />
の下に result2をJSONにして表示します。
html
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4 <meta charset="UTF-8">
5 <title>Q259669</title>
6 <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
7 <script src="https://unpkg.com/lodash"></script>
8 <script src="https://unpkg.com/lodash.product"></script>
9 <script>
10 $(function() {
11 $('[type=checkbox]').on('change', function() {
12 const checkedValues = [1, 2].map(i => $(`.checkbox_${i}:checked`).get().map(e => +e.value));
13 const result2 = _.product(...checkedValues).map(([size, use]) => ({ size, use }));
14
15 // result2をJSONにして hr の下に表示する。
16 $('#result2').text(JSON.stringify(result2, null , " "));
17 });
18 });
19 </script>
20</head>
21<body>
22
23//size要素
24<form>
25 <label>
26 <input type="checkbox" class="checkbox_1" value="1100">1100</label>
27 <label>
28 <input type="checkbox" class="checkbox_1" value="1200">1200</label>
29 <label>
30 <input type="checkbox" class="checkbox_1" value="1300">1300</label>
31 <label>
32 <input type="checkbox" class="checkbox_1" value="1400">1400</label>
33</form>
34
35//use要素
36<form>
37 <label>
38 <input type="checkbox" class="checkbox_2" value="11">11</label>
39 <label>
40 <input type="checkbox" class="checkbox_2" value="12">12</label>
41 <label>
42 <input type="checkbox" class="checkbox_2" value="13">13</label>
43</form>
44
45<hr />
46<pre id="result2"/>
47
48</body>
49</html>
以上、参考になれば幸いです。
補足:追記への対応
ご質問に追記された内容に対応したコードの一例を挙げます。
html
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4 <meta charset="UTF-8">
5 <title>Q259669</title>
6 <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
7 <script src="https://unpkg.com/lodash"></script>
8 <script src="https://unpkg.com/lodash.product"></script>
9 <script>
10 $(function() {
11 $('button').on('click', function() {
12
13 const checkedValues = $('.check-boxes').map(function() {
14 const values = $(this).find(':checked').get().map(e => +e.value);
15 return { name: $(this).data('name'), values: values.length ? values : [0] };
16 }).get();
17
18 const names = checkedValues.map(({ name }) => name);
19 const product = _.product(...checkedValues.map(({ values }) => values));
20 const result = product.map(values => Object.fromEntries(_.zip(names, values)));
21
22 // resultをJSONにして hr の下に表示する。
23 $('#result').text(JSON.stringify(result, null , "\t"));
24 });
25 });
26 </script>
27</head>
28<body>
29
30<h3>size要素</h3>
31<div class="check-boxes" data-name="size">
32 <label><input type="checkbox" value="1100">1100</label>
33 <label><input type="checkbox" value="1200">1200</label>
34 <label><input type="checkbox" value="1300">1300</label>
35 <label><input type="checkbox" value="1400">1400</label>
36</div>
37
38<h3>use要素</h3>
39<div class="check-boxes" data-name="use">
40 <label><input type="checkbox" value="11">11</label>
41 <label><input type="checkbox" value="12">12</label>
42 <label><input type="checkbox" value="13">13</label>
43</div>
44
45<h3>score要素</h3>
46<div class="check-boxes" data-name="score">
47 <label><input type="checkbox" value="91">91</label>
48 <label><input type="checkbox" value="92">92</label>
49 <label><input type="checkbox" value="93">93</label>
50 <label><input type="checkbox" value="94">94</label>
51 <label><input type="checkbox" value="95">95</label>
52</div>
53
54<button type="button" style="margin: 50px;">検索</button>
55
56<hr />
57<pre id="result"/>
58
59</body>
60</html>
上記のコードでは、質問への追記内容に対応した他、以下の点でも修正しています。
-
<form>
を <div>
にして、チェックボックスを囲むdivであることを示すclassを check-boxes
とし、かつ、 data-name
属性にこのdivが含むチェックボックスの値の(size
だったり use
だったりの)名前を入れておく。
-
プログラムのほうを、 div.check-boxes
が何個あっても対応できるように修正しています。その確認のため、3個目の<div>
を追加、data-nameを仮に score
としました。さらに同じ構造のdiv.check-boxes
をいくつ追加していっても、プログラム側は修正不要になっているはずです。
-
各チェックボックスの (checkbox_1
などの) class は、プログラム側からは不要になったので、いったん削除
上記に挙げた回答コードは(補足のほうも含め)、もしかすると、uwanosoraさんが作ろうとしているものの要件に対して、オーバースペック気味のものになっているかもしれませんので、あくまで参考に留めて頂ければ幸いです。