为什么我的 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' 或与我的对应的字母 变量增加

两期:

  1. 您正在尝试使用 for-in 循环遍历数组。这不是 for-in 的目的,do one of these things instead.

  2. 另一个问题在这里:

    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>