2014-09-30 95 views
0

我已經編寫了下面的函數,作爲通過Web界面處理FASTA格式化文件的更大的應用程序的一部分。出於某種原因,它決定在makePretty()內調用我的baseCounts()函數時遇到無窮大。值得注意的是,這兩個函數都是由相同的父函數封裝的。JavaScript For Loop保持無限循環

函數baseCounts()以100+長數組的形式返回有效數據,console.log證實不應該責怪所以問題必須與makePretty()一起使用。

任何幫助,歡迎。

function baseCount(records){ 
 
\t \t // Count instances of Bases in array 
 
\t \t var basecounts = Array(); 
 
\t \t for (i=0; i < records.length; i++){ 
 
\t \t \t var record = records[i]; 
 
\t \t \t console.log(record); 
 
\t \t \t var count = [record.match(/A/g), record.match(/T/g), record.match(/C/g), record.match(/G/g)]; 
 
\t \t \t var basecount = Array(); 
 
\t \t \t for (i=0; i < count.length; i++){ 
 
\t \t \t \t basecount.push(count[i].length); \t \t \t \t 
 
\t \t \t } 
 
\t \t \t // return array of occurance 
 
\t \t \t basecounts.push(basecount); 
 
\t \t } 
 
\t } 
 
\t 
 
\t function makePretty(fasta){ 
 
\t \t // Make FASTA more human friendly 
 
\t \t 
 
\t \t var data = Array(); 
 
\t \t var basecounts = Array(); 
 
\t \t var bases = Array(); 
 
\t \t console.log(fasta.length); 
 
\t \t 
 
\t \t // Generate base array 
 
\t \t for (i=1; i < fasta.length; i++){ 
 
\t \t \t bases.push(fasta[i][2]) 
 
\t \t } 
 
\t \t basecounts = baseCount(bases); // RUNS INTO INFINITY 
 
\t \t 
 
\t \t 
 
\t \t for (i=0; i < fasta.length; i++){ 
 
\t \t \t \t 
 
\t \t \t var record = Array(); 
 
\t \t \t record.push(i); // Add protein number 
 
\t \t \t record.push(fasta[i][0]); // Add NC_# 
 
\t \t \t record.push(fasta[i][1]); // Add base index 
 
\t \t \t _record = fasta[i][2]; 
 
\t \t \t var l_record = _fasta.length; // Protein length 
 
\t \t \t //var basecount = baseCount(_record); 
 
\t \t \t var cg_content; 
 
\t \t \t 
 
\t \t } 
 
\t }

+0

你能否請你證明你是如何造成這個錯誤的? – shmuli 2014-09-30 20:50:21

+0

你會遇到各種使用相同變量名稱的嵌套循環的麻煩(你真的應該用'var'來聲明)。在JS中,這些範圍是最接近的函數,而不是閉包。內部循環使用不同的字母。 – Antiga 2014-09-30 20:51:50

回答

3

你的嵌套的循環使用相同的變量i,並破壞其他的狀態。

 for (i=0; i < records.length; i++){ 
      ... 
      for (i=0; i < count.length; i++){ 
       ... 
      } 

使用不同的變量,說ij或者更好的挑選有意義的名稱。

此外,您應該聲明變量(var i)以確保它們對函數是本地的。

最後,使用++i而不是i++。前者意味着「增加我」,而後者意味着「我,而哦,增加它」。它們都增加i,但後者返回舊值,這是在特殊情況下使用的特殊語言功能。

+1

您肯定希望迭代器在99.99%的情況下循環執行一次後遞增。除此之外,你發現。 edit-第三條語句在循環後執行(@Sam),但沒有任何真正的理由將它改爲++ i。 – Antiga 2014-09-30 20:56:07

+0

@Antiga我會在循環後遞增,無論它是++ i還是i ++,所以任何一個都可以。增量語句直到循環內的塊運行一次才執行。 – Sam 2014-09-30 20:58:17

0

您正在重置您的內部循環(i)中的變量計數器。爲了避免這種情況,以及未來的問題以及提出問題,我建議使用更新的函數,如forEach或map。你也可以這樣清理你的代碼:

function baseCountFunc(records){ 
    // Count instances of Bases in array 
    var basecount = []; 
    records.forEach(function(record) { 
    var count = [record.match(/A/g), record.match(/T/g), record.match(/C/g), record.match(/G/g)]; 
    count.forEach(function(countElement) { 
     basecount.push(countElement.length); 
    }); 
    basecounts.push(basecount); 
    }); 
} 

另外,我注意到你命名你的函數與你的變量名稱相同,你應該避免這一點。