下面是一个计算给定数组所有可能组合的函数:
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]]
我有一个嵌套的 for 循环,它修改了 12 个对象的数组的副本(拼接某些元素,取决于循环的迭代),然后将它用作组合函数的参数并存储返回的数组的某些元素。
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返回消息:“此页面上的脚本可能正忙,或者可能已停止响应。您可以现在停止脚本,在调试器中打开脚本,或者让脚本继续。”)断点始终是调用组合函数的部分。
因为数组参数在每次迭代中都不同,所以我无法将组合函数调用分配给变量来优化代码。有没有更有效的方法来写这个?