Как напечатать все символы по их индексу в JavaScript?

1

Просто для того, чтобы работать с indexOf() и лучше ознакомиться с тем, как он работает и что с ним можно сделать, я хочу напечатать индекс для каждого символа в одной фразе один за другим.

Я мог бы сделать это успешно вручную, таким образом:

// Print index for char of phrase (case insensitive):

let phrase = "ab";

alert(phrase.indexOf("a")); // 0
alert(phrase.indexOf("b")); // 1
alert(phrase.indexOf("z")); // -1

Но когда я попытался использовать цикл, я потерпел неудачу:

// Print char by index:

let phrase = "ab";

for (let i = -1; i < phrase.indexOf(); i++) {
    alert(phrase.length[i]);
}

Я также попытался с регулярным выражением, чтобы нацелить каждого символа внутри phrase но также не удалось:

let phrase = "ab";

for (let i = -1; i < phrase.indexOf(/./); i++) {
    alert(phrase.length[i]);
}

Чтобы уточнить, моя цель - иметь первое предупреждение с 0, а второе - с 1. Я просто хочу напечатать индекс каждого символа, а не длину символа, как это легко сделать:

phrase.length // 2.

Как я могу напечатать индекс каждого символа в отдельных предупреждениях?

Для меня очень важно использовать indexOf() внутри цикла, чтобы узнать этот синтаксис.

  • 1
    Как вы думаете, что i < phrase.indexOf() или phrase.length[i] означает? Ваш код не имеет смысла.
  • 1
    "abcdef".split("").forEach(char => console.log(char, phrase.indexOf(char)) . и не используйте alert s для отладки. КАЖДЫЙ полу-современный браузер имеет очень мощные инструменты разработки и консоль, которая может иметь дело с большим количеством (аргументов и типов), чем одна строка.
Показать ещё 1 комментарий
Теги:

5 ответов

0
Лучший ответ

Чтобы напечатать индекс каждого символа в цикле, вам не нужен indexOf()

let phrase = "ab";
for (let i = 0; i < phrase.length; i++) {
    alert (i);
}

потому что i - точный индекс, который вам нужен.

Фактически, если вы используете indexOf() в цикле, это выглядит так:

let phrase = "ab";
for (let i = 0; i < phrase.length; i++) {
    alert (phrase.indexOf (phrase[i]));
}

Тот же результат, что и раньше, но на этот раз вместо отображения i вы извлекаете текущий элемент во phrase и используете indexOf() чтобы получить уже известный индекс.

EDIT: indexOf() в этом случае работает так, как ожидалось, потому что буквы в phrase разные. Но, как сказал СамВК, let phrase = "banana"; , он не может работать, потому что он всегда будет возвращать 1 для буквы "a", поэтому вы не должны использовать его для такого цикла.

Я не использовал let я = -1 потому что это не индекс phrase. Это то, что возвращает indexOf() если он не может найти данный элемент.

Я надеюсь, что это помогает.

1

Хотя это не всегда так: наиболее распространенным форматом цикла for является:

for (let я = 0; я < someVariable.length; i++) {//...some code }

И действительно, что вы хотите здесь.

Это значит:

  • начинаться с i, равным 0 (i = 0)
  • Делайте все, что в моем теле (//...some code)
  • увеличить я на 1 (i++)
  • Повторяйте, пока я не станет равным единице, меньшему, чем длина someVariable (someVariable.length) *

* Этот последний шаг может показаться чем-то запутанным. Помните: индексы начинаются с 0, но счет длины, ну, считается нормальным - поэтому начинаем с 1. Итак, строка длины 3, скажем 'c' + 'a' + 't'. состоит из символов по индексам [0, 1, 2]. Итак, вы хотите, чтобы цикл остановился на последнем индексе - 2, который (всегда) меньше, чем длина.. (Но, если честно, это overexplaining его Короткий ответ: если вы хотите что - то перебрать - 99 раз из 100, вы хотите, чтобы точный for loop формата приведены наверху.


Итак, посмотрим на ваш пример: мы хотим исправить три вещи:

  • Мы хотим, чтобы let я = 0; (помните, что он не увеличивается до тех пор, пока он не будет выполняться один раз
  • Мы хотим сказать i < phrase.length; (i < phrase.indexOf() ничего не значит. phrase.indexOf() - это функция, а не число).
  • phrase.length означает "скажите мне длину переменной фразы". Он просто возвращает число. (Так что phrase.length[i] ничего не значит). Если вы хотите предупредить, что письмо есть в этом индексе, это просто phrase[i]. *

* Если этот синтаксис для получения буквы, просто поместив [#] после строк, кажется странным - хорошо, потому что он был больше предназначен для массивов. Если вы let arr = ['a', 'b', 'c'], тогда, конечно, я понял, почему разработчики JavaScript сказали "давайте быстро сделать, о, значение в индексе 2 массива Как насчет просто arr[2]? Но для согласованности они сказали: "Да, конечно, дайте эту способность струнам". И если вы думаете об этом, строка - это всего лишь массив букв.


Обновление: я просто заметил, что вам нужен индекс каждой буквы, а не письмо. Ну... технически вы могли бы просто alert(i). Что это, что индекс. Но если вы хотите знать, о чем мы говорим, я бы сделал что-то вроде alert("Letter " + phrase[i] + " is at index " + i)


Итак, наш окончательный ответ:

let phrase = "ab";

for (let i = 0; i < phrase.length; i++) {
    alert("Letter " +  phrase[i] + " is at index " + i)
}


Для меня очень важно использовать indexOf() внутри цикла, чтобы узнать этот синтаксис.

Вы бы никогда не использовали indexOf() для чего-то подобного. Это было бы не просто лишним, это было бы неправильно. Если у вас есть строка banana и попытался использовать indexOf() для проверки (re) каждой позиции букв, вы получите 0,1,2,1,2,1. Зачем? Поскольку indexOf() возвращает только индекс первого экземпляра этой буквы.

indexOf() не является чем-то, что вы, вероятно, будете indexOf() с циклом for - по крайней мере, не для цикла, который ищет ту же строку. Это сама петля. Задача состоит в том, чтобы запретить вам писать цикл for, чтобы найти индекс "b" в "ab". Он сделает это за вас.

1

Вы можете сделать это так:

for(let i=0; i<phrase.length; i++) {
    console.log(phrase.indexOf(phrase[i]));
}
1

Не используйте indexOf. Этот метод используется для получения позиции (индекса) определенного символа в строке:

Строка имеет свойство length и может быть повторена:

let phrase = "aaabbbaaaabbb"

function getAllIndices(stringInput) {

  for (let i = 0; i < stringInput.length; i++) {
  //you simply need to output i.
      console.log(stringInput[i] + " > " + i);
  }
}

getAllIndices(phrase);
0

Если вы абсолютно хотите использовать indexOf в цикле, вы можете сделать это:

let phrase = "ab";

Array.from(phrase).forEach(char => {
  console.log(phrase.indexOf(char))
})

Но это довольно бесполезно, поскольку для этого есть более простые способы, но поскольку это похоже на учебную цель, я надеюсь, что этот ответ поможет вам!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню