回答編集履歴
19
テキスト修正
answer
CHANGED
@@ -105,7 +105,7 @@
|
|
105
105
|
|
106
106
|
- 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
|
107
107
|
|
108
|
-
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、
|
108
|
+
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
|
109
109
|
|
110
110
|
```javascript
|
111
111
|
// optionの選択状態が変更されたときの設定
|
18
テキスト修正
answer
CHANGED
@@ -136,4 +136,16 @@
|
|
136
136
|
|
137
137
|
stackoverflow: [Getting value of select (dropdown) before change](https://stackoverflow.com/questions/4076770/getting-value-of-select-dropdown-before-change)
|
138
138
|
|
139
|
-
上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
|
139
|
+
上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
|
140
|
+
|
141
|
+
---
|
142
|
+
**追記6**
|
143
|
+
|
144
|
+
追記4 に書いたコードの以下の部分
|
145
|
+
```javascript
|
146
|
+
$(this).val($(this).val().filter(v => v!=""));
|
147
|
+
```
|
148
|
+
は、以下のように書くことで少し短くすることができます。
|
149
|
+
```javascript
|
150
|
+
$(this).val($(this).val().filter(v => v));
|
151
|
+
```
|
17
テキスト修正
answer
CHANGED
@@ -101,11 +101,11 @@
|
|
101
101
|
|
102
102
|
ご希望の挙動を満たすには、`change`イベントが発生したときに選択状態にした`<option>`の value配列を保存しておいて、次に新たな`change`イベントが発生したときに選択されている`<option>`の value配列と、保存しておいた前回の`change`イベント発生時に選択状態にした値の配列とを比較して、次の望ましい状態を作ってから、再度、保存しておく処理が必要になると思います。どこに保存しておくかですが、 `data-`属性に保存するというのが一案です。
|
103
103
|
|
104
|
-
判断
|
104
|
+
上記の比較によって判断するべき条件は、
|
105
105
|
|
106
106
|
- 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
|
107
107
|
|
108
|
-
です。以下は上記の
|
108
|
+
です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、初めのご質問でも使った、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
|
109
109
|
|
110
110
|
```javascript
|
111
111
|
// optionの選択状態が変更されたときの設定
|
16
テキスト修正
answer
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
---
|
133
133
|
**追記5**
|
134
134
|
|
135
|
-
「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
135
|
+
「onChangeハンドラの中で、対象のchangeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
136
136
|
|
137
137
|
stackoverflow: [Getting value of select (dropdown) before change](https://stackoverflow.com/questions/4076770/getting-value-of-select-dropdown-before-change)
|
138
138
|
|
15
テキスト修正
answer
CHANGED
@@ -127,4 +127,13 @@
|
|
127
127
|
|
128
128
|
[https://jsfiddle.net/jun68ykt/qw64naub/95/](https://jsfiddle.net/jun68ykt/qw64naub/95/)
|
129
129
|
|
130
|
-
に作成しました。
|
130
|
+
に作成しました。
|
131
|
+
|
132
|
+
---
|
133
|
+
**追記5**
|
134
|
+
|
135
|
+
「changeイベントが発生する前の value を取得するにはどうしたらいいか?」というお題は、以下にも投稿されています。
|
136
|
+
|
137
|
+
stackoverflow: [Getting value of select (dropdown) before change](https://stackoverflow.com/questions/4076770/getting-value-of-select-dropdown-before-change)
|
138
|
+
|
139
|
+
上記の回答の中にも、`change`イベントが発生して選択された値を保存しておく場所として、 `data-`属性を使うというものが、いくつか見つかります。
|
14
テキスト修正
answer
CHANGED
@@ -87,4 +87,44 @@
|
|
87
87
|
|
88
88
|
※以下にサンプルを作成しました。
|
89
89
|
|
90
|
-
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
90
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
91
|
+
|
92
|
+
---
|
93
|
+
**追記4**
|
94
|
+
|
95
|
+
コメントのほうから、
|
96
|
+
|
97
|
+
> 何度もすみません、もし可能でしたら
|
98
|
+
> ・・・
|
99
|
+
|
100
|
+
ということで頂戴した、追加要件を実現する方法です。
|
101
|
+
|
102
|
+
ご希望の挙動を満たすには、`change`イベントが発生したときに選択状態にした`<option>`の value配列を保存しておいて、次に新たな`change`イベントが発生したときに選択されている`<option>`の value配列と、保存しておいた前回の`change`イベント発生時に選択状態にした値の配列とを比較して、次の望ましい状態を作ってから、再度、保存しておく処理が必要になると思います。どこに保存しておくかですが、 `data-`属性に保存するというのが一案です。
|
103
|
+
|
104
|
+
判断して処理を変えなければならないのは、
|
105
|
+
|
106
|
+
- 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
|
107
|
+
|
108
|
+
です。以下は上記の考えを実装したコードです。
|
109
|
+
|
110
|
+
```javascript
|
111
|
+
// optionの選択状態が変更されたときの設定
|
112
|
+
$('select')
|
113
|
+
.data('prev-values', [""])
|
114
|
+
.on('change', function() {
|
115
|
+
if ($(this).val().includes("")) {
|
116
|
+
if (_.isEqual($(this).data('prev-values'), [""])) {
|
117
|
+
$(this).val($(this).val().filter(v => v!=""));
|
118
|
+
} else {
|
119
|
+
$(this).val([""]);
|
120
|
+
}
|
121
|
+
}
|
122
|
+
$(this).data('prev-values', [...$(this).val()]);
|
123
|
+
});
|
124
|
+
```
|
125
|
+
|
126
|
+
上記のサンプルを
|
127
|
+
|
128
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/95/](https://jsfiddle.net/jun68ykt/qw64naub/95/)
|
129
|
+
|
130
|
+
に作成しました。
|
13
テキスト追加
answer
CHANGED
@@ -82,8 +82,9 @@
|
|
82
82
|
```
|
83
83
|
|
84
84
|
上記を追加すると、以下のような効果があります。
|
85
|
-
例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にするとします。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れます。今の場合は、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれていれば(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
|
86
85
|
|
86
|
+
例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にすることを想定します。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れるので、今想定している状況では、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれているということは(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
|
87
|
+
|
87
88
|
※以下にサンプルを作成しました。
|
88
89
|
|
89
90
|
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
12
テキスト追加
answer
CHANGED
@@ -86,4 +86,4 @@
|
|
86
86
|
|
87
87
|
※以下にサンプルを作成しました。
|
88
88
|
|
89
|
-
[https://jsfiddle.net/jun68ykt/qw64naub/
|
89
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)
|
11
テキスト追加
answer
CHANGED
@@ -60,4 +60,30 @@
|
|
60
60
|
---
|
61
61
|
**追記2**
|
62
62
|
|
63
|
-
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
|
63
|
+
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
|
64
|
+
|
65
|
+
---
|
66
|
+
**追記3**
|
67
|
+
|
68
|
+
コメントのほうで頂いた、
|
69
|
+
|
70
|
+
> “指定しない”と他の選択肢を連動させることは可能でしょうか?
|
71
|
+
|
72
|
+
との件ですが、`<select>` の中にある、どの`<option>`が選ばれているかが変化したときの `chage`イベントハンドラに、ご要望の処理を設定することで可能です。
|
73
|
+
|
74
|
+
具体的には例えば以下を追加します。
|
75
|
+
|
76
|
+
```javascript
|
77
|
+
// ”指定しない" が選択されたら、他の選択肢は選ばれていない状態にする
|
78
|
+
$('select').on('change', function() {
|
79
|
+
if ($(this).val().includes(""))
|
80
|
+
$(this).val([""]);
|
81
|
+
});
|
82
|
+
```
|
83
|
+
|
84
|
+
上記を追加すると、以下のような効果があります。
|
85
|
+
例えば、`赤` と`緑`が選ばれている状態で、さらに `選択しない`を選択状態にするとします。すると上記で設定した`change`ハンドラ `function() { … }` が呼ばれて、関数の中で`$(this).val()`とすると、選択された `option` の valueの配列が取れます。今の場合は、`["", "red", "grren"]` と、3つの要素を持ちますが、これらの要素のうち、空文字列 `""` が含まれていれば(= `.includes("")` が true ならば)、「指定しない」が選ばれたことを示しています。その場合は、「指定しない」だけが選ばれていることを表す配列 `[""]` を、`$(this).val(設定値)` に与えると、「指定しない」ではない他の選択肢は選ばれていない状態にすることができます。
|
86
|
+
|
87
|
+
※以下にサンプルを作成しました。
|
88
|
+
|
89
|
+
[https://jsfiddle.net/jun68ykt/qw64naub/79/](https://jsfiddle.net/jun68ykt/qw64naub/79/)
|
10
テキスト修正
answer
CHANGED
@@ -60,4 +60,4 @@
|
|
60
60
|
---
|
61
61
|
**追記2**
|
62
62
|
|
63
|
-
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を
|
63
|
+
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。
|
9
テキスト修正
answer
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
[https://github.com/lodash/lodash/wiki/Deprecations](https://github.com/lodash/lodash/wiki/Deprecations)
|
6
6
|
|
7
|
-
に記載
|
7
|
+
に記載されているように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
|
8
8
|
|
9
9
|
ご質問では
|
10
10
|
|
8
テキスト修正
answer
CHANGED
@@ -23,19 +23,23 @@
|
|
23
23
|
// データの中から一致するオブジェクトを検索
|
24
24
|
var results = _.filter(items, function(item) {
|
25
25
|
return (
|
26
|
-
(query.
|
26
|
+
(query.colors.includes("") || query.colors.includes(item.color)) &&
|
27
|
-
(query.
|
27
|
+
(query.types.includes("") || query.types.includes(item.type))
|
28
28
|
);
|
29
29
|
});
|
30
30
|
```
|
31
31
|
|
32
|
-
`select`が複数選択可能な場合、`
|
32
|
+
- `select`が複数選択可能な場合、`.val()` は選択された `<option>`の value を要素とする配列になります。
|
33
33
|
|
34
|
+
- したがって、`<select>`の id と、 `query` のプロパティ名である`color`と`type`は、`color`**s** および、`type`**s** と複数形にしたほうがよいです。
|
35
|
+
|
36
|
+
- `query.colors` と `query.types` に対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中で条件を満たすものについて `true` を返すような関数を、`filter` の第2引数に渡します。
|
37
|
+
|
34
38
|
以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
|
35
39
|
|
36
40
|
- 単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
|
37
41
|
|
38
|
-
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/
|
42
|
+
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/68/](https://jsfiddle.net/jun68ykt/qw64naub/68/)
|
39
43
|
|
40
44
|
以上参考になれば幸いです。
|
41
45
|
|
@@ -47,8 +51,13 @@
|
|
47
51
|
// データの中から一致するオブジェクトを検索
|
48
52
|
var results = items.filter(function(item) {
|
49
53
|
return (
|
50
|
-
(query.
|
54
|
+
(query.colors.includes("") || query.colors.includes(item.color)) &&
|
51
|
-
(query.
|
55
|
+
(query.types.includes("") || query.types.includes(item.type))
|
52
56
|
);
|
53
57
|
});
|
54
|
-
```
|
58
|
+
```
|
59
|
+
|
60
|
+
---
|
61
|
+
**追記2**
|
62
|
+
|
63
|
+
複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆するため、回答を修正しました。
|
7
テキスト修正
answer
CHANGED
@@ -29,14 +29,14 @@
|
|
29
29
|
});
|
30
30
|
```
|
31
31
|
|
32
|
-
`select`が複数選択可能な場合、`query.color` と `query.type` はともに配列になり
|
32
|
+
`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引数に渡します。
|
33
33
|
|
34
|
-
|
34
|
+
以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
|
35
35
|
|
36
|
-
単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
|
36
|
+
- 単一選択: [https://jsfiddle.net/jun68ykt/qw64naub/28/](https://jsfiddle.net/jun68ykt/qw64naub/28/)
|
37
|
+
|
38
|
+
- 複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
|
37
39
|
|
38
|
-
複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
|
39
|
-
|
40
40
|
以上参考になれば幸いです。
|
41
41
|
|
42
42
|
---
|
6
テキスト修正
answer
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
// データの中から一致するオブジェクトを検索
|
18
18
|
var results = _.filter(items, query);
|
19
19
|
```
|
20
|
-
|
20
|
+
とするところを、以下のように修正すればよいかと思います。
|
21
21
|
|
22
22
|
```javascript
|
23
23
|
// データの中から一致するオブジェクトを検索
|
5
テキスト修正
answer
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
---
|
43
43
|
**追記**
|
44
44
|
|
45
|
-
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使
|
45
|
+
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使って以下のように書けます。この場合は lodashは不要になります。
|
46
46
|
```javascript
|
47
47
|
// データの中から一致するオブジェクトを検索
|
48
48
|
var results = items.filter(function(item) {
|
4
テキスト修正
answer
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
---
|
43
43
|
**追記**
|
44
44
|
|
45
|
-
_.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
45
|
+
さはさりながら、`_.filter` の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
46
46
|
```javascript
|
47
47
|
// データの中から一致するオブジェクトを検索
|
48
48
|
var results = items.filter(function(item) {
|
3
テキスト修正
answer
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
---
|
43
43
|
**追記**
|
44
44
|
|
45
|
-
_.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
45
|
+
_.filter の第2引数に関数を渡すのであれば、そもそも JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
46
46
|
```javascript
|
47
47
|
// データの中から一致するオブジェクトを検索
|
48
48
|
var results = items.filter(function(item) {
|
2
テキスト修正
answer
CHANGED
@@ -37,4 +37,18 @@
|
|
37
37
|
|
38
38
|
複数選択: [https://jsfiddle.net/jun68ykt/qw64naub/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
|
39
39
|
|
40
|
-
以上参考になれば幸いです。
|
40
|
+
以上参考になれば幸いです。
|
41
|
+
|
42
|
+
---
|
43
|
+
**追記**
|
44
|
+
|
45
|
+
_.filter の第2引数に関数を渡すのであれば、JavaScriptの標準の[Array.prototype.filter()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) を使えばよく、その場合は以下です。
|
46
|
+
```javascript
|
47
|
+
// データの中から一致するオブジェクトを検索
|
48
|
+
var results = items.filter(function(item) {
|
49
|
+
return (
|
50
|
+
(query.color.includes("") || query.color.includes(item.color)) &&
|
51
|
+
(query.type.includes("") || query.type.includes(item.type))
|
52
|
+
);
|
53
|
+
});
|
54
|
+
```
|
1
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは。
|
2
2
|
|
3
|
-
まず
|
3
|
+
まず前提として、`lodash` の `where` は以下
|
4
4
|
|
5
5
|
[https://github.com/lodash/lodash/wiki/Deprecations](https://github.com/lodash/lodash/wiki/Deprecations)
|
6
6
|
|