2015-10-17 57 views
3

我试图用字母后面的字母替换字符串中的每个字母。JavaScript将字符串中的每个字母替换为字母后面的字母错误

例如:

a -> b 
b -> c 
c -> d 

等。

function LetterChanges(str) { 
    for (var i = 0; i < str.length; i++) { 
     if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
      str = str.replace(str.charAt(i), String.fromCharCode(str.charCodeAt(i) + 1)); 
     } 
    } 
    return str; 
} 

所以我测试了一些字符串输入,我的“鳕鱼”有错误,我的代码返回“环保署”,而不是“DPE”,能有人帮我修复它?

谢谢。

回答

0

在循环播放时更改str并不是一个好主意。

这里是适用的功能,将工作。

function LetterChanges(str) { 
    var strOut=''; 
    for (var i = 0; i < str.length; i++) { 
     if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
      strOut += String.fromCharCode(str.charCodeAt(i) + 1); 
     } 
    } 
    return strOut; 
} 
3

由于您的replace不限于在字符串中的特定位置,它会在每次更换第一匹配的字符。 (它不会取代全部,因为它没有设置g修饰符。)因此,首先将您的领先c替换为d,下一轮将o替换为p - 然后在第三轮中,当您的输入已经是dpd,因此您获得epd,因为第一个d已被替换为e

这会更容易些,如果你没有使用replace,而只是建立一个字符串,你追加对当前输入的字符每次匹配的“下一个”字符,然后在结束时,您只需返回新的字符串。

编辑:

此外,您目前的实现不处理z正确的,因为它与“下”字{替换它,而应该宁可是一个a。而Z则变为[,应改为A。在Za之间,还有一些非字母字符,您可能不想替换。

这里是一个函数,实现了我上面的建议,并且也需要zZ,以及非字母考虑:

function LetterChanges(str) { 
    var result = ""; 
    for (var i = 0; i < str.length; i++) { 
     // handle "z" 
     if (122 == str.charCodeAt(i)) { 
      result += "a"; 
     // handle "Z" 
     } else if (90 == str.charCodeAt(i)) { 
      result += "A"; 
     // handle all other letter characters 
     } else if ((65 <= str.charCodeAt(i) && str.charCodeAt(i) <= 89) || 
        (97 <= str.charCodeAt(i) && str.charCodeAt(i) <= 121)) { 
      result += String.fromCharCode(str.charCodeAt(i) + 1); 
     // append all other characters unchanged 
     } else { 
      result += str.charAt(i); 
     } 
    } 
    return result; 
} 

console.log(LetterChanges("AaZz+cod!foo")); // output: BbAa+dpe!gpp 

http://jsfiddle.net/hvyft64p/3/

if ((65 <= str.charCodeAt(i) && str.charCodeAt(i) <= 89) || 
    (97 <= str.charCodeAt(i) && str.charCodeAt(i) <= 121)) 

我用八十九分之六十五和97/121,和<=这里进行比较,因为从逻辑的角度来看,这对我来说更有意义 - 这些是我们想要考虑的实际“边界”字母,A/Y和d a/y,所以使用这些数字直接使代码更具可读性。

+0

非常感谢你的明确书面解释! – Jackie

3

让我们来看看代码将与输入cod做:

  • 过程c,在字母一个字母为d,更换cd,结果是dod
  • 过程o,在字母一个字母是p,更换为op,结果是dpd
  • 过程d,在字母一个字母是e,更换de,结果是epd

您看到在步骤3的错误? replace用您使用它的方式替换字母的第一次出现。一种解决方案是通过向其附加下一个字母来创建新的字符串。例如:

var newString = ''; 
for (var i = 0; i < str.length; i++) { 
    if (96 < str.charCodeAt(i) && str.charCodeAt(i) < 123) { 
     newString += String.fromCharCode(str.charCodeAt(i) + 1); 
    } 
} 
return newString; 

顺便说一句,你的代码也有一个细微的错误。如果您的字符串包含z它将被替换为{。您可能想回到字母表的开头,并在此情况下将其替换为a

+0

为什么你使用一个数组作为'newString'而不是一个字符串? –

+0

@QuentinRoy更新。可能是更好的解决方案来使用String。也许还[更快](https://jsperf.com/string-concat-vs-array-join-10000/2)。谢谢 –

0

看起来像一个典型的切扎尔的密码给我(较低alplha和右移)

function cezarCipher(str,step){ 
var res=""; 
step=step%26; //make sure the step is in range 
for(var i=0,j=str.length;i<j;i++){ 
    var nextCode=str.charCodeAt(i)+step; 
    if(nextCode>122){ 
     nextCode=96+(nextCode-123+1); 
    } 
    res+=String.fromCharCode(nextCode); 
} 
return res; 
} 

使步= 1,让您的结果。

相关问题