JavaScript将字符串中的每个字母替换为字母表错误中紧跟其后的字母

JavaScript将字符串中的每个字母替换为字母表错误中紧跟其后的字母,javascript,Javascript,我试图用字母表中紧跟其后的字母替换字符串中的每个字母 例如: a -> b b -> c c -> d 等等 功能字母更改(str){ 对于(变量i=0;i

我试图用字母表中紧跟其后的字母替换字符串中的每个字母

例如:

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

功能字母更改(str){
对于(变量i=0;i
所以我用一些字符串输入测试,我在“cod”上出错,我的代码返回“epd”而不是“dpe”,有人能帮我修复它吗


谢谢。

在循环时更改
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;
}
功能字母更改(str){
var strOut='';
对于(变量i=0;i
由于您的
替换
不限于字符串中的特定位置,因此每次都将替换第一个匹配字符。(它不会全部替换,因为它没有设置
g
修饰符。)因此,首先你的前导
c
d
替换,下一轮将
o
替换为
p
——然后,在第三轮,当你的输入已经是
dpd
,你会得到
epd
,因为第一个
d
已被
e
替换

如果您不使用
replace
,而是简单地构建一个新字符串,每次都为当前输入字符添加匹配的“next”字符,然后在最后简单地返回该新字符串,那么这将更容易

编辑:

此外,您当前的实现没有正确处理
z
,因为它将其替换为“下一个”字符
{
,而该字符应该是
a
,并且
z
将变为
[
,应该是
A
。在
Z
A
之间,还有一些非字母字符,您可能也不想替换它们

下面是一个函数,它实现了我上面建议的功能,并且还考虑了
z
z
,以及非字母:

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
功能字母更改(str){
var结果=”;
对于(变量i=0;i}否则如果((65让我们看看代码将如何处理输入
cod

  • 处理
    c
    ,字母表中的下一个字母是
    d
    ,将
    c
    替换为
    d
    ,结果是
    dod
  • 处理
    o
    ,字母表中的下一个字母是
    p
    ,将
    o
    替换为
    p
    ,结果是
    dpd
  • 处理
    d
    ,字母表中的下一个字母是
    e
    ,将
    d
    替换为
    e
    ,结果是
    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;
var newString='';
对于(变量i=0;i


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

在我看来像是一个经典的塞扎密码(对于低阿尔法和右移)

函数cezarCipher(str,step){
var res=“”;
步骤=步骤%26;//确保步骤在范围内
对于(变量i=0,j=str.length;i122){
nextCode=96+(nextCode-123+1);
}
res+=String.fromCharCode(nextCode);
}
返回res;
}

将步骤设为1以获得结果。

为什么将数组用作
newString
而不仅仅是字符串?@QuentinRoy已更新。使用字符串可能是更好的解决方案。也可能。谢谢
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;
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;
}