1

进行 CoderByte 挑战:

使用 JavaScript 语言,让函数 LetterChanges(str) 获取传递的 str 参数并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表中紧随其后的字母(即,c 变为 d,z 变为 a)。然后将这个新字符串中的每个元音(a、e、i、o、u)大写,最后返回这个修改后的字符串。

我的解决方案:

function LetterChanges(str) {
    var alphabet = "abcdefghijklmnopqrstuvwxyza",
        vowels = "aiueo",
        newstr = '';

    for (var i = 0; i < str.length; i++) {
        if (alphabet.indexOf(str[i]) != -1) {
            newstr += alphabet[alphabet.indexOf(str[i]) + 1];
        } else {
            newstr += str[i];
        }  
    }


    for (var i = 0; i < vowels.length; i++) {
        for (var j = 0; j < newstr.length; j++) {
            //toUppercase the vowel in the newstring once found
            if (newstr[j] == vowels[i]) {
                newstr[j] = newstr[j].toUpperCase(); 
            }
        }
   }
   return newstr;
} 

show(LetterChanges("fun times"));
show(LetterChanges("hello*3"));

toUpperCase()不将我想要的元音大写。但这似乎是正确的。我什至尝试过这样的事情:

if (newstr[j] == vowels[i]) {
   var toCap = newstr[j].toString();
   newstr[j] = toCap.toUpperCase();
}

如果您想到更好的解决方案,请回答该toUpperCase()部分,然后推荐其他解决方案。

4

5 回答 5

2

您可以创建另一个字符串来构建返回字符串,请参阅下面的代码中的修复

function LetterChanges(str) {
    var alphabet = "abcdefghijklmnopqrstuvwxyza",
        vowels = "aiueo",
        newstr = '',
        returnStr = ''; //added to next step

    for (var i = 0; i < str.length; i++) {
        if (alphabet.indexOf(str[i]) != -1) {
            newstr += alphabet[alphabet.indexOf(str[i]) + 1];
        } else {
            newstr += str[i];
        }  
    }


    for (var i = 0; i < vowels.length; i++) {
        for (var j = 0; j < newstr.length; j++) {
            //toUppercase the vowel in the newstring once found
            if (newstr[j] == vowels[i]) {
                returnStr += newstr[j].toUpperCase(); 
            }else{
                returnStr += newstr[j];
            }
        }
   }
   return returnStr ;
} 
于 2013-08-19T14:18:16.540 回答
2

Javascript 中的字符串是原始类型,而不是对象。

当您在原始类型(例如str[i] = 'a')中设置属性时,Javascript 会为该值创建一个新的装箱对象,对其进行变异,然后将其丢弃。

有关更多详细信息,请参阅规范

相反,您应该将新字符串组装到一个可变数组中,然后调用.join('')将其转换为字符串。

于 2013-08-19T14:03:52.460 回答
1

您可以通过replace和大写函数将元音大写:

newstr = newstr.replace(
           /[aeiou]/g,           // replace all vowels
           function(letter) {    // called for each match
             return letter.toUpperCase();
           }
         );

示例:http ://codepen.io/paulroub/pen/tvhcF

于 2013-08-19T14:04:41.323 回答
0

字符串的内容不能更改,即它们是不可变的。创建一个新字符串,而不是尝试就地编辑一个。

于 2013-08-19T14:00:33.010 回答
0

您可以使用以下代码使您的生活变得轻松

     function LetterChanges(str) { 

    return str.replace(/[a-zA-Z]/g,function(x) {
    return String.fromCharCode(x.charCodeAt(0)+1); }).replace(/[aeiou]/g,function(y) {
    return y.toUpperCase(); 
    });

  }
于 2015-07-22T03:59:40.807 回答