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

回答編集履歴

3

テキスト修正

2019/07/16 14:47

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -127,8 +127,9 @@
127
127
  ```javascript
128
128
  const checkedBoxes = $('input[name="check"]:checked');
129
129
 
130
+ if (checkedBoxes.length >= 3) {
130
- const _tmp = checkedBoxes.toArray().reduce((ary, e) =>
131
+ const _tmp = checkedBoxes.toArray().reduce((ary, e) =>
131
- [...ary, ...e.parentNode.classList], []);
132
+ [...ary, ...e.parentNode.classList], []);
132
133
  ```
133
134
 
134
135
  次に、

2

テキスト修正

2019/07/16 14:47

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -158,7 +158,7 @@
158
158
  $(buttonsSelectorToShow).show()
159
159
  ```
160
160
 
161
- 回答のコードを上げたレポジトリで、[上記の修正](https://github.com/jun68ykt/q200759/commit/f1a798a7290c469d1ca7eecfde931ba7eb8c24cf)をした後のHTMLは以下です。
161
+ 回答のコードを上げたレポジトリで、[上記の修正](https://github.com/jun68ykt/q200759/commit/f1a798a7290c469d1ca7eecfde931ba7eb8c24cf)をした後のHTMLは以下です。(初期表示と、チェックボックスが変更されたとき、いったん全てのボタンを隠すようにしています)
162
162
 
163
163
  ```html
164
164
  <!DOCTYPE html>

1

テキスト修正

2019/07/16 14:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -116,4 +116,138 @@
116
116
 
117
117
  何か意図通りのものになっていない箇所があればコメントからお知らせください。
118
118
 
119
+
120
+
121
+
122
+ ### 補足
123
+
124
+ 上記に挙げたHTMLに含まれるJavaScript のコードを、自分だったらさらにこのように短くしてしていくと思います、という修正案を以下に追記します。
125
+
126
+ まず、 `_tmp` は、こんな風にも作れます。
127
+ ```javascript
128
+ const checkedBoxes = $('input[name="check"]:checked');
129
+
130
+ const _tmp = checkedBoxes.toArray().reduce((ary, e) =>
131
+ [...ary, ...e.parentNode.classList], []);
132
+ ```
133
+
134
+ 次に、
135
+ - `_tmp` に出現する異なる要素をプロパティとし、各々の個数を値とするオブジェクトを作ること
136
+ - このオブジェクトのプロパティと値の組の中で、値が3以上であるもののみを持つオブジェクトを作ること
137
+
138
+ という2つのステップを行うために、[Lodash](https://lodash.com/) という便利なライブラリが提供してくれているメソッドを使います。
139
+
140
+ まず、 `_tmp` に出現する異なる要素をプロパティとし、各々の個数を値とするオブジェクトは以下で得られます。
141
+ ```javascript
142
+ const counts = _.countBy(_tmp);
143
+ ```
144
+ 上記で得られた `counts` の中で個数が3以上のものだけをピックアップしたオブジェクトは以下で得られます。
145
+ ```javascript
146
+ const countsGte3 = _.pickBy(counts, v => v >= 3);
147
+ ```
148
+ - **参考: Lodash document** [_.countBy](https://lodash.com/docs/4.17.14#countBy) , [_.pickBy](https://lodash.com/docs/4.17.14#pickBy)
149
+
150
+ 上記で得られた、 `countsGte3` を使って、 `.show()`を適用する複数のボタンを取得するセレクタを作ります。
151
+
152
+ ```javascript
153
+ const buttonsSelectorToShow = Object.keys(countsGte3).map(x => `.button.${x}`).join(',');
154
+ ```
155
+
156
+ 上記で得られた、 `buttonsSelectorToShow` を使って、以下にて、該当のボタンにまとめて `.show()`を適用できます。
157
+ ```javascript
158
+ $(buttonsSelectorToShow).show()
159
+ ```
160
+
161
+ 回答のコードを上げたレポジトリで、[上記の修正](https://github.com/jun68ykt/q200759/commit/f1a798a7290c469d1ca7eecfde931ba7eb8c24cf)をした後のHTMLは以下です。
162
+
163
+ ```html
164
+ <!DOCTYPE html>
165
+ <html lang="ja">
166
+ <head>
167
+ <meta charset="UTF-8">
168
+ <title>Q200759</title>
169
+ <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
170
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.14/lodash.min.js"></script>
171
+ <script>
172
+ $(function() {
173
+ $('.button').hide();
174
+
175
+ $('input[name="check"]').change(function() {
176
+ $('.button').hide();
177
+
178
+ // チェックされているボックスを取得します。
179
+ const checkedBoxes = $('input[name="check"]:checked');
180
+
181
+ if (checkedBoxes.length >= 3) {
182
+
183
+ // _tmpは、こんな風にも作れます。
184
+ const _tmp = checkedBoxes.toArray().reduce((ary, e) =>
185
+ [...ary, ...e.parentNode.classList], [])
186
+
187
+ // _tmp に出現する異なる要素をプロパティとし、各々の個数を値とするオブジェクトは以下で得られます。
188
+ const counts = _.countBy(_tmp);
189
+
190
+ // counts の中で個数が3以上のものだけをピックアップしたオブジェクトは以下で得られます。
191
+ const countsGte3 = _.pickBy(counts, v => v >= 3);
192
+
193
+ // show()を適用するボタンのセレクタを作成します。
194
+ const buttonsSelectorToShow = Object.keys(countsGte3).map(x => `.button.${x}`).join(',');
195
+
196
+ // 上記のセレクタを使って、show()を適用します。
197
+ $(buttonsSelectorToShow).show()
198
+
199
+ };
200
+ });
201
+ });
202
+ </script>
203
+ <style>
204
+ .button {
205
+ width: 80px;
206
+ height: 80px;
207
+ font-size: 40pt;
208
+ color: white;
209
+ text-align: center;
210
+ float: left;
211
+ margin-right: 10px;
212
+ }
213
+ .button.a { background-color: red; }
214
+ .button.b { background-color: green; }
215
+ .button.c { background-color: blue; }
216
+ .button.d { background-color: orange; }
217
+ ul { list-style: none; }
218
+ li { font-size: 16pt; }
219
+ label { padding-bottom: 5px; }
220
+ input[type=checkbox] { transform: scale(2); vertical-align: middle; }
221
+ </style>
222
+ </head>
223
+ <body>
224
+ <ul>
225
+ <li class="a d e b">
226
+ <input type="checkbox" name="check" id="checkbox1">
227
+ <label for="checkbox1">a d e b</label>
228
+ </li>
229
+ <li class="b c a">
230
+ <input type="checkbox" name="check" id="checkbox2">
231
+ <label for="checkbox2">b c a</label>
232
+ </li>
233
+ <li class="a d e b c">
234
+ <input type="checkbox" name="check" id="checkbox3">
235
+ <label for="checkbox3">a d e b c</label>
236
+ </li>
237
+ <li class="d e b c">
238
+ <input type="checkbox" name="check" id="checkbox4">
239
+ <label for="checkbox4">d e b c</label>
240
+ </li>
241
+ </ul>
242
+ <div class="button a">A</div>
243
+ <div class="button b">B</div>
244
+ <div class="button c">C</div>
245
+ <div class="button d">D</div>
246
+ </body>
247
+ </html>
248
+ ```
249
+ - [github.com/jun68ykt/q200759/index.html](https://github.com/jun68ykt/q200759/blob/master/index.html)
250
+
251
+ ご質問の本題からはだいぶ離れた、応用編になってしまったかもしれませんが、Lodash はちょっとずつでも使い始めてみると、とても役に立つことがあるので、そのご紹介でした。
252
+
119
253
  以上、参考になれば幸いです。