为什么不.toUpperCase()大写str [i]?

时间:2013-08-19 13:58:19

标签: javascript indexing capitalization

进行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 个答案:

答案 0 :(得分:2)

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

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

有关详细信息,请参阅spec

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

答案 1 :(得分: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 ;
} 

答案 2 :(得分: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

答案 3 :(得分:0)

字符串的内容无法更改,I.E。他们是不变的。创建一个新字符串,而不是尝试就地编辑它。