2015-07-12 166 views
0

不确定为什么下面的代码不起作用。它应该采用一个字符串并将G转换为C,将A转换为T,反之亦然。然而,它收集的输入字符串,但即警告只是说:“这是你的反向互补DNA”将值传递给javascript中的函数

var dnaSequence = prompt("Enter your DNA sequence here", ""); 
var newSequence = reverseComplement(dnaSequence); 
alert("here is your reverse complemented DNA: " + newSequence); 

function reverseComplement(dnaString) { 

    var reverseC = []; 
    var dnaArr = dnaString.split(''); 

    for (var i = 0; i < dnaArr.length; i++) { 

     switch (dnaArr[i]) { 
      case 'A': 
       reverseC.push('T'); 
       break; 
      case 'T': 
       reverseC.push('A'); 
       break; 
      case 'C': 
       reverseC.push('G'); 
       break; 
      case 'G': 
       reverseC.push('C'); 
       break; 
     } 
    } 

    // Reverse and rejoin the the string  
    return reverseC.reverse().join(''); 
} 
+0

由于提示中的数据为空 –

+0

您发布的代码正常工作。 – Pointy

+0

您的代码有效。只要确保输入处于大写状态,并注意除A,T,C和G之外的字母不会被添加到reverseC。也许你应该改变它? – yts

回答

1

应该采取一个串并转换A G为C和不提供任何输出A到T,反之亦然。

然后,您不需要reverse(),因为您按顺序推送。

另外,请确保您在提示中输入了大写字母。 否则,你可以强制大写。

这是两个补丁代码:

function reverseComplement(dnaString) { 

    var reverseC = []; 
    var dnaArr = dnaString.toUpperCase().split(''); 

    for (var i = 0; i < dnaArr.length; i++) { 

     switch (dnaArr[i]) { 
      case 'A': 
       reverseC.push('T'); 
       break; 
      case 'T': 
       reverseC.push('A'); 
       break; 
      case 'C': 
       reverseC.push('G'); 
       break; 
      case 'G': 
       reverseC.push('C'); 
       break; 
     } 
    } 

    // Reverse and rejoin the the string  
    return reverseC.join(''); 
} 

var dnaSequence = prompt("Enter your DNA sequence here", ""); 
var newSequence = reverseComplement(dnaSequence); 
alert("here is your reverse complemented DNA: " + newSequence); 
+0

这在JavaScript中是不必要的。函数声明被视为出现在词法单元的开始处,而不管它们实际出现在哪里。 – Pointy

+0

没有必要在顶部定义它。无论如何,函数会移动到顶部。但是,代码工作正常。只要确保输入是大写 – yts

+0

好的,感谢您的输入,我会编辑 – jperelli

0

你所需要的是如何测试和调试JavaScript代码的主要教训。

首先,熟悉浏览器中的JavaScript调试器。与其想知道为什么你的代码不起作用,你可以直接看到它在做什么。每个现代浏览器都有内置的JavaScript调试工具;例如这里是一个introduction to the Chrome DevTools

其次,当您正在测试这样的功能时,请不要使用prompt()alert()。相反,请提供硬编码的输入字符串,并使用console.log()在JavaScript调试控制台中显示输出。这样你可以重复运行相同的测试用例。在您获得一个测试用例后,您可以添加其他测试用例。

有几个JavaScript的测试框架,如果你想获得幻想,但随着开始,只需使用JavaScript调试器的硬编码的输入和输出console.log()加上检查罚款。

为了便于在第一次写入时调试函数,请在开始处添加一条debugger;语句。然后它将停止在调试器中,并且您可以单步执行代码,以查看函数的哪些部分实际得到执行,以及您的每个步骤中的所有变量值。

例如(因为它听起来像是你被误用小写输入测试),你可以这样做:

var dnaSequence = 'actg'; 
var newSequence = reverseComplement(dnaSequence); 
console.log(newSequence); 

function reverseComplement(dnaString) { 
    debugger; 

    var reverseC = []; 
    var dnaArr = dnaString.split(''); 

    for (var i = 0; i < dnaArr.length; i++) { 

     switch (dnaArr[i]) { 
      case 'A': 
       reverseC.push('T'); 
       break; 
      case 'T': 
       reverseC.push('A'); 
       break; 
      case 'C': 
       reverseC.push('G'); 
       break; 
      case 'G': 
       reverseC.push('C'); 
       break; 
     } 
    } 

    // Reverse and rejoin the the string  
    return reverseC.reverse().join(''); 
} 

现在,如果你有DevTools的开通,将在调试器停在第一你的功能线。您可以单步执行该函数以查看它实际发生的哪个case声明,并且您将看到它不会转到其中的任何声明。您还可以查看dnaArr[i]的值并查看它是否与case值中的任何值匹配。

+0

这非常有帮助,谢谢 – neemie