我有一个程序,它涉及以下函数来计算给定数组的所有可能组合:
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个对象的数组参数,从该数组中返回两个可能的组合。有66种可能的组合。在我的程序中,我需要检查这个函数返回的数组的对象元素的属性值,比较它们,在它们上运行条件等。 但是当我调用使用这样的组合函数的函数时,浏览器会崩溃 (firefox返回信息:“此页面上的脚本可能正忙,或者它可能已停止响应。您可以立即停止脚本,在调试器中打开脚本,或让脚本继续。”)它始终是一部分以上组合的功能就是它被崩溃的功能。
我发现了这个:http://www.nczonline.net/blog/2009/01/13/speed-up-your-javascript-part-1/ 它是一种提高重复调用函数的代码效率的好方法(例如在组合函数中)。
如何有效地将组合功能与ncsonline中的方法集成以阻止浏览器崩溃?
答案 0 :(得分:2)
这是使用web workers的一个很好的候选者,它在一个单独的线程上运行你的代码。
这样,您就不会通过密集计算来锁定UI线程(这是您现在看到的)。
答案 1 :(得分:0)
为什么要构建阵列?你能不能遍历所有组合并在循环中完成工作。这应该会大大加快你的逻辑速度并使你适应浏览器强加的限制。