こんにちは。
この回答では、まず、ご質問に挙げられている、オブジェクトの配列 var dataと同じ内容の配列を作るためのコードを挙げます。その後、追記にて、よりCSVに近い配列を作るコードを示します。
ご質問の要件のうち、今後、何が変わる可能性があるのか?によって、書くコードが変わってくると思います。ご質問に挙げられている与件から、今後どうなる可能性があるのかを思いつくままに挙げてみると、以下が思いつきます。
ご質問に挙げられているコードでは、
data1 と data2 しかないが、data3, data4 ... と増える可能性がある。
data1 と data2 はともに要素の数が3で同じだが、いつも同じとは限らない。
data1およびdata2の要素は、どれも長さが2の配列であるが、今後、3以上になるかもしれない。(つまり、 num, alpha の次のサフィックスが追加されるかもしれない)
data1およびdata2の要素である配列は、どれも長さが2で同じ長さであるが、常にすべてが同じ長さとは限らない。
上記のような可能性が考えられますが、これらのうち、今後、何が変わるかもしれないのか(または、変わらないのか)がはっきりしていると、リファクタの方向性が決まります。
以下は、上記の可能性のどれであっても、修正すべき箇所がなるべく分かりやすいように、という考え方で作成したコードです。このコードで作られる data は、ご質問にある data と同じ内容の配列になります。
javascript
1const data1 = [
2 [1,'A'],
3 [2,'B'],
4 [3,'C']
5];
6
7const data2 = [
8 [4,'D'],
9 [5,'E'],
10 [6,'F']
11];
12
13const toObj = (ary, prefix) => ({
14 [`${prefix}-num`]: ary[0],
15 [`${prefix}-alpha`]: ary[1]
16});
17
18const dataObj = { data1, data2 };
19
20const tmp = Object.entries(dataObj).map(([k, ary]) => ary.map(e => toObj(e, k)));
21
22const data = tmp[0].map((e,i) => ({...e, ...tmp[1][i]}));
23
24console.log(data);
25
26
以上、参考になれば幸いです。
追記
CSV を作るためにより適した配列ということでいえば、ご質問のコードにある data とは違う配列になりますが、以下のような配列のほうがよりCSVに近いと思います。
javascript
1[
2 ["data1-num", "data1-alpha", "data2-num" ,"data2-alpha"],
3 [1,"A",4,"D"],
4 [2,"B",5,"E"],
5 [3,"C",6,"F"]
6]
そこで、上記のような配列を得るための、以下のような関数を作成しました。
javascript
1function makeCSVData(dataObj, columns) {
2 const keys = Object.keys(dataObj).sort();
3
4 const lengths = keys.reduce((m, k) => m.set(k, Math.max(...dataObj[k].map(ary => ary.length))), new Map());
5
6 const header = keys.reduce((ary, k) =>
7 ary.concat([...Array(lengths.get(k))].map((_, i) => `${k}-${columns[i]}`)), []);
8
9 const numRows = Math.max(...Object.values(dataObj).map(ary => ary.length));
10
11 const data = [...Array(numRows)].reduce((ary, _, i) => {
12 ary.push(keys.reduce((a, k) =>
13 a.concat(
14 dataObj[k][i] ?
15 [...dataObj[k][i], ...Array(lengths.get(k) - dataObj[k][i].length ) ] :
16 [...Array(lengths.get(k))]
17 ) ,[]));
18 return ary;
19 },
20 [header]);
21
22 return data;
23}
上記の関数 makeCSVData は以下のように使います。
javascript
1const data1 = [
2 [1,'A'],
3 [2,'B'],
4 [3,'C']
5];
6
7const data2 = [
8 [4,'D'],
9 [5,'E'],
10 [6,'F']
11];
12
13const data = makeCSVData({ data1, data2 }, ['num', 'alpha']);
この回答の冒頭に、入力データの様々な拡張性について書きましたが、上記の関数 makeCSVDataはそれらに対応しており、 以下のような入力でも適切に処理してCSV用のデータを生成します。
javascript
1const d1 = [
2 [1,'A'],
3 [2,'B'],
4 [3,'C'],
5 [-1,'a']
6];
7
8const d2 = [
9 [4,'D', true],
10 [5,'E'],
11 [6,'F', false, 100]
12];
13
14const d3 = [
15 [7,'X'],
16 [8,'Y'],
17 [9,'Z'],
18 [-7, 'x'],
19 [-8, 'y']
20];
21
22const data = makeCSVData({ d1, d2, d3 }, ['num', 'alpha', 'beta', 'gamma']);
関数 makeCSVDataは、ご質問で提示された与件の範囲をかなり超えた大袈裟なものになってしまいましたが、先の様々な入力の拡張に対応させようとすると、こういうコードになるという一例として参考にして頂ければと思います。