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

回答編集履歴

10

テキスト修正

2019/09/04 04:52

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  こんにちは
2
2
 
3
- この回答では、以下の(1)、(2)、(3)のつのコードを示します。
3
+ この回答では、以下の(1)、(2)、(3)のつのコードを示します。
4
4
 
5
5
  **(1) ご質問で問われている②のコード例**
6
6
 

9

テキスト修正

2019/09/04 04:52

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  こんにちは
2
2
 
3
- この回答では、以下の(1)、(2)の2つのコードを示します。
3
+ この回答では、以下の(1)、(2)、(3)の2つのコードを示します。
4
4
 
5
5
  **(1) ご質問で問われている②のコード例**
6
6
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  ** (3)ご質問に挙げられている①の部分のコードを修正したもの **
19
19
 
20
- ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。
20
+ ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。(この回答の最後に、追記2 として記載しています)
21
21
 
22
22
  ## (1) ご質問で問われている②のコード例
23
23
 

8

テキスト修正

2019/09/04 04:39

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -15,7 +15,10 @@
15
15
 
16
16
  配列の操作で便利なメソッドを提供するライブラリ [Lodash](https://lodash.com/) を使って、`Records` から直接、最終的に欲しい形で `results` を得るコードを挙げます。
17
17
 
18
+ ** (3)ご質問に挙げられている①の部分のコードを修正したもの **
18
19
 
20
+ ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。
21
+
19
22
  ## (1) ご質問で問われている②のコード例
20
23
 
21
24
  以下に処理の概要を示します。
@@ -122,7 +125,7 @@
122
125
 
123
126
  以上、参考になれば幸いです。
124
127
 
125
- ### 追記
128
+ ### 追記1
126
129
 
127
130
  上記の回答で、 [(2) に挙げたコード](https://codepen.io/jun68ykt/pen/qBWPvWd)では、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、元の`Records` の中での異なる`value` の出現順が、 `results` でも保たれる保証はないです。
128
131
 
@@ -145,4 +148,27 @@
145
148
  L: groupsByValue[v].slice(1)
146
149
  }));
147
150
  ```
148
- - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/yLBzwmy](https://codepen.io/jun68ykt/pen/yLBzwmy)
151
+ - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/yLBzwmy](https://codepen.io/jun68ykt/pen/yLBzwmy)
152
+
153
+
154
+ ### 追記2
155
+
156
+ #### (3)ご質問に挙げられている①の部分のコードを修正したもの
157
+
158
+ 以下のように、ご質問に挙げられている、①の部分のコードを少し修正して、②の処理も併せて行うようにすることもできます。
159
+ ```diff
160
+ let results = Records.reduce((res, cur) => {
161
+ for (let i = 0, s = res.length, name = cur.K.value, object; i < s; ++i) {
162
+ object = res[i];
163
+ - if (object.K.value === name) {return res;}
164
+ + if (object.K.value === name) {
165
+ + object.L.push(cur);
166
+ + return res;
167
+ + }
168
+ }
169
+ - res.push(cur);
170
+ + res.push({...cur, L:[] });
171
+ return res;
172
+ }, []);
173
+ ```
174
+ - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/aboVNYX](https://codepen.io/jun68ykt/pen/aboVNYX)

7

テキスト修正

2019/09/04 04:38

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -9,7 +9,7 @@
9
9
  > 上記の①の部分は出来ていると思うのですが②の部分をどの様にしていけば良いか悩んでいます。
10
10
 
11
11
 
12
- とありましたので、ご質問に挙げられている、①のコードには手を加えず、この①に続く②の部分のコード例を挙げます。
12
+ とありましたので、ご質問に挙げられている、①の部分のコードには手を加えず、①に続く②の部分のコード例を挙げます。
13
13
 
14
14
  **(2) Lodash を使ったコード例**
15
15
 

6

テキスト修正

2019/09/04 00:28

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -2,21 +2,21 @@
2
2
 
3
3
  この回答では、以下の(1)、(2)の2つのコードを示します。
4
4
 
5
- **(1) ご質問の本題る②のコード例**
5
+ **(1) ご質問で問われている②のコード例**
6
6
 
7
7
  ご質問に
8
8
 
9
9
  > 上記の①の部分は出来ていると思うのですが②の部分をどの様にしていけば良いか悩んでいます。
10
10
 
11
11
 
12
- とありましたので、ご質問に挙げられている①には手を加えずそのまま使って、②のみを行うコード例を挙げます。
12
+ とありましたので、ご質問に挙げられているのコードには手を加えず、この①に続く②の部分のコード例を挙げます。
13
13
 
14
14
  **(2) Lodash を使ったコード例**
15
15
 
16
16
  配列の操作で便利なメソッドを提供するライブラリ [Lodash](https://lodash.com/) を使って、`Records` から直接、最終的に欲しい形で `results` を得るコードを挙げます。
17
17
 
18
18
 
19
- ## (1) ご質問の本題る②のコード例
19
+ ## (1) ご質問で問われている②のコード例
20
20
 
21
21
  以下に処理の概要を示します。
22
22
 

5

テキスト修正

2019/09/03 23:48

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## (1) ご質問の本題である②のコード例
20
20
 
21
- 元の配列である `Records` と、①よって得られた `results` に対して、次のような処理を実装します。
21
+ 以下に処理の概要します。
22
22
 
23
23
  1. `Records` の要素を、先頭から最後までのループで取得。各要素を `e`、そのインデクスを `i`とする。
24
24
  2. 処理①によって得られた`results` の要素`o`の中で、 `o.K.value` の値が `e.K.value` と等しい要素をみつけ、これを `obj`とする。

4

テキスト修正

2019/09/03 22:37

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## (1) ご質問の本題である②のコード例
20
20
 
21
- 元の配列である `Records` と、①によって得られた `results` に対して、処理を次のように考えます。
21
+ 元の配列である `Records` と、①によって得られた `results` に対して、次のような処理を実装します。
22
22
 
23
23
  1. `Records` の要素を、先頭から最後までのループで取得。各要素を `e`、そのインデクスを `i`とする。
24
24
  2. 処理①によって得られた`results` の要素`o`の中で、 `o.K.value` の値が `e.K.value` と等しい要素をみつけ、これを `obj`とする。

3

テキスト修正

2019/09/03 22:34

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -4,12 +4,12 @@
4
4
 
5
5
  **(1) ご質問の本題である②のコード例**
6
6
 
7
- ご質問の本題
7
+ ご質問
8
8
 
9
9
  > 上記の①の部分は出来ていると思うのですが②の部分をどの様にしていけば良いか悩んでいます。
10
10
 
11
11
 
12
-  に沿って、ご質問に挙げられている①はそのまま、②のみを行うコード例を挙げます。
12
+ とありましたので、ご質問に挙げられている①手を加えずそのまま使って、②のみを行うコード例を挙げます。
13
13
 
14
14
  **(2) Lodash を使ったコード例**
15
15
 

2

テキスト修正

2019/09/03 17:16

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -124,7 +124,7 @@
124
124
 
125
125
  ### 追記
126
126
 
127
- 上記の回答で、 (2) に挙げたコードでは、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、`Records` で異なる`value` の出現順が `results` でも保たれる保証はないです。
127
+ 上記の回答で、 [(2) に挙げたコード](https://codepen.io/jun68ykt/pen/qBWPvWd)では、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、元の`Records` の中異なる`value` の出現順が `results` でも保たれる保証はないです。
128
128
 
129
129
  もし、 `Records` での異なる `value`の出現順が、 `results` での `value` の順番として保たれるようにするには、以下のようにします。
130
130
 

1

テキスト修正

2019/09/03 16:49

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -120,4 +120,29 @@
120
120
  - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/qBWPvWd](https://codepen.io/jun68ykt/pen/qBWPvWd)
121
121
 
122
122
 
123
- 以上、参考になれば幸いです。
123
+ 以上、参考になれば幸いです。
124
+
125
+ ### 追記
126
+
127
+ 上記の回答で、 (2) に挙げたコードでは、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、`Records` で異なる`value` の出現順が `results` でも保たれる保証はないです。
128
+
129
+ もし、 `Records` での異なる `value`の出現順が、 `results` での `value` の順番として保たれるようにするには、以下のようにします。
130
+
131
+ ```javascript
132
+ // Recordsの要素に出現する value を、出現順に、かつ、重複を除いた配列を得る。
133
+ const orderedValues = Records
134
+ .map(e => e.K.value)
135
+ .filter(
136
+ (v, i, values) => i === values.findIndex(v2 => v2 === v)
137
+ );
138
+
139
+ // value の値でグルーピングしたオブジェクトを得る。
140
+ const groupsByValue = _.groupBy(Records, e => e.K.value);
141
+
142
+ // orderedValues と groupsByValue から results を得る。
143
+ const results = orderedValues.map(v => ({
144
+ ...groupsByValue[v][0],
145
+ L: groupsByValue[v].slice(1)
146
+ }));
147
+ ```
148
+ - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/yLBzwmy](https://codepen.io/jun68ykt/pen/yLBzwmy)