indexOf() и lastIndexOf()
Методы indexOf()
и lastIndexOf()
отыскивают в массиве элемент с указанным значением и возвращают индекс первого найденного элемента или –1
, если элемент с таким значением отсутствует. Метод indexOf()
выполняет поиск от начала массива к концу, а метод lastIndexOf()
– от конца к началу.
a = [0,1,2,1,0];
a.indexOf(1) // => 1: a[1] = 1
a.lastIndexOf(1) // => 3: a[3] = 1
a.indexOf(3) // => -1: нет элемента со значением 3
В отличие от других методов, методы indexOf()
и lastIndexOf()
не принимают функцию в виде аргумента.
В первом аргументе им передается искомое значение.
Второй аргумент является необязательным: он определяет индекс массива, с которого следует начинать поиск.
Если опустить этот аргумент, метод indexOf()
начнет поиск с начала массива, а метод lastIndexOf()
– с конца.
Во втором аргументе допускается передавать отрицательные значения, которые интерпретируются как смещение относительно конца массива, как в методе splice()
: значение –1
, например, соответствует последнему элементу массива. Следующая функция отыскивает заданное значение в массиве и возвращает массив всех индексов, где было найдено совпадение. Здесь демонстрируется, как можно использовать второй аргумент метода indexOf()
для поиска совпадений после первого.
// Отыскивает все вхождения значения x в массив и возвращает
// массив индексов найденных совпадений
function findall(a, x) {
var results = [], // Возвращаемый массив индексов
len = a.length, // Длина массива, где выполняется поиск
pos = 0; // Начальная позиция поиска
while(pos < len) { // Пока остались непроверенные элементы...
pos = a.indexOf(x, pos); // Искать
if (pos === -1) break; // Если ничего не найдено, поиск завершен.
results.push(pos); // Иначе - сохранить индекс в массиве
pos = pos + 1; // И продолжить поиск со следующего элемента
}
return results; // Вернуть массив индексов
}
P.S. Методы indexOf/lastIndexOf
осуществляют поиск перебором. Если нужно проверить, существует ли значение в массиве – его нужно перебрать. Только так. Внутренняя реализацияindexOf/lastIndexOf
осуществляет полный перебор, аналогичный циклуfor
по массиву. Чем длиннее массив, тем дольше он будет работать.