Клавиша / esc

.findLastIndex()

Найдёт индекс первого подходящего по условию элемента, обходя массив, начиная с конца.

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

Кратко

Скопировано

Метод findLastIndex() обходит массив, начиная с конца, и возвращает индекс первого элемента, который удовлетворяет условию переданной функции. Если при обходе массива не был найден подходящий элемент, то метод вернёт -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.findLastIndex принимает два аргумента:

  • колбэк-функция, являющаяся предикатом и используемая для определения является ли текущий элемент искомым;
  • необязательный параметр, объект, используемый для определения this при выполнении колбэк-функции.

Колбэк-функция принимает три необязательных аргумента:

  • текущий элемент;
  • индекс текущего элемента;
  • массив, для которого был вызван метод findLastIndex().

Колбэк-функция выполняется для каждого элемента массива, начиная с последнего. Как только для одного из элементов массива функция вернёт значение, которое интерпретируется как true, перебор прекращается и индекс элемента возвращается как результат метода findLastIndex().

Если для всех элементов массива колбэк-функция вернёт значения, которые интерпретируются как false, метод findLastIndex() возвращает `-1``.

Подробнее об интерпретации (приведении) значений к true или false можно прочитать в статье «Булев тип».

Как понять

Скопировано

Метод findLastIndex() имеет те же аргументы и работает так же, как и метод findIndex(), но отличается тем, что обходит массив с конца.

Использование колбэк-функции позволяет применять декларативный подход, что повышает читаемость кода, так как скрывает логику обхода массива.

Для сравнения при использовании цикла 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)

        
        
          
        
      

Подсказки

Скопировано

💡 Метод findLastIndex() не следует путать с методом findLast(), который возвращает последний подходящий по условию элемент.

💡 Если массив имеет незаполненные элементы, то при выполнении findLastIndex() колбэк-функция будет получать для таких элементов 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

        
        
          
        
      

💡 Следует иметь в виду, что при изменении массива, который колбэк-функция получает в качестве третьего аргумента, изменится исходный массив, для которого был вызван метод findLastIndex(). Это может привести к нарушению порядка перебора, но не изменит количество вызовов колбэк-функции:

        
          
          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