回答編集履歴
22
テキスト修正
test
CHANGED
@@ -218,7 +218,7 @@
|
|
218
218
|
|
219
219
|
|
220
220
|
|
221
|
-
この回答の冒頭に、入力データの様々な
|
221
|
+
この回答の冒頭に、入力データの様々な拡張性について書きましたが、上記の関数 `makeCSVData`はそれらに対応しており、 以下のような入力でも適切に処理してCSV用のデータを生成します。
|
222
222
|
|
223
223
|
|
224
224
|
|
21
テキスト修正
test
CHANGED
@@ -218,7 +218,7 @@
|
|
218
218
|
|
219
219
|
|
220
220
|
|
221
|
-
この回答の冒頭に、入力データの様々な可能性について書きましたが、
|
221
|
+
この回答の冒頭に、入力データの様々な可能性について書きましたが、上記の関数 `makeCSVData`はそれらに対応しており、 以下のような入力でも適切に処理してCSV用のデータを生成します。
|
222
222
|
|
223
223
|
|
224
224
|
|
@@ -276,4 +276,4 @@
|
|
276
276
|
|
277
277
|
|
278
278
|
|
279
|
-
ご質問で提示された与件の範囲をかなり超えた大袈裟なものになってい
|
279
|
+
関数 `makeCSVData`は、ご質問で提示された与件の範囲をかなり超えた大袈裟なものになってしまいましたが、先の様々な入力の拡張に対応させようとすると、こういうコードになるという一例として参考にして頂ければと思います。
|
20
テキスト修正
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
-
以下
|
29
|
+
以下は、上記の可能性のどれであっても、修正すべき箇所がなるべく分かりやすいように、という考え方で作成したコードです。このコードで作られる `data` は、ご質問にある `data` と同じ内容の配列になります。
|
30
30
|
|
31
31
|
|
32
32
|
|
19
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作るためのコードを挙げます。その後、追記にて、より
|
5
|
+
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作るためのコードを挙げます。その後、追記にて、よりCSVに近い配列を作るコードを示します。
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
上記のような可能性が考えられますが、これらのうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性
|
25
|
+
上記のような可能性が考えられますが、これらのうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性が決まります。
|
26
26
|
|
27
27
|
|
28
28
|
|
18
テキスト修正
test
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
上記のような可能性が考えられますが、このうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
|
25
|
+
上記のような可能性が考えられますが、これらのうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
|
26
26
|
|
27
27
|
|
28
28
|
|
17
テキスト修正
test
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
- `data1`および`data2`の要素は、どれも長さが2の配列であるが、今後、3以上になるかもしれない。(つまり、 `num`, `alpha` の次のサフィックスが追加されるかもしれない)
|
20
20
|
|
21
|
-
- `data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、
|
21
|
+
- `data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、常にすべてが同じ長さとは限らない。
|
22
22
|
|
23
23
|
|
24
24
|
|
16
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作る
|
5
|
+
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作るためのコードを挙げます。その後、追記にて、よりCSVに近い配列を作るコードを示します。
|
6
6
|
|
7
7
|
|
8
8
|
|
15
テキスト修正
test
CHANGED
@@ -218,7 +218,7 @@
|
|
218
218
|
|
219
219
|
|
220
220
|
|
221
|
-
以下のような入力にも対応します。
|
221
|
+
この回答の冒頭に、入力データの様々な可能性について書きましたが、これらに対応して、上記の関数 `makeCSVData` は以下のような入力にも対応します。
|
222
222
|
|
223
223
|
|
224
224
|
|
14
テキスト修正
test
CHANGED
@@ -124,7 +124,7 @@
|
|
124
124
|
|
125
125
|
|
126
126
|
|
127
|
-
で
|
127
|
+
そこで、上記のような配列を得るための、以下のような関数を作成しました。
|
128
128
|
|
129
129
|
|
130
130
|
|
@@ -276,4 +276,4 @@
|
|
276
276
|
|
277
277
|
|
278
278
|
|
279
|
-
ご質問で提示された与件の範囲をかなり超え
|
279
|
+
ご質問で提示された与件の範囲をかなり超えた大袈裟なものになっているかもしれませんが、汎用化を進めると、こういうコードになるという一例として参考にして頂ければと思います。
|
13
テキスト修正
test
CHANGED
@@ -2,23 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `data`
|
6
|
-
|
7
|
-
```
|
8
|
-
|
9
|
-
var data = [
|
10
|
-
|
11
|
-
{'data1-num': data1[0][0],'data1-alpha': data1[0][1],'data2-num': data2[0][0],'data2-alpha': data2[0][1]},
|
12
|
-
|
13
|
-
{'data1-num': data1[1][0],'data1-alpha': data1[1][1],'data2-num': data2[1][0],'data2-alpha': data2[1][1]},
|
14
|
-
|
15
|
-
{'data1-num': data1[2][0],'data1-alpha': data1[2][1],'data2-num': data2[2][0],'data2-alpha': data2[2][1]},
|
16
|
-
|
17
|
-
];
|
18
|
-
|
19
|
-
```
|
20
|
-
|
21
|
-
|
5
|
+
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作ることを目的としたコードを回答します。その後、追記にて、よりCSVに近い配列を作るコードを示します。
|
22
6
|
|
23
7
|
|
24
8
|
|
12
テキスト修正
test
CHANGED
@@ -118,7 +118,7 @@
|
|
118
118
|
|
119
119
|
|
120
120
|
|
121
|
-
ご質問のコードにある `data` とは違う
|
121
|
+
CSV を作るためにより適した配列ということでいえば、ご質問のコードにある `data` とは違う配列になりますが、以下のような配列のほうがよりCSVに近いと思います。
|
122
122
|
|
123
123
|
|
124
124
|
|
11
テキスト修正
test
CHANGED
@@ -234,7 +234,7 @@
|
|
234
234
|
|
235
235
|
|
236
236
|
|
237
|
-
|
237
|
+
以下のような入力にも対応します。
|
238
238
|
|
239
239
|
|
240
240
|
|
10
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答では、ご質問に挙げられている、オブジェクトの配列 `data`
|
5
|
+
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `data`
|
6
6
|
|
7
7
|
```
|
8
8
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
```
|
20
20
|
|
21
|
-
と同じ内容の配列 `data` を作ることを目的としたコードを回答します。
|
21
|
+
と同じ内容の配列 `data` を作ることを目的としたコードを回答し、追記にて、よりCSVに近い配列を作るコードを示します。
|
22
22
|
|
23
23
|
|
24
24
|
|
9
テキスト修正
test
CHANGED
@@ -111,3 +111,185 @@
|
|
111
111
|
|
112
112
|
|
113
113
|
以上、参考になれば幸いです。
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
### 追記
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
ご質問のコードにある `data` とは違う内容の配列になりますが、CSV を作るためにより適した配列ということでいえば、以下のような配列のほうが、より目的とするCSVに近いと思います。
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
```javascript
|
126
|
+
|
127
|
+
[
|
128
|
+
|
129
|
+
["data1-num", "data1-alpha", "data2-num" ,"data2-alpha"],
|
130
|
+
|
131
|
+
[1,"A",4,"D"],
|
132
|
+
|
133
|
+
[2,"B",5,"E"],
|
134
|
+
|
135
|
+
[3,"C",6,"F"]
|
136
|
+
|
137
|
+
]
|
138
|
+
|
139
|
+
```
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
ですので、上記のような配列を得るためのコードを考え、以下のような関数を作成しました。
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
```javascript
|
148
|
+
|
149
|
+
function makeCSVData(dataObj, columns) {
|
150
|
+
|
151
|
+
const keys = Object.keys(dataObj).sort();
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
const lengths = keys.reduce((m, k) => m.set(k, Math.max(...dataObj[k].map(ary => ary.length))), new Map());
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
const header = keys.reduce((ary, k) =>
|
160
|
+
|
161
|
+
ary.concat([...Array(lengths.get(k))].map((_, i) => `${k}-${columns[i]}`)), []);
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
const numRows = Math.max(...Object.values(dataObj).map(ary => ary.length));
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
const data = [...Array(numRows)].reduce((ary, _, i) => {
|
170
|
+
|
171
|
+
ary.push(keys.reduce((a, k) =>
|
172
|
+
|
173
|
+
a.concat(
|
174
|
+
|
175
|
+
dataObj[k][i] ?
|
176
|
+
|
177
|
+
[...dataObj[k][i], ...Array(lengths.get(k) - dataObj[k][i].length ) ] :
|
178
|
+
|
179
|
+
[...Array(lengths.get(k))]
|
180
|
+
|
181
|
+
) ,[]));
|
182
|
+
|
183
|
+
return ary;
|
184
|
+
|
185
|
+
},
|
186
|
+
|
187
|
+
[header]);
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
return data;
|
192
|
+
|
193
|
+
}
|
194
|
+
|
195
|
+
```
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
上記の関数 `makeCSVData` は以下のように使います。
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
```javascript
|
204
|
+
|
205
|
+
const data1 = [
|
206
|
+
|
207
|
+
[1,'A'],
|
208
|
+
|
209
|
+
[2,'B'],
|
210
|
+
|
211
|
+
[3,'C']
|
212
|
+
|
213
|
+
];
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
const data2 = [
|
218
|
+
|
219
|
+
[4,'D'],
|
220
|
+
|
221
|
+
[5,'E'],
|
222
|
+
|
223
|
+
[6,'F']
|
224
|
+
|
225
|
+
];
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
const data = makeCSVData({ data1, data2 }, ['num', 'alpha']);
|
230
|
+
|
231
|
+
```
|
232
|
+
|
233
|
+
- **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/c0u1vp87/11/](https://jsfiddle.net/jun68ykt/c0u1vp87/11/)
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
関数 makeCSVData は以下のような入力にも対応します。
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
```javascript
|
242
|
+
|
243
|
+
const d1 = [
|
244
|
+
|
245
|
+
[1,'A'],
|
246
|
+
|
247
|
+
[2,'B'],
|
248
|
+
|
249
|
+
[3,'C'],
|
250
|
+
|
251
|
+
[-1,'a']
|
252
|
+
|
253
|
+
];
|
254
|
+
|
255
|
+
|
256
|
+
|
257
|
+
const d2 = [
|
258
|
+
|
259
|
+
[4,'D', true],
|
260
|
+
|
261
|
+
[5,'E'],
|
262
|
+
|
263
|
+
[6,'F', false, 100]
|
264
|
+
|
265
|
+
];
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
const d3 = [
|
270
|
+
|
271
|
+
[7,'X'],
|
272
|
+
|
273
|
+
[8,'Y'],
|
274
|
+
|
275
|
+
[9,'Z'],
|
276
|
+
|
277
|
+
[-7, 'x'],
|
278
|
+
|
279
|
+
[-8, 'y']
|
280
|
+
|
281
|
+
];
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
const data = makeCSVData({ d1, d2, d3 }, ['num', 'alpha', 'beta', 'gamma']);
|
286
|
+
|
287
|
+
```
|
288
|
+
|
289
|
+
- **上記の動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/c0u1vp87/10/](https://jsfiddle.net/jun68ykt/c0u1vp87/10/)
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
ご質問で提示された与件の範囲をかなり超えてしまっているかもしれませんが、汎用化を進めると、こういうコードになるという一例として参考にして頂ければと思います。
|
8
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答では、ご質問に挙げられている
|
5
|
+
この回答では、ご質問に挙げられている、オブジェクトの配列 `data`
|
6
6
|
|
7
7
|
```
|
8
8
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
```
|
20
20
|
|
21
|
-
と同じ内容の配列を作ることを目的としたコードを回答します。
|
21
|
+
と同じ内容の配列 `data` を作ることを目的としたコードを回答します。
|
22
22
|
|
23
23
|
|
24
24
|
|
@@ -82,19 +82,21 @@
|
|
82
82
|
|
83
83
|
|
84
84
|
|
85
|
-
const data = { data1, data2 };
|
85
|
+
const dataObj = { data1, data2 };
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
const tmp = Object.entries(data).map(([k, ary]) => ary.map(e => toObj(e, k)));
|
89
|
+
const tmp = Object.entries(dataObj).map(([k, ary]) => ary.map(e => toObj(e, k)));
|
90
90
|
|
91
91
|
|
92
92
|
|
93
|
-
const
|
93
|
+
const data = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
|
94
94
|
|
95
95
|
|
96
96
|
|
97
|
-
console.log(
|
97
|
+
console.log(data);
|
98
|
+
|
99
|
+
|
98
100
|
|
99
101
|
|
100
102
|
|
@@ -102,7 +104,7 @@
|
|
102
104
|
|
103
105
|
|
104
106
|
|
105
|
-
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/
|
107
|
+
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/4](https://jsfiddle.net/jun68ykt/3w4je19o/4)
|
106
108
|
|
107
109
|
|
108
110
|
|
7
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
この回答は、ご質問に挙げられているコードにある
|
5
|
+
この回答では、ご質問に挙げられているコードにあるオブジェクトの配列
|
6
6
|
|
7
7
|
```
|
8
8
|
|
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
```
|
20
20
|
|
21
|
-
|
21
|
+
と同じ内容の配列を作ることを目的としたコードを回答します。
|
22
22
|
|
23
23
|
|
24
24
|
|
6
テキスト修正
test
CHANGED
@@ -1,4 +1,24 @@
|
|
1
|
-
こんにちは
|
1
|
+
こんにちは。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
この回答は、ご質問に挙げられているコードにある
|
6
|
+
|
7
|
+
```
|
8
|
+
|
9
|
+
var data = [
|
10
|
+
|
11
|
+
{'data1-num': data1[0][0],'data1-alpha': data1[0][1],'data2-num': data2[0][0],'data2-alpha': data2[0][1]},
|
12
|
+
|
13
|
+
{'data1-num': data1[1][0],'data1-alpha': data1[1][1],'data2-num': data2[1][0],'data2-alpha': data2[1][1]},
|
14
|
+
|
15
|
+
{'data1-num': data1[2][0],'data1-alpha': data1[2][1],'data2-num': data2[2][0],'data2-alpha': data2[2][1]},
|
16
|
+
|
17
|
+
];
|
18
|
+
|
19
|
+
```
|
20
|
+
|
21
|
+
によって作られる、オブジェクトの配列`data` と同じ内容の配列を作ることを目的としたコードを回答します。
|
2
22
|
|
3
23
|
|
4
24
|
|
5
テキスト修正
test
CHANGED
@@ -66,7 +66,7 @@
|
|
66
66
|
|
67
67
|
|
68
68
|
|
69
|
-
const tmp = Object.
|
69
|
+
const tmp = Object.entries(data).map(([k, ary]) => ary.map(e => toObj(e, k)));
|
70
70
|
|
71
71
|
|
72
72
|
|
@@ -82,7 +82,7 @@
|
|
82
82
|
|
83
83
|
|
84
84
|
|
85
|
-
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/
|
85
|
+
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/3](https://jsfiddle.net/jun68ykt/3w4je19o/3)
|
86
86
|
|
87
87
|
|
88
88
|
|
4
テキスト修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
ご質問に挙げられてるコードでは、
|
9
|
+
ご質問に挙げられているコードでは、
|
10
10
|
|
11
11
|
- `data1` と `data2` しかないが、`data3`, `data4` ... と増える可能性がある。
|
12
12
|
|
3
テキスト修正
test
CHANGED
@@ -2,21 +2,23 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、
|
5
|
+
ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、以下が思いつきます。
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
|
9
|
+
ご質問に挙げられてるコードでは、
|
10
10
|
|
11
|
-
-
|
11
|
+
- `data1` と `data2` しかないが、`data3`, `data4` ... と増える可能性がある。
|
12
12
|
|
13
|
-
-
|
13
|
+
- `data1` と `data2` はともに要素の数が3で同じだが、いつも同じとは限らない。
|
14
14
|
|
15
|
+
- `data1`および`data2`の要素は、どれも長さが2の配列であるが、今後、3以上になるかもしれない。(つまり、 `num`, `alpha` の次のサフィックスが追加されるかもしれない)
|
16
|
+
|
15
|
-
-
|
17
|
+
- `data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、今後、そうでない場合があるかもしれない。
|
16
18
|
|
17
19
|
|
18
20
|
|
19
|
-
|
21
|
+
上記のような可能性が考えられますが、このうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
|
20
22
|
|
21
23
|
|
22
24
|
|
2
テキスト修正
test
CHANGED
@@ -12,7 +12,7 @@
|
|
12
12
|
|
13
13
|
- 質問では、`data1`および`data2`の要素は、どれも長さが2の配列であるが、今後、3以上になるかもしれない。(つまり、 `num`, `alpha` の次のサフィックスが追加されるかもしれない)
|
14
14
|
|
15
|
-
- 質問では、`data1`および`data2`の要素は、どれも長さが2で同じ長さであるが、今後、そうでない場合があるかもしれない。
|
15
|
+
- 質問では、`data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、今後、そうでない場合があるかもしれない。
|
16
16
|
|
17
17
|
|
18
18
|
|
1
テキスト修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのか
|
5
|
+
ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、
|
6
6
|
|
7
7
|
|
8
8
|
|
@@ -68,7 +68,7 @@
|
|
68
68
|
|
69
69
|
|
70
70
|
|
71
|
-
|
71
|
+
const result = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
|
72
72
|
|
73
73
|
|
74
74
|
|
@@ -80,7 +80,7 @@
|
|
80
80
|
|
81
81
|
|
82
82
|
|
83
|
-
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/
|
83
|
+
- **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/2](https://jsfiddle.net/jun68ykt/3w4je19o/2)
|
84
84
|
|
85
85
|
|
86
86
|
|