0

我有涉及用於計算給定陣列的所有可能的組合的以下功能的程序:高效的Javascript函數的組合,不崩潰瀏覽器

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的方法有效地結合起來,以阻止瀏覽器崩潰?

+1

我想使用setTimeout方法,你不得不將它應用到組合函數本身,而是應用到任何正在調用組合函數的循環中。一次生產66種組合應該不是那麼緊張。但網絡工作者可能是任何支持他們的瀏覽器的方式。 –

回答

2

這是使用web workers的好選擇,它可以在單獨的線程上運行您的代碼。

這樣,你就不會用密集計算來鎖定UI線程(這就是你現在看到的)。

0

爲什麼要構建數組?你可以迭代所有組合,並在循環內部完成工作。這應該大大加快你的邏輯,並使你適應瀏覽器強加的限制。