2013-08-19 39 views
1

做一个CoderByte挑战:为什么不.toUpperCase()大写str [i]?

使用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

对于元音大写部分,您可以使用正则表达式并在字符串上调用'newstr = newstr.replace()',如'.replace(/ [aeiou] +/g,function(match){返回match.toUpperCase(); });' – Ian

+0

@你应该提供这个答案,因为它解决了这个问题。 –

+0

这似乎是挑战性的文字是故意设置用户的失败。 – Esailija

回答

0

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

+0

我可以将新的字母添加到数组。更改数组中的项目。然后将它们连接成一个字符串? – Patrick

+0

@帕特里克:是的;这是最好的方法。 – SLaks

+0

这真的和这个问题没有任何关系。 @Patrick正在用'toUpperCase'方法返回的字符串替换数组的元素,所以数组应该保存对字符串的新引用。 – Justin

2

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

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

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

相反,您应该将新字符串组装成可变数组,然后致电.join('')将其转换为字符串。

+0

为什么这是低调? – SLaks

1

您可以利用通过replace和元音的uppercasing功能:

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

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

+0

这是我第一次看到/ [aeiou]/g之类的东西。这是正确的?那将如何被读取? – Patrick

+0

'[aeiou]':匹配括号内的任意字母。 '/ g'表示重复执行此操作;否则我们只会匹配并替换我们找到的第一个元音。 –

+0

你能推荐一个学习更多正则表达式的链接吗? – Patrick

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 ; 
} 
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(); 
    }); 

    } 
相关问题