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

Canace22發表於2017-12-19

本系列使用 lodash 4.17.4版本

原始碼分析不包括引用檔案分析

一、原始碼

import basePullAt from './.internal/basePullAt.js'

/**
 * Removes all elements from `array` that `predicate` returns truthy for
 * and returns an array of the removed elements. The predicate is invoked
 * with three arguments: (value, index, array).
 *
 * **Note:** Unlike `filter`, this method mutates `array`. Use `pull`
 * to pull elements from an array by value.
 *
 * @since 2.0.0
 * @category Array
 * @param {Array} array The array to modify.
 * @param {Function} predicate The function invoked per iteration.
 * @returns {Array} Returns the new array of removed elements.
 * @see pull, pullAll, pullAllBy, pullAllWith, pullAt, reject, filter
 * @example
 *
 * const array = [1, 2, 3, 4]
 * const evens = remove(array, n => n % 2 == 0)
 *
 * console.log(array)
 * // => [1, 3]
 *
 * console.log(evens)
 * // => [2, 4]
 */
function remove(array, predicate) {
  const result = []
  if (!(array != null && array.length)) {
    return result
  }
  let index = -1
  const indexes = []
  const { length } = array

  while (++index < length) {
    const value = array[index]
    if (predicate(value, index, array)) {
      result.push(value)
      indexes.push(index)
    }
  }
  basePullAt(array, indexes)
  return result
}

export default remove
複製程式碼

二、函式作用

函式引用示例:

var _= require('lodash');

//using remove.js
const array = [1, 2, 3, 4]

const evens = _.remove(array, n => n % 2 == 0)

console.log(array)
// => [1, 3]

console.log(evens)
// => [2, 4]
複製程式碼

從上面的例子可以看出:

  • remove 函式共有兩個引數,即 array 和 predicate 。

  • array 引數傳入的是一個陣列,predicate 傳入的是一個函式。

  • remove函式 的返回結果就是經 predicate 處理後為真的元素組成的陣列,即被移除的元素組成的新陣列。

  • 被相應移除元素後,array 陣列由剩下的元素組成。

三、函式工作原理

  1. 判斷引數合法性, 若陣列 array 為空,則返回空陣列 result;

    if (!(array != null && array.length)) {
        return result
    複製程式碼

} ```

  1. 遍歷陣列;
while (++index < length) {
    const value = array[index]
    if (predicate(value, index, array)) {
      result.push(value)
      indexes.push(index)
    }
  }
複製程式碼
  • 把由 predicate 過濾為真值的元素放入新陣列 result 中;

  • 把遍歷的索引 index 放入 indexs 中;

  1. 移除陣列在 indexs 中對應索引的元素,並返回這些元素.
basePullAt(array, indexes)
複製程式碼

本文章來源於午安煎餅計劃Web組 - 初見

相關連結:

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

每日原始碼分析 – lodash(slice.js)

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

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

相關文章