Skip to content

Latest commit

 

History

History
92 lines (63 loc) · 2.73 KB

findLastIndex.md

File metadata and controls

92 lines (63 loc) · 2.73 KB

lodash源码分析之findLastIndex

本文为读 lodash 源码的第三十六篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash

gitbook也会同步仓库的更新,gitbook地址:pocket-lodash

依赖

import baseFindIndex from './.internal/baseFindIndex.js'

lodash源码分析之baseFindIndex中的运算符优先级

源码分析

function findLastIndex(array, predicate, fromIndex) {
  const length = array == null ? 0 : array.length
  if (!length) {
    return -1
  }
  let index = length - 1
  if (fromIndex !== undefined) {
    index = fromIndex < 0
      ? Math.max(length + fromIndex, 0)
      : Math.min(fromIndex, length - 1)
  }
  return baseFindIndex(array, predicate, index, true)
}

作用与用法

从方法名可以看出, findLastIndex 会从后向前遍历,找到 predicate 第一次返回 true 时的 index

基本用法如下:

 const users = [
   { 'user': 'barney',  'active': true },
   { 'user': 'fred',    'active': false },
   { 'user': 'pebbles', 'active': false }
 ]

 findLastIndex(users, ({ user }) => user == 'pebbles')

核心代码

const length = array == null ? 0 : array.length
if (!length) {
  return -1
}
let index = length - 1
return baseFindIndex(array, predicate, index, true)

先不管 fromIndex 有传递的情况,即 indexlength - 1 ,即数组最后一项的索引。

从上面这段代码可以看出,findLastIndex 最终调用的是 baseFindeIndex ,并且将最后一个参数,即 fromRight 设置为 true ,表示从后向前遍历。

fromIndex

默认情况下,是从最后一个元素开始向前遍历,也可以指定 fromIndex ,跳过部分元素。

fromIndex 可以是正数也可以是负数。

先看下负数的情况:

Math.max(length + fromIndex, 0)

在负数的情况下,其实相当于 length 减少指定的数字,得到一个 index,这个 index 可能为负数,因为需要取0 和这个数字的最大值。

在正数的情况下:

Math.min(fromIndex, length - 1)

这种情况下就比较简单了,取 length - 1fromIndex 的最小值即可,避免超出数组的长度。

License

署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)

最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:

作者:对角另一面