回答編集履歴
1
校正
test
CHANGED
@@ -30,15 +30,22 @@
|
|
30
30
|
|
31
31
|
確かにわざわざfor文なんて使ってられません。
|
32
32
|
何故か?for文で展開するだけで3行消費して可読性に負荷が掛かるからです。
|
33
|
-
|
33
|
+
でも同じことが1行で書けるようになればどうでしょう?
|
34
|
+
|
34
|
-
|
35
|
+
JavaScriptでは関数型プログラミングのエッセンスを流用した
|
35
|
-
メソッドチェーンを利用した
|
36
|
+
メソッドチェーンを利用した値の加工テクニックが存在してて、コードの行数削減に役立ちます。
|
36
|
-
しかしJavaScript
|
37
|
+
しかしJavaScriptのネイティブには配列を加工するメソッドが少ないので、
|
37
38
|
慣れるまで難解な[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)等を使う事になります。
|
38
|
-
|
39
|
+
(この辺RubyやPythonは充実してるんですけどね)
|
40
|
+
|
39
|
-
そこでライブラリの力を利用してgroup-byを
|
41
|
+
そこでライブラリの力を利用してgroup-byを連れてきます。
|
42
|
+
関数型プログラミング言語とか、ガチOOP言語だと結構用意してくれてる印象ありますね。
|
43
|
+
PHPの[配列関数](https://www.php.net/manual/ja/ref.array.php)を眺めた感じそういうのなかったです。
|
44
|
+
PHPのreduceは筋が悪いのでforeachになりそうですね、たしかにやってられん。
|
45
|
+
|
40
46
|
JavaScript/Node.jsではLodashのライブラリがメジャーですかね。
|
41
47
|
参考サイト: [groupBy - Lodash](https://lodash.com/docs/4.17.15#groupBy)
|
48
|
+
[Ramda.js](https://ramdajs.com/)や[Just](https://github.com/angus-c/just/)がライバルになります。
|
42
49
|
|
43
50
|
[Online Lodash Tester](https://codepen.io/travist/full/jrBjBz/)というサイトで確認してみましょう。
|
44
51
|
JavaScriptやJSONに於いてオブジェクトのキー名重複は許されないので、
|
@@ -86,7 +93,10 @@
|
|
86
93
|
```
|
87
94
|
|
88
95
|
良好。
|
89
|
-
このままでは
|
96
|
+
このままではまだ実用的な値になったとは言えないのでさらなる加工を施します。
|
97
|
+
オブジェクトの値だけ抽出(values)して二次元配列にしてから、
|
98
|
+
二次元配列にmapを使って整形します。
|
99
|
+
|
90
100
|
この時、Lodashのチェイン記法を使うときれいに記述出来ます。
|
91
101
|
参考記事: [Lodashのチェーン記法について - Qiita](https://qiita.com/kurararara/items/fb470ea71e59cd0371d4)
|
92
102
|
|
@@ -108,10 +118,6 @@
|
|
108
118
|
}))
|
109
119
|
}));
|
110
120
|
```
|
111
|
-
|
112
|
-
group-byでオブジェクトにして、
|
113
|
-
valuesで値部分だけ抜き出して二次元配列にして、
|
114
|
-
二次元配列を整形したという感じですね。
|
115
121
|
|
116
122
|
```json
|
117
123
|
[
|
@@ -142,13 +148,24 @@
|
|
142
148
|
]
|
143
149
|
```
|
144
150
|
|
151
|
+
だいたい要望どおりに仕上がったかと思います。
|
152
|
+
|
145
153
|
CRUDのシステムなら良かれと思った結合しまくると
|
146
154
|
全く関係のないデータにアクセスする余計なお世話になるケースもありますから
|
155
|
+
あまりに沢山の行を様々な観点で組み合わせるという事はそんなにないんじゃないかと思います。
|
156
|
+
|
147
|
-
実務ではこの程度がさっと書ければ十分か
|
157
|
+
実務ではこの程度がさっと書ければ十分ですかね。
|
148
158
|
|
149
159
|
---
|
150
160
|
|
151
161
|
【おまけ】LodashではなくネイティブのJSで頑張るとこうなります。
|
162
|
+
|
163
|
+
前述の章ではLodashで実装されているgourp-by機能を使いましたが、
|
164
|
+
JavaScriptにgroup-byはないのでreduceで頑張るしかありません。
|
165
|
+
|
166
|
+
また、汎用オブジェクトは好き勝手なキーを宣言できますので、
|
167
|
+
値を取り出すには`Object.values()`を使う必要があります。
|
168
|
+
メソッドチェーンが途切れて少し不格好になりますね。
|
152
169
|
|
153
170
|
```js
|
154
171
|
const arr = [
|
@@ -199,12 +216,11 @@
|
|
199
216
|
```
|
200
217
|
|
201
218
|
group-byを再現したreduce関数の中身は
|
202
|
-
ECMAScriptのイディオムをガシガシ使って
|
219
|
+
ECMAScript2015以降のイディオムをガシガシ使ってる難解なコードで読めたものではありませんね。
|
203
|
-
|
220
|
+
|
204
|
-
|
205
|
-
|
221
|
+
またワンライナーにするため
|
206
222
|
毎回配列やオブジェクトを生成しまくる富豪的なプログラミングになっているので
|
207
|
-
同じ配列を使いまわして処理速度向上させます。
|
223
|
+
同じ配列・オブジェクトを使いまわして処理速度向上させます。
|
208
224
|
|
209
225
|
```js
|
210
226
|
const groupBy = cb => (obj, it) => {
|
@@ -236,3 +252,4 @@
|
|
236
252
|
```
|
237
253
|
|
238
254
|
実行結果を確認しましたが全く同様でした。
|
255
|
+
可読性を考えるとこの辺がバランス良いんじゃないかと思います。
|