2013-06-25 65 views
0

试图编写一个简单的函数,将字符串作为输入,然后按字母顺序移动每个字符一次。 (a→b)(f→g)(z→a)。我的功能到目前为止已被打破。我确信有更好的方法可以解决这个问题,但如果有人愿意排除我的功能,那将是非常棒的。 :)Javascript:破信切换功能

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; 
+0

有什么你做了尝试解决这个问题?如果您告诉我们迄今为止已尝试的内容,我们将更愿意回答您的问题。 (询问更好的问题,帮助链接:[问] [求助]) – Doorknob

回答

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表示字符串。基本上,你将单个字符转换为数字,将这些数字加1并将其转换回一个字母。这里是一个Unicode编码表,显示每个字母的值:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec

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情况。

+0

,我会设置字符= str.charAt(我)? – JSNewb

+0

@JSNewb:除非你想修改你现有的字符串,否则我只需将新字符推入一个数组中(比如'result'),然后返回'result.join('')',它将所有字母连接在一起成一个字符串。 – Blender

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]的东西。

此外,你应该使用charAt(i)为一个字符串的字符获得,而不是标([]),你不必叫j=0for循环的结束,因为你已经说的j=0循环。

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在阵列中的位置,并将其后继者添加到新字符串中。

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