JavaScript實用庫:Lodash源碼數學函數解析(二)max、identity、baseGt、baseExtremum、min、baseLt、baseMean、baseSum

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


在這裏插入圖片描述

Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手

接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧


1、_.max(array)

毫無疑問,該方法就是取出數組array中的最大值

看一下官方的例子,也沒什麼好說的:

下面直接看源碼:

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。

下面我們看官方例子:

這就也沒什麼好說的啦,直接看源碼:

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)

前面講了取最大值最小值,那麼該方法就是取數組內的平均數了

例子不多說啦,直接看源碼:

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;

最後該方法就是實現了累加的作用
所以理清關係還是挺容易理解的


今天就到這裏了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章