回答編集履歴

7

テキスト修正

2020/01/16 15:24

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  const menu = two[name];
26
26
 
27
- Object.values(menu).some(function(state){ // forEach を some に修正
27
+ Object.values(menu).some(function(state){ // 修正点① forEach を some に修正
28
28
 
29
29
  if(state===true){
30
30
 
@@ -32,7 +32,7 @@
32
32
 
33
33
  }
34
34
 
35
- return state // この行を追加
35
+ return state // 修正点② この行を追加
36
36
 
37
37
  });
38
38
 
@@ -44,7 +44,7 @@
44
44
 
45
45
 
46
46
 
47
- ### 追記
47
+ ### 追記1
48
48
 
49
49
 
50
50
 
@@ -130,4 +130,28 @@
130
130
 
131
131
 
132
132
 
133
+ ### 追記2
134
+
135
+
136
+
137
+ lodash を使わなくても、以下で`result`を得られます。(`check`は、上記の追記1で作成したものと同じです)
138
+
139
+
140
+
141
+ ```javascript
142
+
143
+ var { two } = obj.one;
144
+
145
+
146
+
147
+ var result = Object.keys(two).filter(name => check(two[name]));
148
+
149
+ ```
150
+
151
+ - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/GRgXypG?editors=0012](https://codepen.io/jun68ykt/pen/GRgXypG?editors=0012)
152
+
153
+
154
+
155
+
156
+
133
157
  以上、参考になれば幸いです。

6

テキスト修正

2020/01/16 15:24

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
 
8
8
 
9
- 現状の問題点は、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べて、`true` が見つかる度に、`trues` に `name` を `push` していることです。これだと、john には true のプロパティが3つあるので、`trues` に john が3個追加されることになってしまいます。
9
+ 現状の問題点は、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べて、`true` が見つかる度に、`trues` に `name` を push していることです。これだと、john には true のプロパティが3つあるので、`trues` に john が3個追加されることになってしまいます。
10
10
 
11
11
 
12
12
 
13
- これを避けるには、`Object.values(menu)` の要素を先頭から調べていくときに、どこかで true が見つかったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに [some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) を使って、以下のようにします。
13
+ これを避けるには、`Object.values(menu)` の要素を先頭から調べていくときに、どこかで true が見つかって `name` を `trues` にpushしたら、その時点でループを抜けてその後の要素はチェックしないようにすればよいので、`forEach`の替わりに [some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) を使って、以下のようにします。
14
14
 
15
15
 
16
16
 

5

テキスト修正

2020/01/16 06:43

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- まず、ご質問に挙げられているコードに最小限の修正をして、 `trues` に重複が含まれないようにするコードを挙げます。
5
+ まず、ご質問に挙げられているコードに最小限の修正をして、 `trues` に重複が含まれないようにするコードを挙げます。その後、別案を追記します。
6
6
 
7
7
 
8
8
 

4

テキスト修正

2020/01/16 03:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,11 +2,57 @@
2
2
 
3
3
 
4
4
 
5
- 一例を挙げます。
5
+ まず、ご質問に挙げられているコードに最小限の修正して、 `trues` に重複が含まれないようにするコードを挙げます。
6
6
 
7
7
 
8
8
 
9
- まずオブジェクト `e` を引数とりの`e` のプロパティの中に、ひとつでも truthy なものがあ true を返しひとつもtruthyなもの無けばfalseを返す関数 `check`を作っておきます。
9
+ 現状の問題点は、`Object.values(menu)` で得られるbool値の配列調べるときに、 `forEach` ですべて要素を調べて、`true` が見つかる度に、`trues` に `name` を `push` していることです。こだと、john には true のプロパティが3つあるので`trues` に john 3個追加さることになっています。
10
+
11
+
12
+
13
+ これを避けるには、`Object.values(menu)` の要素を先頭から調べていくときに、どこかで true が見つかったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに [some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) を使って、以下のようにします。
14
+
15
+
16
+
17
+ ```javascript
18
+
19
+ let trues = [];
20
+
21
+ const two = obj.one.two;
22
+
23
+ Object.keys(two).forEach(function(name){
24
+
25
+ const menu = two[name];
26
+
27
+ Object.values(menu).some(function(state){ // forEach を some に修正
28
+
29
+ if(state===true){
30
+
31
+ trues.push(name)
32
+
33
+ }
34
+
35
+ return state // この行を追加
36
+
37
+ });
38
+
39
+ });
40
+
41
+ ```
42
+
43
+ - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012](https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012)
44
+
45
+
46
+
47
+ ### 追記
48
+
49
+
50
+
51
+ 配列やオブジェクトの操作で便利なライブラリ [lodash](https://lodash.com/) を使ったコードを挙げます。
52
+
53
+
54
+
55
+ まず、オブジェクト `e` を引数にとり、この`e` のプロパティの中に、ひとつでも truthy なものがあれば true を返し、ひとつもtruthyなものが無ければfalseを返す関数 `check`を作っておきます。先のコードでも使った some を使います。
10
56
 
11
57
 
12
58
 
@@ -56,7 +102,7 @@
56
102
 
57
103
  ```
58
104
 
59
- を得るために、配列やオブジェクトの操作で便利なライブラリ[lodash](https://lodash.com/) の [_.pickBy](https://lodash.com/docs/#pickBy) を使います。
105
+ を得るために、 lodashの [_.pickBy](https://lodash.com/docs/#pickBy) を使います。
60
106
 
61
107
 
62
108
 
@@ -85,45 +131,3 @@
85
131
 
86
132
 
87
133
  以上、参考になれば幸いです。
88
-
89
-
90
-
91
- ### 追記
92
-
93
-
94
-
95
- ご質問に挙げられているコードに最小限の修正をして、 `trues` に重複が含まれないようにするコードを追記します。
96
-
97
-
98
-
99
- 修正の要点としては、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに [some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) を使って、以下のようにします。
100
-
101
-
102
-
103
- ```javascript
104
-
105
- let trues = [];
106
-
107
- const two = obj.one.two;
108
-
109
- Object.keys(two).forEach(function(name){
110
-
111
- const menu = two[name];
112
-
113
- Object.values(menu).some(function(state){ // forEach を some に修正
114
-
115
- if(state===true){
116
-
117
- trues.push(name)
118
-
119
- }
120
-
121
- return state // この行を追加
122
-
123
- });
124
-
125
- });
126
-
127
- ```
128
-
129
- - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012](https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012)

3

テキスト修正

2020/01/16 03:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -92,11 +92,11 @@
92
92
 
93
93
 
94
94
 
95
- ご質問に挙げられているコード修正して、 `trues` に重複が含まれないようにするコードを追記します。
95
+ ご質問に挙げられているコードに最小限の修正して、 `trues` に重複が含まれないようにするコードを追記します。
96
96
 
97
97
 
98
98
 
99
- 修正の要点としては、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに `some` を使って、以下のようにします。
99
+ 修正の要点としては、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに [some](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some) を使って、以下のようにします。
100
100
 
101
101
 
102
102
 
@@ -110,7 +110,7 @@
110
110
 
111
111
  const menu = two[name];
112
112
 
113
- Object.values(menu).some(function(state){ // forEachをsomeに修正
113
+ Object.values(menu).some(function(state){ // forEach some に修正
114
114
 
115
115
  if(state===true){
116
116
 

2

テキスト修正

2020/01/16 03:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -96,7 +96,7 @@
96
96
 
97
97
 
98
98
 
99
- 修正の要点としては、`Object.values(menu)` の配列の要素を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、それ以降の要素はチェックしないようにすればよいので、`forEach`の替わりに `some` を使って、以下のようにします。
99
+ 修正の要点としては、`Object.values(menu)` で得られるbool値の配列を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、その後の要素はチェックしないようにすればよいので、`forEach`の替わりに `some` を使って、以下のようにします。
100
100
 
101
101
 
102
102
 

1

テキスト修正

2020/01/16 02:58

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -85,3 +85,45 @@
85
85
 
86
86
 
87
87
  以上、参考になれば幸いです。
88
+
89
+
90
+
91
+ ### 追記
92
+
93
+
94
+
95
+ ご質問に挙げられているコードを修正して、 `trues` に重複が含まれないようにするコードを追記します。
96
+
97
+
98
+
99
+ 修正の要点としては、`Object.values(menu)` の配列の要素を調べるときに、 `forEach` ですべての要素を調べるのではなく、`true` があったら、それ以降の要素はチェックしないようにすればよいので、`forEach`の替わりに `some` を使って、以下のようにします。
100
+
101
+
102
+
103
+ ```javascript
104
+
105
+ let trues = [];
106
+
107
+ const two = obj.one.two;
108
+
109
+ Object.keys(two).forEach(function(name){
110
+
111
+ const menu = two[name];
112
+
113
+ Object.values(menu).some(function(state){ // forEachをsomeに修正
114
+
115
+ if(state===true){
116
+
117
+ trues.push(name)
118
+
119
+ }
120
+
121
+ return state // この行を追加
122
+
123
+ });
124
+
125
+ });
126
+
127
+ ```
128
+
129
+ - **動作確認用 CodePen:** [https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012](https://codepen.io/jun68ykt/pen/wvBEMVa?editors=0012)