回答編集履歴

10

テキスト修正

2019/09/04 04:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- この回答では、以下の(1)、(2)、(3)のつのコードを示します。
5
+ この回答では、以下の(1)、(2)、(3)のつのコードを示します。
6
6
 
7
7
 
8
8
 

9

テキスト修正

2019/09/04 04:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- この回答では、以下の(1)、(2)の2つのコードを示します。
5
+ この回答では、以下の(1)、(2)、(3)の2つのコードを示します。
6
6
 
7
7
 
8
8
 
@@ -36,7 +36,7 @@
36
36
 
37
37
 
38
38
 
39
- ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。
39
+ ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。(この回答の最後に、追記2 として記載しています)
40
40
 
41
41
 
42
42
 

8

テキスト修正

2019/09/04 04:39

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -32,6 +32,12 @@
32
32
 
33
33
 
34
34
 
35
+ ** (3)ご質問に挙げられている①の部分のコードを修正したもの **
36
+
37
+
38
+
39
+ ご質問に挙げられている、①の部分のコードを修正して、①を行いながら②も併せて行うようにします。
40
+
35
41
 
36
42
 
37
43
  ## (1) ご質問で問われている②のコード例
@@ -246,7 +252,7 @@
246
252
 
247
253
 
248
254
 
249
- ### 追記
255
+ ### 追記1
250
256
 
251
257
 
252
258
 
@@ -293,3 +299,49 @@
293
299
  ```
294
300
 
295
301
  - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/yLBzwmy](https://codepen.io/jun68ykt/pen/yLBzwmy)
302
+
303
+
304
+
305
+
306
+
307
+ ### 追記2
308
+
309
+
310
+
311
+ #### (3)ご質問に挙げられている①の部分のコードを修正したもの
312
+
313
+
314
+
315
+ 以下のように、ご質問に挙げられている、①の部分のコードを少し修正して、②の処理も併せて行うようにすることもできます。
316
+
317
+ ```diff
318
+
319
+ let results = Records.reduce((res, cur) => {
320
+
321
+ for (let i = 0, s = res.length, name = cur.K.value, object; i < s; ++i) {
322
+
323
+ object = res[i];
324
+
325
+ - if (object.K.value === name) {return res;}
326
+
327
+ + if (object.K.value === name) {
328
+
329
+ + object.L.push(cur);
330
+
331
+ + return res;
332
+
333
+ + }
334
+
335
+ }
336
+
337
+ - res.push(cur);
338
+
339
+ + res.push({...cur, L:[] });
340
+
341
+ return res;
342
+
343
+ }, []);
344
+
345
+ ```
346
+
347
+ - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/aboVNYX](https://codepen.io/jun68ykt/pen/aboVNYX)

7

テキスト修正

2019/09/04 04:38

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- とありましたので、ご質問に挙げられている、①のコードには手を加えず、この①に続く②の部分のコード例を挙げます。
23
+ とありましたので、ご質問に挙げられている、①の部分のコードには手を加えず、①に続く②の部分のコード例を挙げます。
24
24
 
25
25
 
26
26
 

6

テキスト修正

2019/09/04 00:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- **(1) ご質問の本題る②のコード例**
9
+ **(1) ご質問で問われている②のコード例**
10
10
 
11
11
 
12
12
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
- とありましたので、ご質問に挙げられている①には手を加えずまま使って、②のみを行うコード例を挙げます。
23
+ とありましたので、ご質問に挙げられているのコードには手を加えず、こ①に続く②の部分のコード例を挙げます。
24
24
 
25
25
 
26
26
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- ## (1) ご質問の本題る②のコード例
37
+ ## (1) ご質問で問われている②のコード例
38
38
 
39
39
 
40
40
 

5

テキスト修正

2019/09/03 23:48

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- 元の配列である `Records` と、①よって得られた `results` に対して、次のような処理を実装します。
41
+ 以下に処理の概要します。
42
42
 
43
43
 
44
44
 

4

テキスト修正

2019/09/03 22:37

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- 元の配列である `Records` と、①によって得られた `results` に対して、処理を次のように考えます。
41
+ 元の配列である `Records` と、①によって得られた `results` に対して、次のような処理を実装します。
42
42
 
43
43
 
44
44
 

3

テキスト修正

2019/09/03 22:34

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- ご質問の本題
13
+ ご質問
14
14
 
15
15
 
16
16
 
@@ -20,7 +20,7 @@
20
20
 
21
21
 
22
22
 
23
-  に沿って、ご質問に挙げられている①はそのまま、②のみを行うコード例を挙げます。
23
+ とありましたので、ご質問に挙げられている①手を加えずそのまま使って、②のみを行うコード例を挙げます。
24
24
 
25
25
 
26
26
 

2

テキスト修正

2019/09/03 17:16

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -250,7 +250,7 @@
250
250
 
251
251
 
252
252
 
253
- 上記の回答で、 (2) に挙げたコードでは、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、`Records` で異なる`value` の出現順が `results` でも保たれる保証はないです。
253
+ 上記の回答で、 [(2) に挙げたコード](https://codepen.io/jun68ykt/pen/qBWPvWd)では、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、元の`Records` の中異なる`value` の出現順が `results` でも保たれる保証はないです。
254
254
 
255
255
 
256
256
 

1

テキスト修正

2019/09/03 16:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -243,3 +243,53 @@
243
243
 
244
244
 
245
245
  以上、参考になれば幸いです。
246
+
247
+
248
+
249
+ ### 追記
250
+
251
+
252
+
253
+ 上記の回答で、 (2) に挙げたコードでは、一度グルーピングされたオブジェクトを作り、それに対して、`Object.values()` で配列を作り、その配列に対する `.map()` で `results` を作っています。ですので、オブジェクトのエントリに順序はないことから、`Records` で異なる`value` の出現順が `results` でも保たれる保証はないです。
254
+
255
+
256
+
257
+ もし、 `Records` での異なる `value`の出現順が、 `results` での `value` の順番として保たれるようにするには、以下のようにします。
258
+
259
+
260
+
261
+ ```javascript
262
+
263
+ // Recordsの要素に出現する value を、出現順に、かつ、重複を除いた配列を得る。
264
+
265
+ const orderedValues = Records
266
+
267
+ .map(e => e.K.value)
268
+
269
+ .filter(
270
+
271
+ (v, i, values) => i === values.findIndex(v2 => v2 === v)
272
+
273
+ );
274
+
275
+
276
+
277
+ // value の値でグルーピングしたオブジェクトを得る。
278
+
279
+ const groupsByValue = _.groupBy(Records, e => e.K.value);
280
+
281
+
282
+
283
+ // orderedValues と groupsByValue から results を得る。
284
+
285
+ const results = orderedValues.map(v => ({
286
+
287
+ ...groupsByValue[v][0],
288
+
289
+ L: groupsByValue[v].slice(1)
290
+
291
+ }));
292
+
293
+ ```
294
+
295
+ - **動作確認用サンプル:** [https://codepen.io/jun68ykt/pen/yLBzwmy](https://codepen.io/jun68ykt/pen/yLBzwmy)