回答編集履歴
3
テキスト修正
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
|
-
|
132
|
+
[...ary, ...e.parentNode.classList], []);
|
132
133
|
```
|
133
134
|
|
134
135
|
次に、
|
2
テキスト修正
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
テキスト修正
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
|
以上、参考になれば幸いです。
|