2014-09-30 141 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); 
    }); 
} 

另外,我注意到你命名你的函数与你的变量名称相同,你应该避免这一点。