Lodash原始碼分析-fromPairs.js

DrMoon發表於2017-12-21

前言

本系列使用 lodash 4.17.4版本

此方法沒有對其他方法進行引用

正文

原始碼

/**
 * The inverse of `toPairs`is method returns an object composed
 * from key-value `pairs`.
 *
 * @since 4.0.0
 * @category Array
 * @param {Array} pairs The key-value pairs.
 * @returns {Object} Returns the new object.
 * @example
 *
 * fromPairs([['a', 1], ['b', 2]])
 * // => { 'a': 1, 'b': 2 }
 */
function fromPairs(pairs) {
  const result = {}
  if (pairs == null) {
    return result
  }
  for (const pair of pairs) {
    result[pair[0]] = pair[1]
  }
  return result
}

export default fromPairs
複製程式碼

解析

引數

該方法接受一個將被轉換為物件的二維陣列。

返回值

該方法返回一個物件。

方法解析

1.該方法會首先定義一個result空物件。

2.該方法會判斷傳入的引數是否為空陣列,若為空陣列則會直接將result空物件返回給呼叫該方法的地方;若不為空繼續下一步。

3.該方法會對傳入的二維陣列進行遍歷操作,在遍歷中,將二維陣列下的每個一維陣列的第一項轉換為字串作為物件的屬性,第二項作為物件的屬性值,組成一對鍵值對賦給之前定義的result物件。遍歷操作結束後,將result物件返回給該方法呼叫的地方。

注: 該方法沒有對傳入的引數進行型別判斷。

  • 當傳入的引數為nullundefined時會被視為空陣列或空變數而直接將空物件result返回給呼叫的地方;
  • 當傳入一維陣列時,因為一維陣列下沒有陣列的前兩項來組成鍵值對賦給物件,所以會產生一個undefine: undefined鍵值對賦值給物件;
  • 而當傳入字串時,會將字串視為一個由一個個字元組成的陣列進行遍歷操作,而每個字元又會被視為一個只有一項值為字元的陣列,這樣在遍歷過程中便會把每個字元作為屬性,undefined作為屬性值賦值給物件;
  • 傳入其他型別的值則會直接丟擲一個錯誤,因為其他型別的值不可被遍歷操作。
  • 若傳入的二維以上高於二維的陣列時,在遍歷組成鍵值對給物件賦值的過程中,會將低一維的陣列的第一項轉換為字串來作為屬性。如傳入三維陣列後,在遍歷過程中會將其下每個二維陣列的第一項轉換為字串作為屬性,第二項不變作為屬性值來組成鍵值對賦值給陣列。

注: 當傳入的二維陣列下的一維陣列值不足兩個,不足的會以undefined代替,超過兩個的會被無視。

注: 當傳入的二維陣列下的一維陣列值不足兩項時,不足的項會以undefined代替,超過兩項的項會被無視。

示例

fromPairs([[3, 1], [6, 5]]);
--> {'3': 1, '6': 5}
fromPairs([[5, 3, 6], [2]])
--> {2: undefined, 5: 3}
fromPairs([[[5, 3, 6], [2]], [[2, 7], [1, 8]]])
--> {5,3,6: Array(1), 2,7: Array(2)}
fromPairs("DrMoon");
--> {D: undefined, r: undefined, M: undefined, o: undefined, n: undefined}
fromPairs(5);
--> Uncaught TypeError: pairs is not iterable
fromPairs(true);
--> Uncaught TypeError: pairs is not iterable
fromPairs(null);
--> null
fromPairs(undefined);
--> undefined
複製程式碼

總結

該方法會將傳入的二維陣列轉換為一個物件,二維陣列下每個一維陣列的前兩項組成一對鍵值對作為物件的屬性與屬性值。

相關連結:

每日原始碼分析 - lodash(debounce.js和throttle.js)

lodash原始碼分析(create.js)

每日原始碼分析 - Lodash(remove.js)

本文章來源於午安煎餅計劃Web組 - 殘陽

相關文章