回答編集履歴

1

校正

2022/04/20 02:01

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -30,15 +30,22 @@
30
30
 
31
31
  確かにわざわざfor文なんて使ってられません。
32
32
  何故か?for文で展開するだけで3行消費して可読性に負荷が掛かるからです。
33
-
33
+ でも同じことが1行で書けるようになればどうでしょう?
34
+
34
- なのでJavaScriptでは関数型プログラミングのエッセンスを流用した
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
- reduceに突っ込む専用の関数として再定義します。
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
+ 可読性を考えるとこの辺がバランス良いんじゃないかと思います。