0

问题是获取一个字符串并为字符串的每个字母返回字母表中的下一个字母。例如。“踢屁股”应该返回“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");         
4

6 回答 6

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"
于 2013-07-02T06:29:41.670 回答
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;
}
于 2013-07-02T06:32:02.693 回答
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/

也许您只需要添加一些代码即可正确处理空间。

于 2013-07-02T06:36:41.487 回答
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"));
于 2013-07-02T06:40:06.390 回答
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]+1LetterChanges. 再次,strAlpha[i]是字母表中的字母i。对于i = 0,strAlpha[i] = 'a''a' + 1 = 'a1'. 您正在遍历整个字母表;如果您的条件评估为真,您最终会得到LetterChanges = 'a1b1c1...'. 在这里,我将假设您的意思是strAlpha[i+1],这将在 position 处产生字母表中的字母i+1。您仍在遍历整个字母表,最终会将所有字符向上移动一个位置,LetterChanges = 'bce...'.

return str; 

最后,您返回字符串。这里有两个问题。主要的一个是您返回输入参数str而从未接触过它。您将始终返回您传递给函数的任何内容。你的意思是return LetterChanges;?第二个问题是您在循环中返回它for这意味着它将在第一次迭代时退出函数,i=0返回传入的任何内容。

如果您更改为return LetterChanges;处于此状态,它将返回一个空字符串。如果您更改条件以使其评估为 true 并更改为return LetterChanges;它会返回'b'。如果您同时进行了这些更改并将 return 语句移到了循环之外,那么'bcedefghijklmnopqrstuvwxyz'无论您传递了什么,它都会返回。

这里有很多问题,我们无法告诉你应该修复什么才能让你的代码正常工作。您需要退后一步,看看您正在尝试做什么。

于 2013-07-02T06:48:07.197 回答
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"

工作小提琴

jsperf

于 2013-07-02T07:05:43.907 回答