本章的內容主要是:tail、take、takeRight、takeRightWhile、takeWhile
Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手
接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧
1、_.tail(array)
根據官方文檔介紹,該方法可以獲取array數組中第一個以外的全部元素
我們發現它和之前的方法 **_.initial(array)**有點類似,initial是去除最後一個元素
JavaScript實用庫:Lodash源碼數組函數解析(八)initial、join、last、nth、baseNth、(isIndex)
下面直接看官方給出的例子:
確實是去除了第一個元素
我們接下來看源碼:
function tail(array) {
//獲取數組的長度
var length = array == null ? 0 : array.length;
//對array數組進行切片
//起始索引位置固定爲1,不包含第一個元素
//結束索引位置爲數組長度
return length ? baseSlice(array, 1, length) : [];
}
module.exports = tail;
可以看到和initial一樣使用了核心的切片函數
2、_.take(array, [n=1])
官方解釋:創建一個數組切片,從array數組的起始元素開始提取n個元素
這個方法也有點眼熟,我馬上就想起了drop
JavaScript實用庫:Lodash源碼數組函數解析(三) drop、toInteger、toFinite
我們來看官方給出的例子:
第一個例子是取出數組中前1個元素,所以得到一個含1的數組
第二個例子是取出數組中前2個元素,所以得到一個含1,2的數組
後面的就不說啦,還挺好理解的
接下來直接看源碼:
function take(array, n, guard) {
//排除數組爲空的情況
if (!(array && array.length)) {
return [];
}
//確定n的值,n若無定義則爲1
n = (guard || n === undefined) ? 1 : toInteger(n);
//對數組進行切片
//開始索引位置爲0
//結束索引位置有兩種情況,若n小於0,則結束位置索引爲0,反之取n的值
return baseSlice(array, 0, n < 0 ? 0 : n);
}
module.exports = take;
都是一些老朋友的核心函數了,一下就能理解是什麼意思了
3、_.takeRight(array, [n=1])
該方法從命名上就知道是從數組的右邊開始取出元素啦,所以他的功能就是取出從數組結束位置開始取出n個元素
接下來我們看官方給出的例子:
例子也和第二個解釋的元素一樣,挺好理解的
我們直接看源碼吧:
function takeRight(array, n, guard) {
//獲取數組的長度
var length = array == null ? 0 : array.length;
//若數組爲空則輸出空數組
if (!length) {
return [];
}
//確定n的值,默認值爲0
n = (guard || n === undefined) ? 1 : toInteger(n);
//將n的值處理爲開始索引的值
n = length - n;
//開始索引值有兩種情況,若n小於0,則取值爲0,反之就取n的值
//結束索引值爲數組長度
return baseSlice(array, n < 0 ? 0 : n, length);
}
module.exports = takeRight;
和take的區別就是在切片的起始索引值和結束索引值啦
在take中確定的是開始索引值爲0,而在該函數中,確定的是結束索引值爲數組長度
4、.takeRightWhile(array, [predicate=.identity])
官方給出的功能介紹是:從array數組的最後一個元素開始提取元素,直到 predicate 返回假值。predicate 會傳入三個參數: (value, index, array)
我們來看官方給出的例子:
這個方法和dropRightWhile功能是相對的,所以這個例子的解釋也和dropRightWhile的文章中的差不多
我們直接來看源碼:
function takeRightWhile(array, predicate) {
return (array && array.length)
//數組不爲空則輸出以下表達式
//可以看到第三個值爲false就意味着不是isDrop,第四個值爲true則意味着從右(結束位置)開始
? baseWhile(array, baseIteratee(predicate, 3), false, true)
: [];
}
module.exports = takeRightWhile;
這個我就餓不多說啦,可以去看看drop系列的文章,裏面有介紹baseWhile的源碼及功能
5、.takeWhile(array, [predicate=.identity])
該函數和第4個函數是一樣的,只是在baseWhile的函數中第四個值爲false,不從結束位置開始
我們來看例子和源碼:
例子就不多說啦
下面看源碼:
function takeWhile(array, predicate) {
return (array && array.length)
? baseWhile(array, baseIteratee(predicate, 3))
: [];
}
module.exports = takeWhile;
和第四個函數takeRightWhile的區別就在於baseWhile的參數,沒有第三和第四參數,所以該方法從數組開始位置開始
這個take系列和drop系列是相對應的,大家可以對比着去看,不要弄混了
今天就到這裏了