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

回答編集履歴

19

テキスト修正

2018/09/01 00:19

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -105,7 +105,7 @@
105
105
 
106
106
  - 前回の`change`イベント発生時に、最終的に選択状態にした値の配列が、`[""]`であるか否か
107
107
 
108
- です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、初めのご質問でも使った、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
108
+ です。以下は上記の実装例です。前回の選択値が`[""]`であるかどうかの判定のために、 lodash の [isEqual](https://lodash.com/docs/4.17.10#isEqual) を使用しています。
109
109
 
110
110
  ```javascript
111
111
  // optionの選択状態が変更されたときの設定

18

テキスト修正

2018/09/01 00:19

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/31 23:22

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/31 23:14

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/31 16:49

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/31 16:32

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト追加

2018/08/31 14:53

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト追加

2018/08/30 08:27

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -86,4 +86,4 @@
86
86
 
87
87
  ※以下にサンプルを作成しました。
88
88
 
89
- [https://jsfiddle.net/jun68ykt/qw64naub/79/](https://jsfiddle.net/jun68ykt/qw64naub/79/)
89
+ [https://jsfiddle.net/jun68ykt/qw64naub/81/](https://jsfiddle.net/jun68ykt/qw64naub/81/)

11

テキスト追加

2018/08/30 08:09

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/30 08:01

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -60,4 +60,4 @@
60
60
  ---
61
61
  **追記2**
62
62
 
63
- 複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を加筆するため、回答を修正しました。
63
+ 複数選択可能な場合、color**s**およびtype**s**と、複数形にしたほうがよい点を回答に加筆しました。

9

テキスト修正

2018/08/29 00:13

投稿

jun68ykt
jun68ykt

スコア9058

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
- に記載ように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
7
+ に記載されているように、 v4 から削除されており、替わりに [filter](https://lodash.com/docs/4.17.10#filter) を使うことになっていますので、以下の回答もこれに従っています。
8
8
 
9
9
  ご質問では
10
10
 

8

テキスト修正

2018/08/28 23:34

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -23,19 +23,23 @@
23
23
  // データの中から一致するオブジェクトを検索
24
24
  var results = _.filter(items, function(item) {
25
25
  return (
26
- (query.color.includes("") || query.color.includes(item.color)) &&
26
+ (query.colors.includes("") || query.colors.includes(item.color)) &&
27
- (query.type.includes("") || query.type.includes(item.type))
27
+ (query.types.includes("") || query.types.includes(item.type))
28
28
  );
29
29
  });
30
30
  ```
31
31
 
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引数に渡します。
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/60/](https://jsfiddle.net/jun68ykt/qw64naub/60/)
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.color.includes("") || query.color.includes(item.color)) &&
54
+ (query.colors.includes("") || query.colors.includes(item.color)) &&
51
- (query.type.includes("") || query.type.includes(item.type))
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

テキスト修正

2018/08/28 23:19

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -29,14 +29,14 @@
29
29
  });
30
30
  ```
31
31
 
32
- `select`が複数選択可能な場合、`query.color` と `query.type` はともに配列になりこれに対して、[includes](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/includes) を使って、全item の中でqueryにマッチものについて `true` を return ようにしています。
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
- なお、以下に上記のサンプルを作成しました。(使用している lodash のバージョンは、4.17.10です)
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

テキスト修正

2018/08/28 23:01

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/28 22:36

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/28 12:57

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/28 12:16

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/28 12:02

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2018/08/28 12:02

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  こんにちは。
2
2
 
3
- まず、以下の回答の前提として、`lodash` の `where` は以下
3
+ まず前提として、`lodash` の `where` は以下
4
4
 
5
5
  [https://github.com/lodash/lodash/wiki/Deprecations](https://github.com/lodash/lodash/wiki/Deprecations)
6
6