Кратко
Секция статьи "Кратко"Этот метод служит для поиска. Он определён для массивов и строк.
При вызове нужно передать, что искать. Вернётся индекс первого найденного элемента или
, если ничего не нашлось.
Как пишется
Секция статьи "Как пишется"Искомый элемент передаётся первым аргументом — array1
let example = ["чебурашка", "гена", "шапокляк", "лариска"]console.log(example.indexOf("гена")) // напечатает 1
let example = ["чебурашка", "гена", "шапокляк", "лариска"] console.log(example.indexOf("гена")) // напечатает 1
Как это понять
Секция статьи "Как это понять"Для массивов: ищет переданный элемент в массиве. Если элемент один, то возвращает индекс этого элемента. Если элементов много — возвращает индекс первого подходящего элемента. Элемента в массиве нет — вернёт
let haystack = ["Петя", "Настя", "Артур", "Лена", "Настя"]console.log(haystack.indexOf("Лена")) // напечатает 3console.log(haystack.indexOf("Настя")) // напечатает 1console.log(haystack.indexOf("Эдуард Аркадьевич")) // напечатает -1
let haystack = ["Петя", "Настя", "Артур", "Лена", "Настя"] console.log(haystack.indexOf("Лена")) // напечатает 3 console.log(haystack.indexOf("Настя")) // напечатает 1 console.log(haystack.indexOf("Эдуард Аркадьевич")) // напечатает -1
Для строк: работает так же, как с массивами, но можно искать не только буквы в строке, но и подстроки. Например:
let haystack = "Мама мыла раму"console.log(haystack.indexOf("а")) // напечатает 1console.log(haystack.indexOf("мыла")) // напечатает 5console.log(haystack.indexOf("ё")) // напечатает -1
let haystack = "Мама мыла раму" console.log(haystack.indexOf("а")) // напечатает 1 console.log(haystack.indexOf("мыла")) // напечатает 5 console.log(haystack.indexOf("ё")) // напечатает -1
На практике
Секция статьи "На практике"🛠 Найти индексы всех подходящих элементов
Секция статьи "🛠 Найти индексы всех подходящих элементов"Чтобы найти индексы всех искомых элементов, используют второй аргумент. Он указывает, с какого места начинать поиск. Таким образом можно проигнорировать те элементы, которые уже нашли и начинать поиск сразу после них:
let haystack = "мама мыла раму"let lastResult// напечатаем индексы всех букв М во фразеwhile (lastResult !== -1) { lastResult = haystack.indexOf("м", lastResult + 1) if (lastResult !== -1) { console.log(lastResult) }}
let haystack = "мама мыла раму" let lastResult // напечатаем индексы всех букв М во фразе while (lastResult !== -1) { lastResult = haystack.indexOf("м", lastResult + 1) if (lastResult !== -1) { console.log(lastResult) } }
🛠 indexOf или includes
Секция статьи "🛠 indexOf или includes"Не используй indexOf
для проверки вхождения элемента в массив/строку, для этого есть метод includes
Раньше методом indexOf
часто проверяли, есть ли элемент в массиве. Эта задача проще, индекс здесь не нужен, но других методов для этого не было.
Поэтому в старых скриптах можно увидеть такой код:
let guestList = ["Петя", "Настя", "Артур", "Лена", "Настя", "Эммануил"];let guest = // получаем откуда-нибудь имя гостяif (guestList.indexOf(guest) >= 0) { // пускаем на вечеринку} else { // отправляем домой}
let guestList = ["Петя", "Настя", "Артур", "Лена", "Настя", "Эммануил"]; let guest = // получаем откуда-нибудь имя гостя if (guestList.indexOf(guest) >= 0) { // пускаем на вечеринку } else { // отправляем домой }
🤖 Из-за того, что indexOf
возвращает индекс, в условии обязательно нужна проверка (>
или !
). Если так не сделать, то появится неприятный баг: мы будем пускать на вечеринку всех, кроме первого гостя в списке.
Дело в том, что JavaScript интерпретирует ненулевые числа как истину (true
) и будет запускать первую ветку if
. А на первом госте indexOf вернёт 0
, что считается ложным (false
), и наш скрипт не пустит человека на вечеринку.