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