JavaScript For Loop保持循环无限

JavaScript For Loop Keeps Looping Infinity

本文关键字:循环 无限 For Loop JavaScript      更新时间:2023-09-26

我编写了下面的函数,作为通过web界面处理FASTA格式文件的更大应用程序的一部分。出于某种原因,当从makePretty()中调用我的baseCounts()函数时,它决定运行到无穷大。可能值得注意的是,这两个函数都由同一个父函数封装。

函数baseCounts()以100多个长数组的形式返回有效数据,console.log确认这不是罪魁祸首,所以问题出在makePretty()上。

欢迎任何帮助。

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

您的嵌套循环使用相同的变量i,并破坏彼此的状态。

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

使用不同的变量,比如ij,或者更好地选择有意义的名称。

此外,您还应该声明变量(var i),以确保它们是函数的本地变量。

最后,使用++i,而不是i++。前者的意思是"增加i",而后者的意思是是"i,顺便说一下,哦,增加它"。它们都递增i,但后者返回旧值,这是在特殊情况下使用的一种特殊语言功能。

您正在内部循环(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);
  });
}

此外,我注意到您将函数命名为与变量相同的名称,您也应该避免这样做。