Просто для того, чтобы работать с 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()
внутри цикла, чтобы узнать этот синтаксис.
Чтобы напечатать индекс каждого символа в цикле, вам не нужен 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()
если он не может найти данный элемент.
Я надеюсь, что это помогает.
Хотя это не всегда так: наиболее распространенным форматом цикла for
является:
for (let я = 0; я < someVariable.length; i++) {//...some code }
И действительно, что вы хотите здесь.
Это значит:
i = 0
)//...some code
)i++
)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". Он сделает это за вас.
Вы можете сделать это так:
for(let i=0; i<phrase.length; i++) {
console.log(phrase.indexOf(phrase[i]));
}
Не используйте 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);
Если вы абсолютно хотите использовать indexOf в цикле, вы можете сделать это:
let phrase = "ab";
Array.from(phrase).forEach(char => {
console.log(phrase.indexOf(char))
})
Но это довольно бесполезно, поскольку для этого есть более простые способы, но поскольку это похоже на учебную цель, я надеюсь, что этот ответ поможет вам!
i < phrase.indexOf()
илиphrase.length[i]
означает? Ваш код не имеет смысла."abcdef".split("").forEach(char => console.log(char, phrase.indexOf(char))
. и не используйтеalert
s для отладки. КАЖДЫЙ полу-современный браузер имеет очень мощные инструменты разработки и консоль, которая может иметь дело с большим количеством (аргументов и типов), чем одна строка.