.indexOf()

Время чтения: меньше 5 мин

Кратко

Секция статьи "Кратко"

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

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

Как пишется

Секция статьи "Как пишется"

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

        
          
          let example = ["чебурашка", "гена", "шапокляк", "лариска"]console.log(example.indexOf("гена")) // напечатает 1
          let example = ["чебурашка", "гена", "шапокляк", "лариска"]

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

        
        
          
        
      

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

Секция статьи "Как это понять"

Для массивов: ищет переданный элемент в массиве. Если элемент один, то возвращает индекс этого элемента. Если элементов много — возвращает индекс первого подходящего элемента. Элемента в массиве нет — вернёт -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

        
        
          
        
      

На практике

Секция статьи "На практике"

nlopin

Секция статьи "nlopin"

🛠 Найти индексы всех подходящих элементов

Секция статьи "🛠 Найти индексы всех подходящих элементов"

Чтобы найти индексы всех искомых элементов, используют второй аргумент. Он указывает, с какого места начинать поиск. Таким образом можно проигнорировать те элементы, которые уже нашли и начинать поиск сразу после них:

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

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