JavaScript实用库:Lodash源码数学函数解析(二)max、identity、baseGt、baseExtremum、min、baseLt、mean、baseMean、baseSum

本章的内容主要是:max、identity、baseGt、baseExtremum、min、baseLt、mean、baseMean、baseSum


在这里插入图片描述

Lodash是一个非常好用方便的JavaScript的工具库,使得我们对数据处理能够更加得心应手

接下来我要对Lodash的源码进行剖析学习
每天几个小方法,跟着我一起来学lodash吧


1、_.max(array)

毫无疑问,该方法就是取出数组array中的最大值

看一下官方的例子,也没什么好说的:

JavaScript实用库:Lodash源码数学函数解析(二)max、identity、baseGt、baseExtremum、min、baseLt、mean、baseMean、baseSum_第1张图片

下面直接看源码:

function max(array) {
  //如果array为空则输出undefined,反之进入baseExtremum进行处理
  return (array && array.length)
    ? baseExtremum(array, identity, baseGt)
    : undefined;
}

module.exports = max;

其中有三个依赖函数,我依次列出

(1)identity

该函数没有什么特别的地方,就是输入value输出value

function identity(value) {
  return value;
}

module.exports = identity;

(2)baseGt
该函数输入的两个数,输出布尔值,如果value大于other则输出true,反之输出false

function baseGt(value, other) {
  return value > other;
}

module.exports = baseGt;

(3)baseExtremum
这个函数就是最重要的了,基本上所有的处理都在该函数里面

//在我们最开始的函数中得到,在baseExtremum中iteratee就是我们的函数identity,而comparator是我们的函数baseGt
function baseExtremum(array, iteratee, comparator) {
  var index = -1,
      length = array.length;

  while (++index < length) {
    var value = array[index],
        //将数组内的数依照while循环依次赋值给current
        current = iteratee(value);
    //如果current的值定义了,那么进入comparator函数,也就是baseGt函数
    //如果current的值大于computde,则输出true
    if (current != null && (computed === undefined
          ? (current === current && !isSymbol(current))
          : comparator(current, computed)
        )) {
      //在循环中,current的值与value的值是相同的,所以结果等于value
      var computed = current,
          result = value;
    }
  }
  return result;
}

module.exports = baseExtremum;

2、_.min(array)

介绍完最大值,当然得有最小值了,如果 array 是 空的或者假值将会返回 undefined。

下面我们看官方例子:

JavaScript实用库:Lodash源码数学函数解析(二)max、identity、baseGt、baseExtremum、min、baseLt、mean、baseMean、baseSum_第2张图片

这就也没什么好说的啦,直接看源码:

function min(array) {
  return (array && array.length)
    ? baseExtremum(array, identity, baseLt)
    : undefined;
}

module.exports = min;

果然和max方法是一样的,只不过有个不同的函数baseLt,那么猜想它是与baseGt功能相反的

(1)baseLt

function baseLt(value, other) {
  return value < other;
}

module.exports = baseLt;

这就没有错了,baseGt中是value > other,那么具体过程这里也就不多说了,因为实在是和max一模一样


3、_.mean(array)

前面讲了取最大值最小值,那么该方法就是取数组内的平均数了

JavaScript实用库:Lodash源码数学函数解析(二)max、identity、baseGt、baseExtremum、min、baseLt、mean、baseMean、baseSum_第3张图片

例子不多说啦,直接看源码:

function mean(array) {
  return baseMean(array, identity);
}

module.exports = mean;

到这里看到源码也不能判断它的实现过程,因为主要是使用了依赖的函数baseMean
其中identity函数我也不多说了,前面几个方法有提及过

(1)baseMean

function baseMean(array, iteratee) {
  //获取到元素的个数
  var length = array == null ? 0 : array.length;
  //只要数组不为0,则输出baseSum(array, iteratee) / length
  return length ? (baseSum(array, iteratee) / length) : NAN;
}
module.exports = baseMean;

到了这里我们可以看到输出的就是baseSum(array, iteratee) / length
既然length是元素的个数,那么baseSum函数的功能就一定是求和,接下来我们研究一下baseSum函数

(2)baseSum

function baseSum(array, iteratee) {
  var result,
      index = -1,
      length = array.length;

  while (++index < length) {
    //iteratee在该方法里面就是identity,即在循环内依次赋值数组元素给current
    var current = iteratee(array[index]);
    //经过判断后对元素进行累加
    if (current !== undefined) {
      result = result === undefined ? current : (result + current);
    }
  }
  //输出累加结果
  return result;
}

module.exports = baseSum;

最后该方法就是实现了累加的作用
所以理清关系还是挺容易理解的


今天就到这里了

你可能感兴趣的:(前端,算法,数据结构,js,lodash)