skip to main content

indexOf()

js

Кратко 🔗

Этот метод служит для поиска. Он определен для массивов и строк.

При вызове нужно передать, что искать. Вернется индекс первого найденного элемента или -1, если ничего не нашлось.

Как пишется 🔗

Искомый элемент передается первым аргументом — array1.indexOf("иголка")

let example = ["чебурашка", "гена", "шапокляк", "лариска"]

console.log(example.indexOf("гена")) // напечатает 1

Как это понять 🔗

Для массивов: ищет переданный элемент в массиве. Если элемент один, то возвращает индекс этого элемента. Если элементов много — возвращает индекс первого подходящего элемента. Элемента в массиве нет — вернет -1

let haystack = ["Петя", "Настя", "Артур", "Лена", "Настя"]

console.log(haystack.indexOf("Лена")) // напечатает 3
console.log(haystack.indexOf("Настя")) // напечатает 1
console.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)
}
}

🛠 indexOf или includes 🔗

Не используй indexOf для проверки вхождения элемента в массив/строку, для этого есть метод includes

Раньше методом indexOf часто проверяли, есть ли элемент в массиве. Эта задача проще, индекс здесь не нужен, но других методов для этого не было.

Поэтому в старых скриптах можно увидеть такой код:

let guestList = ["Петя", "Настя", "Артур", "Лена", "Настя", "Эммануил"];
let guest = // получаем откуда-нибудь имя гостя

if (guestList.indexOf(guest) >= 0) {
// пускаем на вечеринку
} else {
// отправляем домой
}

🤖 Из-за того, что indexOf возвращает индекс, в условии обязательно нужна проверка (>= 0 или !== -1). Если так не сделать, то появится неприятный баг: мы будем пускать на вечеринку всех, кроме первого гостя в списке.

Дело в том, что JavaScript интерпретирует ненулевые числа как истину (true) и будет запускать первую ветку if. А на первом госте indexOf вернет 0, что считается ложным (false), и наш скрипт не пустит человека потусить.

Николай,