回答編集履歴
10
テキスト修正
answer
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
こんにちは
|
2
2
|
|
3
|
-
この回答では、以下の(1)、(2)、(3)の
|
3
|
+
この回答では、以下の(1)、(2)、(3)の3つのコードを示します。
|
4
4
|
|
5
5
|
**(1) ご質問で問われている②のコード例**
|
6
6
|
|
9
テキスト修正
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
テキスト修正
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
テキスト修正
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
> 上記の①の部分は出来ていると思うのですが②の部分をどの様にしていけば良いか悩んでいます。
|
10
10
|
|
11
11
|
|
12
|
-
とありましたので、ご質問に挙げられている、①のコードには手を加えず、
|
12
|
+
とありましたので、ご質問に挙げられている、①の部分のコードには手を加えず、①に続く②の部分のコード例を挙げます。
|
13
13
|
|
14
14
|
**(2) Lodash を使ったコード例**
|
15
15
|
|
6
テキスト修正
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
テキスト修正
answer
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
## (1) ご質問の本題である②のコード例
|
20
20
|
|
21
|
-
|
21
|
+
以下に処理の概要を示します。
|
22
22
|
|
23
23
|
1. `Records` の要素を、先頭から最後までのループで取得。各要素を `e`、そのインデクスを `i`とする。
|
24
24
|
2. 処理①によって得られた`results` の要素`o`の中で、 `o.K.value` の値が `e.K.value` と等しい要素をみつけ、これを `obj`とする。
|
4
テキスト修正
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
テキスト修正
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
テキスト修正
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
テキスト修正
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)
|