以下は、指定された配列の可能なすべての組み合わせを計算する関数です。
function combinations(arr, k) {
var i, subI, sub, combinationsArray = [], next;
for (i = 0; i < arr.length; i++) {
if (k === 1) {
combinationsArray.push([arr[i]]);
} else {
sub = combinations(arr.slice(i + 1, arr.length), k - 1);
for (subI = 0; subI < sub.length; subI++) {
next = sub[subI];
next.unshift(arr[i]);
combinationsArray.push(next);
}
}
}
return combinationsArray;
};
例えば:
combinations([1,2,3],2);
戻り値:
[[1,2],[1,3],[2,3]]
組み合わせ関数のパラメーターとして使用し、返された配列の特定の要素を格納する前に、12 個のオブジェクトの配列のコピーを変更するネストされた for ループがあります (ループの反復に応じて、特定の要素を接合します)。
var resultArray = [];
var paramArray = [obj1,obj2,obj3,obj4,obj5,obj6,obj7,obj8,obj9,obj10,obj11,obj12];
for(i=0;i<length1;i++){
for(n=0;n<length2;n++){
paramArray.splice(...);//modifying array
resultArray[n] = combinations(paramArray,2)[i].slice();//storing an element, there are multiples of each element in the resultArray obviously
}
}
上記のタイプのコードでブラウザーがクラッシュします (firefox は次のメッセージを返します: 「このページのスクリプトがビジーであるか、応答を停止している可能性があります。今すぐスクリプトを停止するか、デバッガーでスクリプトを開くか、スクリプトをそのままにしてください。 continue.") ブレークポイントは常に、呼び出される組み合わせ関数の部分です。
配列パラメーターは反復ごとに異なるため、組み合わせ関数呼び出しを変数に割り当ててコードを最適化することはできません。これを書くより効率的な方法はありますか?