尝试编写一个简单的函数来将字符串作为输入,然后按字母顺序将每个字符移过一次。 (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;
答案 0 :(得分:2)
您还可以使用charCodeAt
和fromCharCode
来实现转变。我可能会更友善一点:
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)
我在这里可以看到一些问题。
var str = "";
。 str
是您作为参数发送的变量,因此您可以使用此语句重置它。
if (str[i] == alphabet.length - 1)
。 str[i]
和alphabet.length - 1
不是相同的数据类型,因此该语句可能没有按照您的想法执行。也许你应该alphabet[alphabet.length - 1]
代替。
else if (str[i] == alphabet[j]) { str += alphabet[j]; //... }
。如果您没有像#1那样重置str
,这会在结果字符串中添加相同的字母。您应该使用类似alphabet[(j+1) % alphabet.size]
的内容。
此外,您应该使用charAt(i)
来获取字符串中的字符,而不是下标([]
),并且您不必在{{{{}}结束时调用j=0
1}}循环,因为你已经在循环中说for
。