Lodash原始碼分析-compact.js

DrMoon發表於2017-12-18

前言

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

正文

原始碼

/**
 * Creates an array with all falsey values removed. The values `false`, `null`,
 * `0`, `""`, `undefined`, and `NaN` are falsey.
 *
 * @since 0.1.0
 * @category Array
 * @param {Array} array The array to compact.
 * @returns {Array} Returns the new array of filtered values.
 * @example
 *
 * compact([0, 1, false, 2, '', 3])
 * // => [1, 2, 3]
 */
function compact(array) {
  let resIndex = 0
  const result = []

  if (array == null) {
    return result
  }

  for (const value of array) {
    if (value) {
      result[resIndex++] = value
    }
  }
  return result
}

export default compact
複製程式碼

解析

引數

該方法接受一個陣列作為引數

返回值

該方法返回一個陣列

方法解析

該方法首先會宣告一個初始值為0的區域性變數resIndex和一個初始值是一個空陣列[]的區域性變數result

之後先判斷傳入的引數是否是一個空陣列,若為空,直接將上一步宣告的空陣列result返回給呼叫該方法的地方,否則繼續執行下一步。

接下來遍歷傳入的陣列引數,遍歷過程中若當前的值為真,將其push入之前宣告的區域性變數陣列result。遍歷結束後,將result陣列返回給呼叫該方法的地方。

注: 該方法沒有對傳入的引數進行型別判斷,但當傳入的引數為nullundefined時會被視為空陣列或空變數而直接返回空陣列;而當傳入字串時,會將字串視為一個由一個個字元組成的陣列進行遍歷操作,最後會返回一個由拆成一個個字元組成的陣列;傳入其他型別的值則會直接丟擲一個錯誤,因為其他型別的值不可被遍歷操作。

示例

compact([1, undefined, 2, null, NaN, 3, false, "null"])
--> [1, 2, 3, "null"]
compact(null)
--> []
compact(undefined)
--> []
compact("I love Javascript!")
--> ["I", " ", "l", "o", "v", "e", " ", "J", "a", "v", "a", "s", "c", "r", "i", "p", "t", "!"]
compact(3)
--> Uncaught TypeError: array is not iterable
compact({a: 1, b: 2, c: 3})
--> Uncaught TypeError: array is not iterable
compact(true)
--> Uncaught TypeError: array is not iterable
複製程式碼

總結

該方法傳入一個陣列,返回一個由舊陣列中的真值組成的新陣列。

相關連結:

每日原始碼分析 - lodash(after.js)

每日原始碼分析 - lodash(chunk.js)

每日原始碼分析 - lodash(castArray.js)

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

相關文章