Кратко
СкопированоМетод find
обходит массив, начиная с конца, и возвращает индекс первого элемента, который удовлетворяет условию переданной функции. Если при обходе массива не был найден подходящий элемент, то метод вернёт -1
.
Пример
СкопированоНайдём в массиве индекс последнего элемента, значение которого больше 10:
const numbers = [10, 15, 4, 20, 8, -5]const elemIndex = numbers.findLastIndex((element) => element > 10)console.log(elemIndex)// 3 (найденный элемент имеет значение 20)
const numbers = [10, 15, 4, 20, 8, -5] const elemIndex = numbers.findLastIndex((element) => element > 10) console.log(elemIndex) // 3 (найденный элемент имеет значение 20)
Найдём в том же массиве индекс последнего элемента, значение которого больше 10 и при этом индекс этого элемента меньше 2:
const numbers = [10, 15, 4, 20, 8, -5]const elemIndex = numbers.findLastIndex((element, index) =>element > 10 && index < 2)console.log(elemIndex)// 1 (найденный элемент имеет значение 15)
const numbers = [10, 15, 4, 20, 8, -5] const elemIndex = numbers.findLastIndex((element, index) => element > 10 && index < 2) console.log(elemIndex) // 1 (найденный элемент имеет значение 15)
Как пишется
СкопированоArray
принимает два аргумента:
- колбэк-функция, являющаяся предикатом и используемая для определения является ли текущий элемент искомым;
- необязательный параметр, объект, используемый для определения
this
при выполнении колбэк-функции.
Колбэк-функция принимает три необязательных аргумента:
- текущий элемент;
- индекс текущего элемента;
- массив, для которого был вызван метод
find
.Last Index ( )
Колбэк-функция выполняется для каждого элемента массива, начиная с последнего. Как только для одного из элементов массива функция вернёт значение, которое интерпретируется как true
, перебор прекращается и индекс элемента возвращается как результат метода find
.
Если для всех элементов массива колбэк-функция вернёт значения, которые интерпретируются как false
, метод find
возвращает -1
.
Подробнее об интерпретации (приведении) значений к true
или false
можно прочитать в статье «Булев тип».
Как понять
СкопированоМетод find
имеет те же аргументы и работает так же, как и метод find
, но отличается тем, что обходит массив с конца.
Использование колбэк-функции позволяет применять декларативный подход, что повышает читаемость кода, так как скрывает логику обхода массива.
Для сравнения при использовании цикла for
, помимо функции поиска значения, нам потребуется реализовать и цикл перебора массива:
const chords = ['Am','C','E7','C','Dm']const callbackFn = (item) => item === 'C'const findLastIndex = (array, callbackFn) => { for (let i = array.length - 1; i >= 0; i--) { if (callbackFn(array[i], i, array)) { return i } } return -1}console.log(findLastIndex(chords, callbackFn))// 3 (найденный элемент имеет значение C)
const chords = ['Am','C','E7','C','Dm'] const callbackFn = (item) => item === 'C' const findLastIndex = (array, callbackFn) => { for (let i = array.length - 1; i >= 0; i--) { if (callbackFn(array[i], i, array)) { return i } } return -1 } console.log(findLastIndex(chords, callbackFn)) // 3 (найденный элемент имеет значение C)
Подсказки
Скопировано💡 Метод find
не следует путать с методом find
, который возвращает последний подходящий по условию элемент.
💡 Если массив имеет незаполненные элементы, то при выполнении find
колбэк-функция будет получать для таких элементов undefined
как значение текущего элемента:
const colors = ['navy', , , 'purple']console.log(colors)// [ 'navy', <2 empty items>, 'purple' ]const index = colors.findLastIndex(item =>item === undefined)console.log(index, colors[index])// 2 undefined
const colors = ['navy', , , 'purple'] console.log(colors) // [ 'navy', <2 empty items>, 'purple' ] const index = colors.findLastIndex(item => item === undefined) console.log(index, colors[index]) // 2 undefined
💡 Следует иметь в виду, что при изменении массива, который колбэк-функция получает в качестве третьего аргумента, изменится исходный массив, для которого был вызван метод find
. Это может привести к нарушению порядка перебора, но не изменит количество вызовов колбэк-функции:
const names = ['Джон', 'Ринго', 'Пол', 'Джордж']const result = names.findLastIndex((name, index, array) => { console.log(index, name) // Если текущий элемент имеет индекс 1 if (index === 1) { // Добавим ещё один элемент в начало массива array.unshift('Йоко') } return name === 'Джон'})// 3 Джордж// 2 Пол// 1 Ринго// 0 Йокоconsole.log(names)// [ 'Йоко', 'Джон', 'Ринго', 'Пол', 'Джордж' ]console.log(result)// -1
const names = ['Джон', 'Ринго', 'Пол', 'Джордж'] const result = names.findLastIndex((name, index, array) => { console.log(index, name) // Если текущий элемент имеет индекс 1 if (index === 1) { // Добавим ещё один элемент в начало массива array.unshift('Йоко') } return name === 'Джон' }) // 3 Джордж // 2 Пол // 1 Ринго // 0 Йоко console.log(names) // [ 'Йоко', 'Джон', 'Ринго', 'Пол', 'Джордж' ] console.log(result) // -1