Почему мой цикл indexOf и for не работает должным образом? - PullRequest
1 голос
/ 19 июня 2019

Моя цель - продвигать каждую букву на три, например, «a» становится «d», «z» становится «c» и т. Д. И игнорировать символы, которые не являются буквами.У меня проблемы с пониманием цикла for и операторов if / else if / else, которые следуют относительно моей переменной char.Я также не понимаю, почему я получаю lc.indexOf(char) = -1, как будто его нет даже в моем массиве.

Вот что-то вроде графика времени относительно того, что я пробовал:

Я преобразовал строкик массивам, потому что JS не будет принимать строку в цикле for, как в char в str ... это скажет мне, что это должен быть объект, поэтому я использовал функцию .split ().

Я проверилчто мои массивы были верны с оконными подсказками.

Я изменил переменную 'увеличен' на 2 и 4 и получил 3 b и d соответственно.

Я проверил indexOf (char) в ifоператоры и они возвращают -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"или какая буква соответствует моему увеличению var

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Просто, чтобы добавить к ответу Т.Дж., есть еще несколько моментов, которые могут оказаться полезными

Прежде всего, вам не нужно разбивать строки! Вы можете рассматривать их как массив, используя 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>
0 голосов
/ 19 июня 2019

Две проблемы:

  1. Вы пытаетесь использовать for-in для циклического перемещения по массиву.Это не то, для чего for-in, делает одну из этих вещей вместо .

  2. Другая проблема здесь:

    if (char in lc) {
    

    The *Оператор 1016 * не проверяет, находится ли значение в массиве, он проверяет, существует ли свойство в объекте (напрямую или в его цепочке прототипов).

    Вместо этого получите индекс,который будет -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 чека.)

...