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

时间:2016-01-23 01:48:58

标签: javascript loops

处理CoderByte问题并且第一个for循环不会在第一个或最后一个循环上执行。该功能是将每个字母转换为字母后面的下一个字母,然后将所有元音切换为大写。例如输入" coderbyte"正在回归" fpdfsczUE"什么时候应该是" dpdfsczUf"。所有变量和测试似乎都在起作用(见注释)。任何帮助将不胜感激 - 他们给出答案,但不解释为什么这不会起作用。

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; 

    }

2 个答案:

答案 0 :(得分:0)

您的问题输出不正确 &#34; coderbyte&#34;需要改为&#34; dpEfsczUf&#34;不是&#34; dp d fsczUf&#34;。

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

replaceAt功能可以提供帮助

下面修改后的代码可以正常工作

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; 

    }

答案 1 :(得分:0)

你误解了.replace()是如何工作的。 (参见Satyajit对你的问题的评论)这就是为什么你的功能的第二部分完美无缺;一旦元音被转换为大写,它就不能成为另一个角色转换的基础。

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

如果您使用调试器,或者在第一次循环分配后添加console.log(str),那么将会发生什么事情。