回答編集履歴

2

ソース修正

2021/09/01 03:47

投稿

退会済みユーザー
test CHANGED
@@ -65,3 +65,185 @@
65
65
  ```
66
66
 
67
67
  で一行で書けるよって。
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+ **もうひとつ補足:**
76
+
77
+
78
+
79
+ すでにベストアンサーにしてもろうた後やけど、もう一個お節介するわな。これだけネストの深いstateだと、[immutable-js](https://immutable-js.com/) を使うのもありかもしれへんよ。以下は、具体的には、こんな感じになるでしょうというイメージです。
80
+
81
+
82
+
83
+ - `yarn add immutable` して
84
+
85
+ - `initialState` を定義しているところで、
86
+
87
+ ```javascript
88
+
89
+ import { Map as ImmutableMap } from 'immutable'
90
+
91
+ ```
92
+
93
+ としておきます。`ImmutableMap` という別名でインポートするのは、念のため標準の`Map`と区別するためですわ。
94
+
95
+
96
+
97
+ - ほんで、`initialState`を以下のように、immutable-js のMapで作るんや。
98
+
99
+
100
+
101
+ ```javascript
102
+
103
+ const initialState = ImmutableMap({
104
+
105
+ TaskLogs : [
106
+
107
+ {
108
+
109
+ CreatedDate : "2020/81",
110
+
111
+ TaskGroupName: "SAMPLE_TITLE",
112
+
113
+ Tasks: [
114
+
115
+ {
116
+
117
+ Task: "FirstTask",
118
+
119
+ Date: {
120
+
121
+ "8/1": "11",
122
+
123
+ "8/2": "",
124
+
125
+ "8/3": "",
126
+
127
+ "8/4": "",
128
+
129
+ "8/5": "",
130
+
131
+ "8/6": "",
132
+
133
+ "8/7": "",
134
+
135
+ "8/8": "",
136
+
137
+ "8/9": "",
138
+
139
+ "8/10": "",
140
+
141
+ "8/11": "",
142
+
143
+ "8/12": "",
144
+
145
+ "8/14": ""
146
+
147
+ }
148
+
149
+ },
150
+
151
+ {
152
+
153
+ Task: "SecondTask",
154
+
155
+ Date: {
156
+
157
+ "8/1": "2",
158
+
159
+ "8/2": "",
160
+
161
+ "8/3": "",
162
+
163
+ "8/4": "", //例えば、ここの値だけを変更させたい
164
+
165
+ "8/5": "",
166
+
167
+ "8/6": "",
168
+
169
+ "8/7": "",
170
+
171
+ "8/8": "",
172
+
173
+ "8/9": "",
174
+
175
+ "8/10": "",
176
+
177
+ "8/11": "",
178
+
179
+ "8/12": "",
180
+
181
+ "8/14": ""
182
+
183
+ }
184
+
185
+ },
186
+
187
+ {
188
+
189
+ Task: "ThirdTask",
190
+
191
+ Date: {
192
+
193
+ "8/1": "300",
194
+
195
+ "8/2": "",
196
+
197
+ "8/3": "",
198
+
199
+ "8/4": "",
200
+
201
+ "8/5": "",
202
+
203
+ "8/6": "",
204
+
205
+ "8/7": "",
206
+
207
+ "8/8": "",
208
+
209
+ "8/9": "",
210
+
211
+ "8/10": "",
212
+
213
+ "8/11": "",
214
+
215
+ "8/12": "",
216
+
217
+ "8/14": ""
218
+
219
+ }
220
+
221
+ }
222
+
223
+ ]
224
+
225
+ },
226
+
227
+ ]
228
+
229
+ });
230
+
231
+ ```
232
+
233
+
234
+
235
+ こうやって、state全体をプレーンオブジェクトではなく、immutable-jsのマップにしておくと、`case UPDATE_TASKLOG:`んとこは、こないな感じ
236
+
237
+ ```javascript
238
+
239
+ case UPDATE_TASKLOG: {
240
+
241
+ const [i, j, k, value] = action.data;
242
+
243
+ return state.setIn( ['TaskLogs', i, 'Tasks', j, 'Date', k], value);
244
+
245
+ }
246
+
247
+ ```
248
+
249
+ にかなり簡単に書けると思います。ただこうすると、どのcaseでもstateをimmutable-jsのマップに変更したことでの修正をせなあきまへん。immutable-jsに慣れるための学習コストがそれなりにかかりますやろな。参考までに、 Redux のstateに immutable.jsを使うサンプルの記事ですねん。➡ [Redux stateにimmutable.jsを使う](https://qiita.com/sand/items/332bdc10638ef47673ba)

1

ソース修正

2021/09/01 03:47

投稿

退会済みユーザー
test CHANGED
@@ -2,46 +2,66 @@
2
2
 
3
3
  ```javascript
4
4
 
5
- let i = action.data[0]; //TaskLogs(配列)を指定する数値
5
+ const nextDate = {
6
6
 
7
- let j = action.data[1]; //Tasks(配列)を指定する数値
7
+ ...state.TaskLogs[i].Tasks[j].Date,
8
8
 
9
- let k = action.data[2]; //Date(オブジェクト)を指定するプロパティ名(例:k = "8/6")
9
+ [k]: value,
10
10
 
11
- let value = action.data[3]; //更新させたい値 (例:value="あああ", Date{"8/6": "あああ"})
11
+ };
12
12
 
13
13
 
14
14
 
15
- const nextDate = {
15
+ const nextTasks = state.TaskLogs[i].Tasks.map((e, index) => ({
16
16
 
17
- ...state.TaskLogs[i].Tasks[j].Date,
17
+ ...e,
18
18
 
19
- [k]: value,
19
+ Date: index === j ? nextDate : e.Date,
20
20
 
21
- };
21
+ }));
22
22
 
23
23
 
24
24
 
25
- const nextTasks = state.TaskLogs[i].Tasks.map((e, index) => ({
25
+ const nextTaskLogs = state.TaskLogs.map((e, index) => ({
26
26
 
27
- ...e,
27
+ ...e,
28
28
 
29
- Date: index === j ? nextDate : e.Date,
29
+ Tasks: index === i ? nextTasks : e.Tasks,
30
30
 
31
- }));
31
+ }));
32
32
 
33
33
 
34
34
 
35
- const nextTaskLogs = state.TaskLogs.map((e, index) => ({
35
+ return { TaskLogs: nextTaskLogs };
36
36
 
37
- ...e,
38
-
39
- Tasks: index === i ? nextTasks : e.Tasks,
40
-
41
- }));
37
+ ```
42
38
 
43
39
 
44
40
 
41
+ **補足:**
42
+
43
+
44
+
45
+ 本題とは関係あらへんのやけど、ちょっとお節介させてもらいますねん。以下の4行
46
+
47
+ ```javascript
48
+
45
- return { TaskLogs: nextTaskLogs };
49
+ let i = action.data[0]; //TaskLogs(配列)を指定する数値
50
+
51
+ let j = action.data[1]; //Tasks(配列)を指定する数値
52
+
53
+ let k = action.data[2]; //Date(オブジェクト)を指定するプロパティ名(例:k = "8/6")
54
+
55
+ let value = action.data[3]; //更新させたい値 (例:value="あああ", Date{"8/6": "あああ"})
46
56
 
47
57
  ```
58
+
59
+ やけど、(1)分割代入を使う。(2) なるべくletではなくconstを使う。という2点でリファクタすると、こないな感じ:
60
+
61
+ ```javascript
62
+
63
+ const [i, j, k, value] = action.data;
64
+
65
+ ```
66
+
67
+ で一行で書けるよって。