回答編集履歴

19

テキスト修正

2018/09/01 00:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -212,7 +212,7 @@
212
212
 
213
213
 
214
214
 
215
- です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、初めのご質問でも使った、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
215
+ です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
216
216
 
217
217
 
218
218
 

18

テキスト修正

2018/09/01 00:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -275,3 +275,27 @@
275
275
 
276
276
 
277
277
  上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
278
+
279
+
280
+
281
+ ---
282
+
283
+ **追記6**
284
+
285
+
286
+
287
+ 追記4 に書いたコードの以下の部分
288
+
289
+ ```javascript
290
+
291
+ $(this).val($(this).val().filter(v => v!=""));
292
+
293
+ ```
294
+
295
+ は、以下のように書くことで少し短くすることができます。
296
+
297
+ ```javascript
298
+
299
+ $(this).val($(this).val().filter(v => v));
300
+
301
+ ```

17

テキスト修正

2018/08/31 23:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -204,7 +204,7 @@
204
204
 
205
205
 
206
206
 
207
- 判断して処理を変えなければならないのは、
207
+ 上記の比較によって判断するべき条件は、
208
208
 
209
209
 
210
210
 
@@ -212,7 +212,7 @@
212
212
 
213
213
 
214
214
 
215
- です。以下は上記の考えを実装コードです。
215
+ です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のめに、初めのご質問も使った、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
216
216
 
217
217
 
218
218
 

16

テキスト修正

2018/08/31 23:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -266,7 +266,7 @@
266
266
 
267
267
 
268
268
 
269
- 「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
269
+ onChangeハンドラの中で、対象のchangeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
270
270
 
271
271
 
272
272
 

15

テキスト修正

2018/08/31 16:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -257,3 +257,21 @@
257
257
 
258
258
 
259
259
  に作成しました。
260
+
261
+
262
+
263
+ ---
264
+
265
+ **追記5**
266
+
267
+
268
+
269
+ 「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
270
+
271
+
272
+
273
+ stackoverflow: [Getting value of select (dropdown) before change](https://stackoverflow.com/questions/4076770/getting-value-of-select-dropdown-before-change)
274
+
275
+
276
+
277
+ 上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。

14

テキスト修正

2018/08/31 16:32

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -177,3 +177,83 @@
177
177
 
178
178
 
179
179
  [https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
180
+
181
+
182
+
183
+ ---
184
+
185
+ **追記4**
186
+
187
+
188
+
189
+ コメントのほうから、
190
+
191
+
192
+
193
+ > 何度もすみません、もし可能でしたら
194
+
195
+ > ・・・
196
+
197
+
198
+
199
+ ということで頂戴した、追加要件を実現する方法です。
200
+
201
+
202
+
203
+ ご希望の挙動を満たすには、`change`イベントが発生したときに選択状態にした`<option>`の value配列を保存しておいて、次に新たな`change`イベントが発生したときに選択されている`<option>`の value配列と、保存しておいた前回の`change`イベント発生時に選択状態にした値の配列とを比較して、次の望ましい状態を作ってから、再度、保存しておく処理が必要になると思います。どこに保存しておくかですが、 `data-`属性に保存するというのが一案です。
204
+
205
+
206
+
207
+ 判断して処理を変えなければならないのは、
208
+
209
+
210
+
211
+ - 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
212
+
213
+
214
+
215
+ です。以下は上記の考えを実装したコードです。
216
+
217
+
218
+
219
+ ```javascript
220
+
221
+ // optionの選択状態が変更されたときの設定
222
+
223
+ $('select')
224
+
225
+ .data('prev-values', [""])
226
+
227
+ .on('change', function() {
228
+
229
+ if ($(this).val().includes("")) {
230
+
231
+ if (_.isEqual($(this).data('prev-values'), [""])) {
232
+
233
+ $(this).val($(this).val().filter(v => v!=""));
234
+
235
+ } else {
236
+
237
+ $(this).val([""]);
238
+
239
+ }
240
+
241
+ }
242
+
243
+ $(this).data('prev-values', [...$(this).val()]);
244
+
245
+ });
246
+
247
+ ```
248
+
249
+
250
+
251
+ 上記のサンプルを
252
+
253
+
254
+
255
+ [https://jsfiddle.net/jun68ykt/qw64naub/95/](https://jsfiddle.net/jun68ykt/qw64naub/95/)
256
+
257
+
258
+
259
+ に作成しました。

13

テキスト追加

2018/08/31 14:53

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -166,7 +166,9 @@
166
166
 
167
167
  上記を追加すると、以下のような効果があります。
168
168
 
169
- 例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にするとします。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れます。今の場合は、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれていれば(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
169
+
170
+
171
+ 例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にすることを想定します。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れるので、今想定している状況では、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれているということは(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
170
172
 
171
173
 
172
174
 

12

テキスト追加

2018/08/30 08:27

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -174,4 +174,4 @@
174
174
 
175
175
 
176
176
 
177
- [https://jsfiddle.net/jun68ykt/qw64naub/79/](https://jsfiddle.net/jun68ykt/qw64naub/79/)
177
+ [https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)

11

テキスト追加

2018/08/30 08:09

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -123,3 +123,55 @@
123
123
 
124
124
 
125
125
  複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
126
+
127
+
128
+
129
+ ---
130
+
131
+ **追記3**
132
+
133
+
134
+
135
+ コメントのほうで頂いた、
136
+
137
+
138
+
139
+ > “指定しない”と他の選択肢を連動させることは可能でしょうか?
140
+
141
+
142
+
143
+ との件ですが、`<select>` の中にある、どの`<option>`が選ばれているかが変化したときの `chage`イベントハンドラに、ご要望の処理を設定することで可能です。
144
+
145
+
146
+
147
+ 具体的には例えば以下を追加します。
148
+
149
+
150
+
151
+ ```javascript
152
+
153
+ // ”指定しない" が選択されたら、他の選択肢は選ばれていない状態にする
154
+
155
+ $('select').on('change', function() {
156
+
157
+ if ($(this).val().includes(""))
158
+
159
+ $(this).val([""]);
160
+
161
+ });
162
+
163
+ ```
164
+
165
+
166
+
167
+ 上記を追加すると、以下のような効果があります。
168
+
169
+ 例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にするとします。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れます。今の場合は、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれていれば(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
170
+
171
+
172
+
173
+ ※以下にサンプルを作成しました。
174
+
175
+
176
+
177
+ [https://jsfiddle.net/jun68ykt/qw64naub/79/](https://jsfiddle.net/jun68ykt/qw64naub/79/)

10

テキスト修正

2018/08/30 08:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -122,4 +122,4 @@
122
122
 
123
123
 
124
124
 
125
- 複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆するため、回答を修正しました。
125
+ 複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。

9

テキスト修正

2018/08/29 00:13

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- に記載ように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
13
+ に記載されているように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
14
14
 
15
15
 
16
16
 

8

テキスト修正

2018/08/28 23:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -48,9 +48,9 @@
48
48
 
49
49
  return (
50
50
 
51
- (query.color.includes("") || query.color.includes(item.color)) &&
51
+ (query.colors.includes("") || query.colors.includes(item.color)) &&
52
52
 
53
- (query.type.includes("") || query.type.includes(item.type))
53
+ (query.types.includes("") || query.types.includes(item.type))
54
54
 
55
55
  );
56
56
 
@@ -60,7 +60,15 @@
60
60
 
61
61
 
62
62
 
63
- `select`が複数選択可能な場合、`query.color` と `query.type` ともに、選択された `<option>` `value`属性を要素とする配列になります。これに対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数に渡します。
63
+ - `select`が複数選択可能な場合、`.val()` は選択された `<option>`の value を要素とする配列になります。
64
+
65
+
66
+
67
+ - したがって、`<select>`の id と、 `query` のプロパティ名である`color`と`type`は、`color`**s** および、`type`**s** と複数形にしたほうがよいです。
68
+
69
+
70
+
71
+ - `query.colors` と `query.types` に対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数に渡します。
64
72
 
65
73
 
66
74
 
@@ -72,7 +80,7 @@
72
80
 
73
81
     
74
82
 
75
- - 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
83
+ - 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/68/](https://jsfiddle.net/jun68ykt/qw64naub/68/)
76
84
 
77
85
 
78
86
 
@@ -96,12 +104,22 @@
96
104
 
97
105
  return (
98
106
 
99
- (query.color.includes("") || query.color.includes(item.color)) &&
107
+ (query.colors.includes("") || query.colors.includes(item.color)) &&
100
108
 
101
- (query.type.includes("") || query.type.includes(item.type))
109
+ (query.types.includes("") || query.types.includes(item.type))
102
110
 
103
111
  );
104
112
 
105
113
  });
106
114
 
107
115
  ```
116
+
117
+
118
+
119
+ ---
120
+
121
+ **追記2**
122
+
123
+
124
+
125
+ 複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆するため、回答を修正しました。

7

テキスト修正

2018/08/28 23:19

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -60,19 +60,19 @@
60
60
 
61
61
 
62
62
 
63
- `select`が複数選択可能な場合、`query.color` と `query.type` はともに配列になりこれに対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中でqueryにマッチものについて `true` を return するようにしています。
63
+ `select`が複数選択可能な場合、`query.color` と `query.type` はともに、選択された `<option>` の `value`属性を要素とする配列になります。これに対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数します。
64
64
 
65
65
 
66
66
 
67
- なお、以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
67
+ 以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
68
68
 
69
69
 
70
70
 
71
- 単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
71
+ - 単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
72
72
 
73
+    
73
74
 
74
-
75
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
75
+ - 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
76
76
 
77
77
 
78
78
 

6

テキスト修正

2018/08/28 23:01

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ```
38
38
 
39
- であを、以下のように修正すればよいかと思います。
39
+ とすところを、以下のように修正すればよいかと思います。
40
40
 
41
41
 
42
42
 

5

テキスト修正

2018/08/28 22:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばく、その場合は以下です。
89
+ さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使って以下のうに書けます。この場合は lodashは不要になります。
90
90
 
91
91
  ```javascript
92
92
 

4

テキスト修正

2018/08/28 12:57

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- _.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
89
+ さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
90
90
 
91
91
  ```javascript
92
92
 

3

テキスト修正

2018/08/28 12:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -86,7 +86,7 @@
86
86
 
87
87
 
88
88
 
89
- _.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
89
+ _.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
90
90
 
91
91
  ```javascript
92
92
 

2

テキスト修正

2018/08/28 12:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -77,3 +77,31 @@
77
77
 
78
78
 
79
79
  以上参考になれば幸いです。
80
+
81
+
82
+
83
+ ---
84
+
85
+ **追記**
86
+
87
+
88
+
89
+ _.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
90
+
91
+ ```javascript
92
+
93
+ // データの中から一致するオブジェクトを検索
94
+
95
+ var results = items.filter(function(item) {
96
+
97
+ return (
98
+
99
+ (query.color.includes("") || query.color.includes(item.color)) &&
100
+
101
+ (query.type.includes("") || query.type.includes(item.type))
102
+
103
+ );
104
+
105
+ });
106
+
107
+ ```

1

テキスト修正

2018/08/28 12:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- まず、以下の回答の前提として、`lodash` の `where` は以下
5
+ まず前提として、`lodash` の `where` は以下
6
6
 
7
7
 
8
8