Lodash源码分析-compact.js

1,632 阅读2分钟

前言

此方法没有对其他方法进行引用

正文

源代码

/**
 * 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组 - 残阳