Javascript不执行第一个和最后一个循环

Javascript不执行第一个和最后一个循环,javascript,loops,Javascript,Loops,处理CoderByte问题时,第一个for循环没有在第一个或最后一个循环上执行。其功能是将字母表中的每个字母转换为其后的下一个字母,然后将所有元音转换为大写字母。例如,输入“coderbyte”在应为“dpdfsczUf”时返回“fpdfsczUE”。所有变量和测试似乎都在运行(见注释)。任何帮助都将不胜感激——他们给出了答案,但不会解释为什么这样做行不通 function LetterChanges(str) { // convert every letter in a string

处理CoderByte问题时,第一个for循环没有在第一个或最后一个循环上执行。其功能是将字母表中的每个字母转换为其后的下一个字母,然后将所有元音转换为大写字母。例如,输入“coderbyte”在应为“dpdfsczUf”时返回“fpdfsczUE”。所有变量和测试似乎都在运行(见注释)。任何帮助都将不胜感激——他们给出了答案,但不会解释为什么这样做行不通

function LetterChanges(str) {
    // convert every letter in a string to the letter after in the alphabet, 
    // then convert all vowels to uppercase, and return the string.

      var alpha = "abcdefghijklmnopqrstuvwxyz";
      var vowels = "aeiou";

      for (var i=0; i<str.length; i++) {
        // return (alpha.indexOf(str[i]) !== -1); checks true on first loop
        if (alpha.indexOf(str[i]) !== -1) {
          //return alpha[alpha.indexOf(str[i]) + 1]; // returns d correctly
          // return alpha.indexOf(str[i]) + 1; // returns 3 correctly

          //return str[i]; returns "c" correctly
          // return str.replace(str[i], "X"); returns Xoderbyte correctly
          // return str.replace(str[i+1], alpha[alpha.indexOf(str[i]) + 1]); 
          //returns cdderbyte correctly
          //    BUG: why isn't the line below working on the first and last   
             //     loop ?
             //  ie. input "coderbyte" returns "fpdfsczUE"
            str = str.replace(str[i], alpha[alpha.indexOf(str[i]) + 1]);
        }

      }
      //return alpha[alpha.indexOf(str[i])];



      for (var j=0; j<str.length; j++) {
        if (vowels.indexOf(str[j]) !== -1) {
            str = str.replace(str[j], str[j].toUpperCase());
        }
      }
      return str; 

    }
功能字母更改(str){
//将字符串中的每个字母转换为字母表中的后一个字母,
//然后将所有元音转换为大写,并返回字符串。
var alpha=“abcdefghijklmnopqrstuvxyz”;
var元音=“aeiou”;

对于(var i=0;i您的问题输出不正确 “coderbyte”需要更改为“dpEfsczUf”,而不是“dpdfsczUf”

我们需要替换特定索引处的字符,因为
str.replace
只替换第一次出现的字符

功能有帮助

所以下面修改的代码可以工作

String.prototype.replaceAt=function(index, character) {
    return this.substr(0, index) + character + this.substr(index+character.length);
}

function LetterChanges(str) {
    // convert every letter in a string to the letter after in the alphabet,
    // then convert all vowels to uppercase, and return the string.

      var alpha = "abcdefghijklmnopqrstuvwxyz";
      var vowels = "aeiou";

      for (var i=0; i<str.length; i++) {
        if (alpha.indexOf(str[i]) !== -1) {
            str = str.replaceAt(i, alpha[alpha.indexOf(str[i]) + 1]);
        }

      }
      for (var j=0; j<str.length; j++) {
        if (vowels.indexOf(str[j]) !== -1) {
            str = str.replaceAt(j, str[j].toUpperCase());
        }
      }
      return str; 

    }
String.prototype.replaceAt=函数(索引,字符){
返回this.substr(0,索引)+字符+this.substr(索引+字符.长度);
}
功能更改(str){
//将字符串中的每个字母转换为字母表中的后一个字母,
//然后将所有元音转换为大写,并返回字符串。
var alpha=“abcdefghijklmnopqrstuvxyz”;
var元音=“aeiou”;

对于(var i=0;i您误解了.replace()的工作原理。(请参阅Satyajit对您的问题的评论)这就是为什么函数的第二部分可以完美地工作;一旦元音转换为大写,它就不能作为另一个字符转换的基础

关于第一个循环:如果在第一个循环之后的过程中的一个字母与最接近i=0的字母匹配,那么该字母将被替换,而不是您想要的字母


如果您使用调试器,甚至在第一个循环赋值后添加
console.log(str)
,情况会很明显。

您知道如何使用调试器吗(不是所有这些
retutn
语句都是真正的调试器)?想想如果重复字符会发生什么?例如,在第一次迭代后,字符串会被删除“doderbyte”。在第三次迭代中会发生什么?它会取代第三个“d”(预期)还是第一个“d”?谢谢Satyajit。Amit,没有准备一个完整的训练营,而且工作还没有涵盖。非常好的输入。非常感谢。