本章的內容主要是:fromPairs、toPairs、indexOf、baseIndexOf、strictIndexOf、lastIndexOf
Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手
接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧
1、_.fromPairs(pairs)
根據中文文檔介紹,該方法可以將傳入的值對轉化爲對象
我們來看官方給出的例子:
可以看到,該方法將一個二維數組變成了一個對象
同時也說到,該方法與toPairs功能相反,所以有必要等會介紹一下toPairs
接下來我們看源碼:
function fromPairs(pairs) {
var index = -1,
//獲取數組的長度
length = pairs == null ? 0 : pairs.length,
result = {};
while (++index < length) {
//從二維數組中取出一維數組
var pair = pairs[index];
//使得一維數組中的第一個元素對應第二個元素
result[pair[0]] = pair[1];
}
return result;
}
module.exports = fromPairs;
該方法在解析過程中不難看到,如果二維數組中的一維數組含有三個及三個以上的值,則直接無視了多於的值。
接下來我們看它對應功能相反的函數toPairs
2、_.toPairs(object)
它的功能自然是能夠將一個對象轉化爲數組了
創建一個object對象自身可枚舉屬性的鍵值對數組。這個數組可以通過_.fromPairs撤回。如果object 是 map 或 set,返回其條目。
下面看官方給的例子:
我們下面來看它的源碼:
var toPairs = createToPairs(keys);
module.exports = toPairs;
我也驚呆了,依賴了其他的函數,當我深究過去時發現又陷入死循環了,所以這個方法就寫到這裏的,具體功能大家瞭解一下就好,其他的依賴方法以後會提到
3、_.indexOf(array, value, [fromIndex=0])
中文文檔的介紹是:使用 SameValueZero 等值比較,返回首次 value 在數組array中被找到的 索引值, 如果 fromIndex 爲負值,將從數組array尾端索引進行匹配
該方法很像js的內置對象,我們來看官方給出的例子:
第一個例子查找2,找到了第一個2的索引爲1
第二個例子也是查找2,不過開始位置是從2開始,所以索引爲3
接下來看源碼:
function indexOf(array, value, fromIndex) {
//獲取數組長度
var length = array == null ? 0 : array.length;
//長度爲0輸出-1
if (!length) {
return -1;
}
//確定fromIndex的值,不存在時爲0
//值爲負值時,通過加上數組長度轉化爲正值
var index = fromIndex == null ? 0 : toInteger(fromIndex);
if (index < 0) {
index = nativeMax(length + index, 0);
}
//依靠核心函數進行處理
return baseIndexOf(array, value, index);
}
module.exports = indexOf;
到了這裏又不得不提baseIndexOf了
4、_.baseIndexOf
中文文檔中沒有介紹,所以也只好看源碼了:
/**
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} value The value to search for.
* @param {number} fromIndex The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseIndexOf(array, value, fromIndex) {
return value === value
//一般輸出第一個函數的處理值
? strictIndexOf(array, value, fromIndex)
: baseFindIndex(array, baseIsNaN, fromIndex);
}
module.exports = baseIndexOf;
所以我們又要去追根尋底去了解一下strictIndexOf函數的功能
5、_.strictIndexOf
官方文檔也沒有介紹,所以也只能看源碼了
/**
* A specialized version of `_.indexOf` which performs strict equality
* comparisons of values, i.e. `===`.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} value The value to search for.
* @param {number} fromIndex The index to search from.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function strictIndexOf(array, value, fromIndex) {
//開始位置減1變成索引值
var index = fromIndex - 1,
length = array.length;
while (++index < length) {
//循環判斷查找位置
if (array[index] === value) {
return index;
}
}
return -1;
}
module.exports = strictIndexOf;
終於不再依賴其他的方法了,到這裏就告一段落了,還有一個情況大家可以去自己瞭解一下
6、_.lastIndexOf(array, value, [fromIndex=array.length-1])
引用中文文檔介紹:這個方法類似 _.indexOf ,區別是它是從右到左遍歷array的元素。
接下來看官方給的例子:
沒什麼好說的,就是從右開始查找索引
接下來看源碼;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max,
nativeMin = Math.min;
function lastIndexOf(array, value, fromIndex) {
//獲取數組長度
var length = array == null ? 0 : array.length;
//數組爲空輸出-1
if (!length) {
return -1;
}
var index = length;
//確定開始索引
if (fromIndex !== undefined) {
index = toInteger(fromIndex);
//如果開始索引小於0,進行轉化爲正值的處理
index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
}
return value === value
? strictLastIndexOf(array, value, index)
: baseFindIndex(array, baseIsNaN, index, true);
}
module.exports = lastIndexOf;
對於最後實現的strictLastIndexOf函數我就不說了,實現方法應該和indexOf裏面的一樣,感興趣的可以去看看
今天的東西也挺多的了,就到這裏吧,源碼有些還是比較難看懂的,我也有很多看不懂需要去網上查,所以不要與源碼較勁,實際中瞭解功能就好了。
每天進步一點點