質問編集履歴

1

解決案追記

2020/06/28 09:34

投稿

Ecaroh
Ecaroh

スコア11

test CHANGED
File without changes
test CHANGED
@@ -153,3 +153,99 @@
153
153
  ```
154
154
 
155
155
  `map` と`filter`を多数ネストしできなくもないですが、行列が変更になっても対応できるアルゴリズムが知りたいです。
156
+
157
+
158
+
159
+ # 解決案
160
+
161
+ ```javascript
162
+
163
+ const tableToTreeObjArr = (tableData, childListKey) => {
164
+
165
+
166
+
167
+ // ヘッダー取得
168
+
169
+ const header = tableData[0]
170
+
171
+
172
+
173
+ // 行単位の処理
174
+
175
+ const addRowToTree = (treeArray, row, header) => {
176
+
177
+
178
+
179
+ let list = treeArray
180
+
181
+
182
+
183
+ for (let i = 0; i < row.length; ++ i) {
184
+
185
+
186
+
187
+ // 最終列以外 子配列を格納する親オブジェクトを生成
188
+
189
+ if (i < row.length - 1) {
190
+
191
+
192
+
193
+ // ヘッダーから列名取得
194
+
195
+ const key = header[i]
196
+
197
+
198
+
199
+ // 親オブジェクトがまだ存在しない場合は生成
200
+
201
+ let obj = list.find(col => {
202
+
203
+ return col[key] === row[i]
204
+
205
+ })
206
+
207
+ if (!obj) {
208
+
209
+ obj = { [key]: row[i], [childListKey]: [] }
210
+
211
+ list.push(obj)
212
+
213
+ }
214
+
215
+
216
+
217
+ // list変数の参照先を子配列に変更
218
+
219
+ list = obj[childListKey]
220
+
221
+
222
+
223
+ // 最終列 子配列への格納のみ行う
224
+
225
+ } else {
226
+
227
+ list.push(row[i])
228
+
229
+ }
230
+
231
+ }
232
+
233
+
234
+
235
+ return treeArray
236
+
237
+ }
238
+
239
+
240
+
241
+ // ヘッダー以降の行を配列に畳み込み
242
+
243
+ return tableData.slice(1).reduce((treeArray, row) => {
244
+
245
+ return addRowToTree(treeArray, row, header)
246
+
247
+ }, [])
248
+
249
+ }
250
+
251
+ ```