回答編集履歴
2
追記
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
備考
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
|
|