Кратко
СкопированоМетод 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