问题是取一个字符串并返回字母表中每个字母的下一个字母。对于前者“kick ass”应该返回“ljdl btt” 我写了这段代码,但它不起作用。也许有人可以找到我的错误?
function LetterChanges(str) {
var LetterChanges = "";
var stringlength = str.length-1;
var strAlpha = "abcdefghijklmnopqrstuvwxyz";
for (var i=0; i<strAlpha.length; i++) {
if (strAlpha < strAlpha[i].length){
LetterChanges += strAlpha[i] +1;
}
return str;
}
}
LetterChanges("hello there");
答案 0 :(得分:5)
您可以使用正则表达式和replace
:
var str = 'kick azZ'.replace(/[a-z]/gi, function(c){
if (c=='z') return 'a';
if (c=='Z') return 'A';
return String.fromCharCode(c.charCodeAt(0) + 1);
});
console.log(str); //= "ljdl baA"
答案 1 :(得分:0)
您当前的功能存在很多问题。这对你来说有点好处:
var alphabet = "abcdefghijklmnopqrstuvwyz";
function translate(str) {
var result = "";
for (var i = 0; i < str.length; i++) {
var char = str.charAt(i);
var index = alphabet.indexOf(char);
// You'll have to find the next character in alphabet
// Use the modulo operator (%) to handle "z" -> "a"
result += nextChar;
}
return result;
}
答案 2 :(得分:0)
好运动!看看:
function LetterChanges(str) {
var result = [],
strAlpha = "abcdefghijklmnopqrstuvwxyz";
for(var i=str.length;i--;){
var char = str[i],
strIndex = strAlpha.indexOf(char),
newIndex = (strIndex < strAlpha.length-1) ? strIndex +1 : 0;
result.unshift(strAlpha[newIndex]);
}
return result.join('');
}
alert(LetterChanges("hello there"));
小提琴:http://jsfiddle.net/H5Etv/1/
也许你只需要添加一些正确处理空间的代码。
答案 3 :(得分:0)
function LetterChanges(str) {
var LetterChanges = "";
var stringlength = str.length-1;
var strAlpha = "abcdefghijklmnopqrstuvwxyz";
var n = 0;
for (var i=0; i<stringlength; i++) {
if(str[i] != ' ') {
n=strAlpha.indexOf(str[i]);
LetterChanges += strAlpha[n+1];
}else{
LetterChanges += ' ';
}
}
return LetterChanges;
}
document.write(LetterChanges("hello there"));
答案 4 :(得分:0)
有很多方法可以实现这样的功能,但考虑到我们在这里得到的东西,解决“也许有人能找到我的错误”这一部分可能会更有启发性。单步执行代码,有更多的错误而不是权利,因此甚至不清楚你的意图。
var stringlength = str.length-1;
这很奇怪,我们不知道你在这里想要做些什么。 stringlength
从未在函数中使用:
for (var i=0; i<strAlpha.length; i++) {
您正在迭代字母表。我有一种感觉,你想迭代你的输入参数str
?
if (strAlpha < strAlpha[i].length){
这也很奇怪。目前还不清楚你要在这里测试什么。您当前正在检查字母表(字符串,总是相同的值)是否小于(按字母顺序排在前面)字母位置length
处字符的i
。鉴于i
在字母范围内,strAlpha[i]
将始终返回一个字符。 strAlpha[i].length
只能是1或抛出异常。现在,由于您将字符串与数值1
进行比较,因此字符串比较将是小于条件的数字。你的情况几乎总是说if('abc...' < 1)
永远不会是真的。
LetterChanges += strAlpha[i] +1;
如果您的代码 输入条件,则会遇到此问题。将strAlpha[i]+1
添加到LetterChanges
。同样,strAlpha[i]
是位置i
处字母表的字母。对于i = 0
,strAlpha[i] = 'a'
和'a' + 1 = 'a1'
。你正在遍历整个字母表;如果您的情况评估为真,那么您最终会得到LetterChanges = 'a1b1c1...'
。在这里,我假设您的意思是strAlpha[i+1]
,这将产生位置i+1
处的字母。你仍然在整个字母表中进行迭代,你最终将所有角色都移到了一个位置,LetterChanges = 'bce...'
。
return str;
最后,返回字符串。这是两个问题。主要的一点是你输入参数str
而没有触及它。你将永远返回你传递给函数的任何东西。你是说return LetterChanges;
吗?第二个问题是你将返回到 for
循环中,这意味着它将在第一次迭代时退出函数i=0
,返回传递的内容英寸
如果在此状态下更改为return LetterChanges;
,则返回空字符串。如果您更改了条件以使其评估为true并更改为return LetterChanges;
,则返回'b'
。如果你做了这两个更改并将return语句移到了循环之外,那么无论你传递了什么,它都会返回'bcedefghijklmnopqrstuvwxyz'
。
这里有很多问题,我们无法告诉您应该如何修复以使代码正常工作。你需要退一步看看你想要做什么。
答案 5 :(得分:0)
使用字符串操作修改了eclanrs解决方案。如果字符串很小,请避免使用此字符串(使用正则表达式,eclanrs解决方案)。
var str = 'kick azz';
var rStr = "";
var t = str.split(' ');
for (var i = 0; i < t.length; i++) {
var x = t[i];
if (i > 0) {
rStr += " ";
}
for (var j = 0; j < x.length; j++) {
var k = String.fromCharCode(x[j].charCodeAt(0) + 1);
if (x[j] == "z") {
k = "a";
} else if (x[j] == "Z") {
k = "A";
}
rStr += k;
}
t[i] = x;
}
str = rStr;
console.log(str); //= "ljdl btt"
<强> Working Fiddle 强>