0

尝试编写一个简单的函数以将字符串作为输入,然后按字母顺序将每个字符移动一次。(a -> b) (f -> g) (z -> a)。到目前为止,我的功能已损坏。我确信有更好的方法来解决这个问题,但如果有人愿意对我的功能进行故障排除,那就太棒了。:)

function translate(str) {
  var alphabet = ['a','b','c','d','e','f','g','h','i','j','k',
                'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
  str.toLowerCase();
  var i = 0;
  var j;
  //edit: deleted str = ""

while (i < str.length) {
  for (j = 0; j < alphabet.length; j++) {
    if (str[i] == alphabet[alphabet.length - 1]) { //changed data type
        str += alphabet[0]
        j=0;
      } else if (str[i] == alphabet[j]) {
        str += alphabet[j+1]; //fixed this
        j=0;
      } else {
        i++; 
      }
    }
  }
  return str; 
4

4 回答 4

2

您也可以使用charCodeAtandfromCharCode来实现您的换档。我可能会更方便一点:

function translate(str) {
    res = [];
    for (var i = 0; i < str.length; i++) {
        var ch = str.charCodeAt(i);

        //65 => A
        //90 => Z
        //97 => a
        //122 => z

        //if ch betweet A and Z or between a and z
        if ((ch >= 65 && ch <= 90) || (ch >= 97 && ch <= 122)) {
            //if z or Z transform to a or A respectively
            if (ch === 90 || ch === 122) ch -= 25;
            //else increase by one
            else ch += 1;
        }
        res.push(ch);
    }
    return = String.fromCharCode.apply(this, res);
}

这两种方法都使用字符串的 unicode 表示。本质上,您将单个字符转换为数字,将这些数字加一并将其转换回字母。这是一个显示每个字母值的 unicode 表:http ://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec

于 2013-06-25T19:43:52.750 回答
1

这是一种方法:

function translate(str) {
  var newStr = "";
  var alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];

  for (var i = 0; i < str.length; i++) {
    var currentLetter = str.substring(i, i+1);
    var newLetter = alphabet[(alphabet.indexOf(currentLetter.toLowerCase()) + 1) % alphabet.length]; 
    // preserve the case of the letter
    newStr += (currentLetter === currentLetter.toUpperCase()) ? newLetter.toUpperCase() : newLetter;
  }

  return newStr;
}

总体思路是遍历每个字符,找到它在alphabet数组中的位置,并将其后继添加到新字符串中。

如果您需要它来处理包含符号、数字等的字符串,则必须添加更多逻辑。

于 2013-06-25T19:45:38.443 回答
1

你的逻辑有点问题。只需遍历字符串并将该indexOf方法与模运算符一起使用:

var index = alphabet.indexOf(char.toLowerCase());

if (index === -1) {
    // char isn't in the alphabet, so you should skip it
} else {
    var newChar = alphabet[(index + 1) % alphabet.length];
}

(index + 1)添加1到索引,该索引选择下一个字母,并% alphabet.lengthz.

于 2013-06-25T19:36:23.313 回答
0

我可以在这里看到一些问题。

  1. var str = "";. str是您作为参数发送的变量,因此您可以使用此语句重置它。

  2. if (str[i] == alphabet.length - 1). str[i]并且alphabet.length - 1不是相同的数据类型,所以这个语句可能没有做你认为应该做的事情。也许你应该有alphabet[alphabet.length - 1]

  3. else if (str[i] == alphabet[j]) { str += alphabet[j]; //... }. str如果您没有像 #1那样重置,这会将相同的字母添加到您的结果字符串中。你应该有类似的东西alphabet[(j+1) % alphabet.size]

此外,您应该使用charAt(i)for 获取字符串中的字符,而不是下标 ( []),并且您不必j=0在循环结束时调用for,因为您已经在循环中说过j=0

于 2013-06-25T19:39:45.300 回答