本章的內容主要是:remove、reverse、slice
Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手
接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧
1、.remove(array, [predicate=.identity])
這個我就直接引用中文文檔的介紹吧
移除數組中predicate(斷言)返回爲真值的所有元素,並返回移除元素組成的數組。predicate(斷言) 會傳入3個參數: (value, index, array)。
Note: 和 .filter不同, 這個方法會改變數組 array。使用.pull來根據提供的value值從數組中移除元素。
下面來看中文文檔給的例子:
原數組中依然保留1,3
新數組中元素含有2,4
這個相信都沒有什麼問題
下面來看源碼;
function remove(array, predicate) {
var result = [];
//數組爲空則輸出空數組
if (!(array && array.length)) {
return result;
}
var index = -1,
indexes = [],
length = array.length;
//設置三個參數
predicate = baseIteratee(predicate, 3);
while (++index < length) {
//取出數組中的元素
var value = array[index];
//在循環中如果符合函數條件,則在result數組中增加該值,並在indexes中記錄索引
if (predicate(value, index, array)) {
result.push(value);
indexes.push(index);
}
}
//該基本函數我沒有說過,但是如果想符合原數組只除去符合的值
//那麼我們可以猜測,該函數的功能應該是去除array數組中的indexes索引值的元素
basePullAt(array, indexes);
return result;
}
module.exports = remove;
這個應該問題不大,那麼接下來看下一個函數
2、_.reverse(array)
根據中文文檔的介紹呢,該方法的功能是將數組元素進行翻轉,在我們的JavaScript的內置對象裏面也有怎麼一個函數
Note: 這個方法會改變原數組 array,基於 Array#reverse,看來還真的是基於JavaScript的內置對象實現的
下面我們來看看官方給出的例子和源碼:
/** Used for built-in method references. */
var arrayProto = Array.prototype;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeReverse = arrayProto.reverse;
function reverse(array) {
//若數組爲空,則輸出空數組,否則調用內置對象reverse進行處理
return array == null ? array : nativeReverse.call(array);
}
module.exports = reverse;
因爲我現在只看lodash源碼,所以這個內置對象怎麼實現的就算了
3、_.slice(array, [start=0], [end=array.length])
這個又是一個JavaScript的內置對象相似的,看了中文文檔的介紹,是用來代替array#slice的
裁剪數組array,從 start 位置開始到end結束,但不包括 end 本身的位置
想到裁剪就一定想起了drop這一系列相關的功能類似的函數
JavaScript實用庫:Lodash源碼數組函數解析(三) drop、toInteger、toFinite
JavaScript實用庫:Lodash源碼數組函數解析(四)dropRight、dropWhile、dropRightWhile、baseWhile
這個官方有介紹,但是沒有例子啊
所以直接來看源碼吧
function slice(array, start, end) {
//獲取數組長度
var length = array == null ? 0 : array.length;
if (!length) {
return [];
}
//確定開始索引與結束索引的值
//如果沒有值則默認開始索引值爲0,結束索引值爲數組長度
if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
start = 0;
end = length;
}
else {
start = start == null ? 0 : toInteger(start);
end = end === undefined ? length : toInteger(end);
}
//最後使用切片函數進行切片
return baseSlice(array, start, end);
}
module.exports = slice;
有不少見過的函數了,包括toInteger,baseSlice,isIterateeCall這些在前面的文章都已經講過了,大家可以去看看
昨天回來有點晚,也有點累,所以沒有更新,放鬆了一下
還是得每天堅持吧