求める配列
Javascriptで次の例array1
から次のarray2
を作成したい。
(実行はGoogle Apps Script)
javascript
1array1 = [[0,1,2],[],[3,4,5]]; 2array2 = [[0.0, null, 3.0], [0.0, null, 4.0], [0.0, null, 5.0], 3[1.0, null, 3.0], [1.0, null, 4.0], [1.0, null, 5.0], 4[2.0, null, 3.0], [2.0, null, 4.0], [2.0, null, 5.0]];
つまりarray2
はarray1
の重複順列を拡張したみたいな順列パターンの配列です。
具体的に言うとarray1
の二次元目の配列から一つずつ要素を抽出した配列の配列がarray2
です。
発生している問題
一応上記を満たす関数を作ってみましたが、処理が多すぎてOOMエラーをはいてしまいます。
以下がその関数
javascript
1const dendrogram = stem => { 2 let answer =[]; 3 let returnedArray = []; 4 if(stem.length===1){ 5 let lastArray = []; 6 if(stem[0].length===0){ 7 lastArray.push([null]); 8 }else{ 9 for(let last of stem[0]){ 10 lastArray.push([last]); 11 } 12 } 13 answer=JSON.parse(JSON.stringify(lastArray)); 14 }else{ 15 returnedArray = JSON.parse(JSON.stringify(dendrogram(stem.slice(1)))); 16 if(stem[0].length===0){ 17 let returned = JSON.parse(JSON.stringify(returnedArray)); 18 answer = returned.map(ar=>{ 19 ar.unshift(null); 20 return ar; 21 }); 22 }else{ 23 let slisedArray = []; 24 for(let n of stem[0]){ 25 let returned = JSON.parse(JSON.stringify(returnedArray)); 26 slisedArray.push(returned.map(ar=>{ 27 ar.unshift(n); 28 return ar; 29 })); 30 } 31 for(let sliced of slisedArray){ 32 for(let sl of sliced){ 33 answer.push(sl); 34 } 35 } 36 } 37 } 38 return answer; 39};
arry1
の長さが小さければ処理できますが、自分が求めているarray1
がこんな感じです。
javascript
1array1 = [[0.0, 1.0, 2.0, 3.0, 4.0, 5.0], [], [], [0.0], [0.0, 21.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 313.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0], [], [0.0], [], 4[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 512.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0], [], [0.0, 61.0, 2.0, 3.0, 4.0, 5.0], [], [], [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 76.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 817.0, 18.0, 19.0, 20.0], [], [], [0.0], [0.0], [0.0, 1.0, 2.0, 93.0, 4.0, 5.0], [0.0], [], [], [0.0], [], [], [0.0, 1.0, 2.0, 103.0, 4.0, 5.0], [], [0.0], [], [], [0.0], [], [], [0.0, 1.0, 112.0, 3.0, 4.0, 5.0], [0.0, 1.0, 2.0, 3.0, 4.0, 5.0], [0.0, 1.0, 122.0, 3.0, 4.0, 5.0], [], []]
たったこれだけでarray2
の長さは約26億...
こちらの都合でarray1
の長さは38と決まっていますが、
二次元目の配列の長さは最大 ₃₉C₅=575,757 とふざけた数ですが、そうはならないように抑えています。
処理を速くしたい
プログラミング始めて1か月の人が作ったコードなのでだいぶ可読性低いと思いますが、処理を速くできる部分とか、そもそも再帰関数だから遅いとかあれば教えてください。