回答編集履歴

22

テキスト修正

2019/07/14 02:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -218,7 +218,7 @@
218
218
 
219
219
 
220
220
 
221
- この回答の冒頭に、入力データの様々な可能性について書きましたが、上記の関数 `makeCSVData`はそれらに対応しており、 以下のような入力でも適切に処理してCSV用のデータを生成します。
221
+ この回答の冒頭に、入力データの様々な拡張性について書きましたが、上記の関数 `makeCSVData`はそれらに対応しており、 以下のような入力でも適切に処理してCSV用のデータを生成します。
222
222
 
223
223
 
224
224
 

21

テキスト修正

2019/07/14 02:33

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -218,7 +218,7 @@
218
218
 
219
219
 
220
220
 
221
- この回答の冒頭に、入力データの様々な可能性について書きましたが、これらに対応して、上記の関数 `makeCSVData` 以下のような入力にも対応します。
221
+ この回答の冒頭に、入力データの様々な可能性について書きましたが、上記の関数 `makeCSVData`はそれらに対応しており、 以下のような入力でも適切処理てCSV用のデータを生成します。
222
222
 
223
223
 
224
224
 
@@ -276,4 +276,4 @@
276
276
 
277
277
 
278
278
 
279
- ご質問で提示された与件の範囲をかなり超えた大袈裟なものになっているかもれませんが、汎用化を進めると、こういうコードになるという一例として参考にして頂ければと思います。
279
+ 関数 `makeCSVData`は、ご質問で提示された与件の範囲をかなり超えた大袈裟なものになってしまが、先の様々な入力の拡張に対応させようとすると、こういうコードになるという一例として参考にして頂ければと思います。

20

テキスト修正

2019/07/14 02:22

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- 以下の回答は、上記のどれであっても、修正すべき箇所がなるべく分かりやすいように、という考え方で作成したコードです。
29
+ 以下は、上記の可能性のどれであっても、修正すべき箇所がなるべく分かりやすいように、という考え方で作成したコードです。このコードで作られる `data` は、ご質問にある `data` と同じ内容の配列になります。
30
30
 
31
31
 
32
32
 

19

テキスト修正

2019/07/13 22:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作るためのコードを挙げます。その後、追記にて、よりCSVに近い配列を作るコードを示します。
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

テキスト修正

2019/07/13 22:13

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- 上記のような可能性が考えられますが、このうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
25
+ 上記のような可能性が考えられますが、これらのうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
26
26
 
27
27
 
28
28
 

17

テキスト修正

2019/07/13 21:50

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 21:49

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作ることを目的としたコードを回答します。その後、追記にて、よりCSVに近い配列を作るコードを示します。
5
+ この回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作るためのコードを挙げます。その後、追記にて、よりCSVに近い配列を作るコードを示します。
6
6
 
7
7
 
8
8
 

15

テキスト修正

2019/07/13 21:47

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -218,7 +218,7 @@
218
218
 
219
219
 
220
220
 
221
- 以下のような入力にも対応します。
221
+ この回答の冒頭に、入力データの様々な可能性について書きましたが、これらに対応して、上記の関数 `makeCSVData` は以下のような入力にも対応します。
222
222
 
223
223
 
224
224
 

14

テキスト修正

2019/07/13 20:10

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 15:20

投稿

jun68ykt
jun68ykt

スコア9058

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
- と同じ内容の配列 `data` を作ることを目的としたコードを回答し、追記にて、よりCSVに近い配列を作るコードを示します。
5
+ 回答では、まず、ご質問に挙げられている、オブジェクトの配列 `var data`と同じ内容の配列を作ることを目的としたコードを回答します。その後、追記にて、よりCSVに近い配列を作るコードを示します。
22
6
 
23
7
 
24
8
 

12

テキスト修正

2019/07/13 15:17

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
 
120
120
 
121
- ご質問のコードにある `data` とは違う内容の配列になりますが、CSV を作るためにより適した配列ということでいえば、以下のような配列のほうがより目的とするCSVに近いと思います。
121
+ CSV を作るためにより適した配列ということでいえば、ご質問のコードにある `data` とは違う配列になりますが、以下のような配列のほうがよりCSVに近いと思います。
122
122
 
123
123
 
124
124
 

11

テキスト修正

2019/07/13 15:06

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -234,7 +234,7 @@
234
234
 
235
235
 
236
236
 
237
- 関数 makeCSVData は以下のような入力にも対応します。
237
+ 以下のような入力にも対応します。
238
238
 
239
239
 
240
240
 

10

テキスト修正

2019/07/13 14:46

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 14:44

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 14:43

投稿

jun68ykt
jun68ykt

スコア9058

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 result = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
93
+ const data = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
94
94
 
95
95
 
96
96
 
97
- console.log(result);
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/3](https://jsfiddle.net/jun68ykt/3w4je19o/3)
107
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/4](https://jsfiddle.net/jun68ykt/3w4je19o/4)
106
108
 
107
109
 
108
110
 

7

テキスト修正

2019/07/13 11:52

投稿

jun68ykt
jun68ykt

スコア9058

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
- によって作られる、オブジェクトの配列`data` と同じ内容の配列を作ることを目的としたコードを回答します。
21
+ と同じ内容の配列を作ることを目的としたコードを回答します。
22
22
 
23
23
 
24
24
 

6

テキスト修正

2019/07/13 09:38

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 09:36

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
 
68
68
 
69
- const tmp = Object.keys(data).map(k => data[k].map(e => toObj(e, k)));
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/2](https://jsfiddle.net/jun68ykt/3w4je19o/2)
85
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/3](https://jsfiddle.net/jun68ykt/3w4je19o/3)
86
86
 
87
87
 
88
88
 

4

テキスト修正

2019/07/13 08:27

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 08:15

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -2,21 +2,23 @@
2
2
 
3
3
 
4
4
 
5
- ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、
5
+ ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、以下が思いつきます。
6
6
 
7
7
 
8
8
 
9
- - 質問には、`data1` と `data2` しかないが、`data3`, `data4` ... と増える可能性がある。
9
+ 質問に挙げられてるコードでは、
10
10
 
11
- - 質問では、`data1` と `data2` はともに要素の数が3で同じだ、いつも同じとは限らない
11
+ - `data1` と `data2` しかない、`data3`, `data4` ... と増える可能性ある
12
12
 
13
- - 質問では、`data1`および`data2`要素は、どれも長さ2の配列あるが、今後、3以上になるかもしれな。(まり、 `num`, `alpha` の次のサフィックスが追加されるかしれない
13
+ - `data1``data2` はともに要素の数3同じだが、いつも同じとは限らない
14
14
 
15
+ - `data1`および`data2`の要素は、どれも長さが2の配列であるが、今後、3以上になるかもしれない。(つまり、 `num`, `alpha` の次のサフィックスが追加されるかもしれない)
16
+
15
- - 質問では、`data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、今後、そうでない場合があるかもしれない。
17
+ - `data1`および`data2`の要素である配列は、どれも長さが2で同じ長さであるが、今後、そうでない場合があるかもしれない。
16
18
 
17
19
 
18
20
 
19
- といったことが考えられますが、このうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
21
+ 上記のような可能性が考えられますが、このうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性も決まってきます。
20
22
 
21
23
 
22
24
 

2

テキスト修正

2019/07/13 07:55

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/07/13 06:54

投稿

jun68ykt
jun68ykt

スコア9058

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
- var result = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
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/1](https://jsfiddle.net/jun68ykt/3w4je19o/1)
83
+ - **動作確認用のサンプル:** [https://jsfiddle.net/jun68ykt/3w4je19o/2](https://jsfiddle.net/jun68ykt/3w4je19o/2)
84
84
 
85
85
 
86
86