JavaScript實用庫:Lodash源碼數組函數解析(七)fromPairs、toPairs、indexOf、baseIndexOf、strictIndexOf、lastIndexOf

本章的內容主要是: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裏面的一樣,感興趣的可以去看看


今天的東西也挺多的了,就到這裏吧,源碼有些還是比較難看懂的,我也有很多看不懂需要去網上查,所以不要與源碼較勁,實際中瞭解功能就好了。

每天進步一點點

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