为什么我的 indexOf 和 for 循环不能正常工作?
Why are my indexOf and for loop not working properly?
我的目标是每个字母前进三个,例如,'a'变成'd','z'变成'c'等等,忽略不是字母的字符.我无法理解 for 循环和后面关于我的变量 char 的 if/else if/else 语句。我也不明白为什么我得到 lc.indexOf(char) = -1
,好像它甚至不在我的数组中。
以下是关于我所尝试的时间线:
我将字符串转换为数组,因为 JS 不接受 for 循环中的字符串,如 str 中的 char...它会告诉我它需要是一个对象,所以我使用了 .split() 函数.
我根据 window 提示检查我的数组是否正确。
我把变量'increase'改成了2和4,分别得到了3个b和d。
我检查了 if 语句中的 indexOf(char),它们 return -1.
似乎变量 char 从未通过初始 if 语句...即使 var str = ZZ2,我仍然会得到所有小写的答案。
我编程才 3 周,所以请帮助我不仅了解如何在 JavaScript 中执行此操作,而且了解为什么它不起作用以及为什么正确的方法确实有效。
<p id="response"></p>
//I want to advance these characters by 3, ignoring the !
<script>
var str = "2Za";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var increase = 3;
var answer = "";
var strarr = str.split("");
var lc = lowercase.split("");
var uc = uppercase.split("");
var char;
for (char in strarr) {
if (char in lc) {
answer += lc[(lc.indexOf(char) + increase) % 26];
} else if (char in uppercase) {
answer += uc[(uc.indexOf(char) + increase) % 26];
} else {
answer += char;
}
}
document.getElementById("response").innerHTML = answer
</script>
我得到的都是小写 'ccc' 或与我的对应的字母
变量增加
两期:
您正在尝试使用 for-in
循环遍历数组。这不是 for-in
的目的,do one of these things instead.
另一个问题在这里:
if (char in lc) {
in
运算符不检查值是否在数组中,它检查对象中是否存在 属性(直接,或在其原型链中) .
取而代之的是获取索引,如果找不到,它将是 -1
:
index = lc.indexOf(char);
if (index != -1) {
answer += lc[(index + increase) % 26];
// ^^--- I'd probably also use lc.length here
// rather than a hardcoded value
}
(当然 uc
检查也一样。)
只是添加到 T.J. 的回答中,还有几点您可能会觉得有用
首先,你不需要拆分字符串!您可以将它们视为一个数组,使用 length、indexOf 和其他所有内容。不需要 split("") 函数。
此外,虽然您确实不想使用 "in",但您确实想使用 "of",如
for (char of str)
在那之后,您确实想要使用 indexOf。以下是显示实际代码的片段:
var str = "2Za";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var increase = 3;
var answer = "";
var char;
for (char of str) {
if (lowercase.indexOf(char) > -1) {
answer += lowercase[(lowercase.indexOf(char) + increase) % 26];
} else if (uppercase.indexOf(char) > -1) {
answer += uppercase[(uppercase.indexOf(char) + increase) % 26];
} else {
answer += char;
}
}
document.getElementById("response").innerHTML = answer
<p id="response"></p>
我的目标是每个字母前进三个,例如,'a'变成'd','z'变成'c'等等,忽略不是字母的字符.我无法理解 for 循环和后面关于我的变量 char 的 if/else if/else 语句。我也不明白为什么我得到 lc.indexOf(char) = -1
,好像它甚至不在我的数组中。
以下是关于我所尝试的时间线:
我将字符串转换为数组,因为 JS 不接受 for 循环中的字符串,如 str 中的 char...它会告诉我它需要是一个对象,所以我使用了 .split() 函数.
我根据 window 提示检查我的数组是否正确。
我把变量'increase'改成了2和4,分别得到了3个b和d。
我检查了 if 语句中的 indexOf(char),它们 return -1.
似乎变量 char 从未通过初始 if 语句...即使 var str = ZZ2,我仍然会得到所有小写的答案。
我编程才 3 周,所以请帮助我不仅了解如何在 JavaScript 中执行此操作,而且了解为什么它不起作用以及为什么正确的方法确实有效。
<p id="response"></p>
//I want to advance these characters by 3, ignoring the !
<script>
var str = "2Za";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var increase = 3;
var answer = "";
var strarr = str.split("");
var lc = lowercase.split("");
var uc = uppercase.split("");
var char;
for (char in strarr) {
if (char in lc) {
answer += lc[(lc.indexOf(char) + increase) % 26];
} else if (char in uppercase) {
answer += uc[(uc.indexOf(char) + increase) % 26];
} else {
answer += char;
}
}
document.getElementById("response").innerHTML = answer
</script>
我得到的都是小写 'ccc' 或与我的对应的字母 变量增加
两期:
您正在尝试使用
for-in
循环遍历数组。这不是for-in
的目的,do one of these things instead.另一个问题在这里:
if (char in lc) {
in
运算符不检查值是否在数组中,它检查对象中是否存在 属性(直接,或在其原型链中) .取而代之的是获取索引,如果找不到,它将是
-1
:index = lc.indexOf(char); if (index != -1) { answer += lc[(index + increase) % 26]; // ^^--- I'd probably also use lc.length here // rather than a hardcoded value }
(当然
uc
检查也一样。)
只是添加到 T.J. 的回答中,还有几点您可能会觉得有用
首先,你不需要拆分字符串!您可以将它们视为一个数组,使用 length、indexOf 和其他所有内容。不需要 split("") 函数。
此外,虽然您确实不想使用 "in",但您确实想使用 "of",如
for (char of str)
在那之后,您确实想要使用 indexOf。以下是显示实际代码的片段:
var str = "2Za";
var lowercase = "abcdefghijklmnopqrstuvwxyz";
var uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var increase = 3;
var answer = "";
var char;
for (char of str) {
if (lowercase.indexOf(char) > -1) {
answer += lowercase[(lowercase.indexOf(char) + increase) % 26];
} else if (uppercase.indexOf(char) > -1) {
answer += uppercase[(uppercase.indexOf(char) + increase) % 26];
} else {
answer += char;
}
}
document.getElementById("response").innerHTML = answer
<p id="response"></p>