返回

lodash源码分析之自减的两种形式

前端

本文将分析lodash中的assocIndexOf函数,这是一个二维数组,每项中的第一项作为缓存对象的key,第二项为缓存的值。assocIndexOf的作用是找出指定的key在数组中的索引值。这段代码很精简,让length自减,调用eq函数,从二维数组的最后一项开始比较,向数组头部遍历,找到指定的key就返回索引值。

assocIndexOf 函数

function assocIndexOf(array, key) {
  var length = array.length;
  while (length--) {
    if (eq(array[length][0], key)) {
      return length;
    }
  }
  return -1;
}

下面我们来一步步分析代码:

  1. 声明变量 length
var length = array.length;

length变量存储了数组array的长度,这个变量将在循环中被递减,直到为0。

  1. while循环
while (length--) {

这个循环会一直执行,直到length变量变为0。每执行一次循环,length都会减1。

  1. if语句
if (eq(array[length][0], key)) {

if语句检查array[length][0]是否等于key。如果相等,则说明找到了指定的key,此时函数会返回length。

  1. eq函数
eq(array[length][0], key)

eq函数是一个比较函数,它比较两个值是否相等。在lodash中,eq函数可以比较基本类型和对象。

自减的两种形式

在 assocIndexOf 函数中,length 是通过自减的方式来递减的。自减有两种形式:

  1. 前缀自减
--length;

前缀自减会先减1,然后再使用length的值。

  1. 后缀自减
length--;

后缀自减会先使用length的值,然后再减1。

在 assocIndexOf 函数中,使用的是后缀自减。这两种自减方式都可以达到相同的效果,但后缀自减更常用。

时间复杂度

assocIndexOf 函数的时间复杂度为O(n),其中n是数组array的长度。这是因为函数需要遍历整个数组来查找指定的key。

总结

assocIndexOf 函数是一个简单的函数,它可以找出指定的key在数组中的索引值。函数使用自减来遍历数组,并使用eq函数来比较两个值是否相等。函数的时间复杂度为O(n)。

扩展阅读