我已经将下面的函数编写为一个更大的应用程序的一部分,用于通过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;
}
}
答案 0 :(得分:3)
您的嵌套循环使用相同的变量i
,并且互相破坏状态。
for (i=0; i < records.length; i++){
...
for (i=0; i < count.length; i++){
...
}
使用不同的变量,比如i
和j
,或者更好的选择有意义的名称。
此外,您应该声明变量(var i
)以确保它们是函数的本地变量。
最后,使用++i
,而不是i++
。前者意味着增加i&#34;而后者意味着&#34;我,哦,顺便增加它&#34;。它们都递增i
,但后者返回旧值,这是在特殊情况下使用的特殊语言功能。
答案 1 :(得分: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);
});
}
另外,我注意到你将你的函数命名为与变量相同的名称,你也应该避免使用它。