Javascript:破信移位功能

时间:2013-06-25 19:29:33

标签: javascript string translation alphabetical

尝试编写一个简单的函数来将字符串作为输入,然后按字母顺序将每个字符移过一次。 (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 个答案:

答案 0 :(得分:2)

您还可以使用charCodeAtfromCharCode来实现转变。我可能会更友善一点:

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

答案 1 :(得分: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.length会在z的情况下将其环绕到开头。

答案 2 :(得分: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数组中找到它的位置,并将其后继字符添加到新字符串中。

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

答案 3 :(得分: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]; //... }。如果您没有像#1那样重置str,这会在结果字符串中添加相同的字母。您应该使用类似alphabet[(j+1) % alphabet.size]的内容。

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