本章的內容主要是: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;
最後該方法就是實現了累加的作用
所以理清關係還是挺容易理解的
今天就到這裏了