indexOf()

indexOf() - это метод в JavaScript, который ищет указанный элемент в массиве или строке. Если значение найдено, вернёт индекс этого элемента; если нет, то вернёт -1. При количестве вхождений больше одного вернёт индекс первого.

Синтаксис

  let string = ['a', 'b', 'c', 'a']

  string.indexOf('value', index)

value - значение элемента, который ищем в массиве или строке

index Необязательный - указывает, с какого индекса начинать поиск. По умолчанию равен 0.

Вызов метода indexOf() начинается с объекта (строки или массива), в котором производится поиск. Затем следует точка, после которой указывается название метода, а в круглых скобках - значение value, которое нужно найти.

  let mySkills = ['HTML', 'CSS', 'JavaScript', 'React']

  mySkills.indexOf('JavaScript') // 2

То же самое можем провернуть и со строкой.

  let mySkills = 'HTML, CSS, JavaScript, React'

  mySkills.indexOf('JavaScript') // 11

Искать можно также отдельные буквы и символы.

  mySkills.indexOf(',') // 4
  mySkills.indexOf('R') // 23

Если метод не находит наше значение, результатом будет -1.

  mySkills.indexOf('Angular') // -1

Стоит учитывать, что метод использует регистрозависимый поиск. Это означает, что indexOf() будет искать точное соответствие указанной строке, включая регистр.

  let mySkills = ['HTML', 'CSS', 'JavaScript', 'React']

  mySkills.indexOf('javascript') // -1

Если массив или строка пустая, метод вернет -1.

  let mySkills = []

  mySkills.indexOf('R') // -1  

indexOf() как условие

Используя метод indexOf() в условиях, например при работе с if, стоит учитывать, что если результатом проверки будет 0, код может интерпретировать это как false и вызвать нежелательное поведение.

  let mySkills = ['HTML', 'CSS', 'JavaScript', 'React']

  mySkills.indexOf('HTML') ? console.log('Нашел') : console.log('Не нашел')

При записи использовали тернарный оператор. Результатом будет Не нашел, хотя искомая строка явно присутствует. Корректнее будет сформулировать условие, сравнивая результат работы метода с -1, а не с нулём.

  let mySkills = ['HTML', 'CSS', 'JavaScript', 'React']

  mySkills.indexOf('HTML') >= 0 ? console.log('Нашел') : console.log('Не нашел')

Подсчет количества вхождений

  let message = 'Я обязательно запомню, как работает метод indexOf()'
  let index = message.indexOf('о')
  let count = 0
  
  while(index !== -1) {
      count++
      index = message.indexOf('о', index + 1)
  }
  
  console.log(count) // 5

Используя цикл while, и увеличивая позицию, с которой нужно начинать поиск, мы ищем все вхождения. При окончании поиска выводим результат в console.

Проверка на повторы

С помощью indexOf() и lastIndexOf() можно проверить, встречается ли символ в строке больше одного раза.

let value = '10,20,30'

let firstCommaIndex = value.indexOf(',')
let lastCommaIndex = value.lastIndexOf(',')

console.log(firstCommaIndex !== lastCommaIndex)

Результат:

true

Если первая и последняя позиции отличаются, значит запятая встретилась в строке несколько раз.

let value = '10,20'

console.log(value.indexOf(',') !== value.lastIndexOf(','))

Результат:

false

Если символа нет или он встречается один раз, indexOf() и lastIndexOf() вернут одинаковое значение.