回答編集履歴

2

追記

2022/08/25 11:59

投稿

退会済みユーザー
test CHANGED
@@ -28,3 +28,35 @@
28
28
  ```
29
29
  👉 https://codepen.io/su507/pen/ExEJrgy?editors=0012
30
30
 
31
+
32
+ ### 補足2
33
+
34
+ 質問にあるコードの趣旨を活かして修正した案を挙げておきます。
35
+
36
+ ```javascript
37
+ const groupBy = members.reduce((result, current) => {
38
+ if (result[current.day] > 0) {
39
+ result[current.day] ++;
40
+ } else {
41
+ result[current.day] = 1;
42
+ }
43
+ return result;
44
+ }, {});
45
+ ```
46
+ 一番重要な修正点は、 reduce の第二引数に与える初期値を `0` から 空オブジェクト `{}` に修正していることです。
47
+
48
+ 最終的に欲しいのは日付ごとの件数ですから、単一の数字ではないはずです。reduceを使うときの考えどころは以下の2つあります。
49
+
50
+ (1) 第二引数にどのような初期値を与えるか?(単一の数字 `0` でよいのか? 空の文字列`""`や空の配列`[]`がよいのか?空のオブジェクト`{}`か? Set か Map か?あるいはこれらの複合か?)
51
+
52
+ (2) その初期値をaccumulator として望む結果を得るには、第一引数の関数をどう書けばよいか?
53
+
54
+ (1)の初期値を目的に適うような正しいものを選ぶことができれば、それをもとに(2)でロジックを実装すればよいことになりますが、そもそも(1)を間違うといくら (2)で試行錯誤しても袋小路に入ってしまいます。
55
+
56
+ また(1) にいくつかの選択肢がありどれも同じように目的を果たせるが、(2) のコードをより完結にあるいは効率のよいものに書ける、よい良い初期値というものも(まま)あり得ます。
57
+
58
+ なので、(2)を徒労にしないためにはまずは(1)で間違わないというのが大事です。
59
+
60
+
61
+
62
+

1

備考

2022/08/24 18:41

投稿

退会済みユーザー
test CHANGED
@@ -20,5 +20,11 @@
20
20
 
21
21
  > { '2022-07-23': 2, '2022-07-24': 2, '2022-07-25': 1, '2022-07-26': 2 }
22
22
 
23
+ ### 補足
23
24
 
25
+ [lodash](https://lodash.com/) 使ってよければ、 [groupBy](https://lodash.com/docs/#groupBy) というメソッドがあるのでそれ使ってこう:
26
+ ```javascript
27
+ const groupBy = _(members).groupBy('day').mapValues('length').value();
28
+ ```
29
+ 👉 https://codepen.io/su507/pen/ExEJrgy?editors=0012
24
30