JavaScript實用庫:Lodash源碼數組函數解析(九)remove、reverse、slice

本章的內容主要是:remove、reverse、slice


在這裏插入圖片描述

Lodash是一個非常好用方便的JavaScript的工具庫,使得我們對數據處理能夠更加得心應手

接下來我要對Lodash的源碼進行剖析學習
每天幾個小方法,跟着我一起來學lodash吧


1、.remove(array, [predicate=.identity])

這個我就直接引用中文文檔的介紹吧

移除數組中predicate(斷言)返回爲真值的所有元素,並返回移除元素組成的數組。predicate(斷言) 會傳入3個參數: (value, index, array)。
Note: 和 .filter不同, 這個方法會改變數組 array。使用.pull來根據提供的value值從數組中移除元素。

下面來看中文文檔給的例子:
在這裏插入圖片描述
原數組中依然保留1,3
新數組中元素含有2,4
這個相信都沒有什麼問題

下面來看源碼;

function remove(array, predicate) {
  var result = [];
  //數組爲空則輸出空數組
  if (!(array && array.length)) {
    return result;
  }
  var index = -1,
      indexes = [],
      length = array.length;
      
  //設置三個參數
  predicate = baseIteratee(predicate, 3);
  while (++index < length) {
    //取出數組中的元素
    var value = array[index];
    //在循環中如果符合函數條件,則在result數組中增加該值,並在indexes中記錄索引
    if (predicate(value, index, array)) {
      result.push(value);
      indexes.push(index);
    }
  }
  //該基本函數我沒有說過,但是如果想符合原數組只除去符合的值
  //那麼我們可以猜測,該函數的功能應該是去除array數組中的indexes索引值的元素
  basePullAt(array, indexes);
  return result;
}

module.exports = remove;

這個應該問題不大,那麼接下來看下一個函數


2、_.reverse(array)

根據中文文檔的介紹呢,該方法的功能是將數組元素進行翻轉,在我們的JavaScript的內置對象裏面也有怎麼一個函數
Note: 這個方法會改變原數組 array,基於 Array#reverse,看來還真的是基於JavaScript的內置對象實現的

下面我們來看看官方給出的例子和源碼:
在這裏插入圖片描述

/** Used for built-in method references. */
var arrayProto = Array.prototype;

/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeReverse = arrayProto.reverse;


function reverse(array) {
  //若數組爲空,則輸出空數組,否則調用內置對象reverse進行處理
  return array == null ? array : nativeReverse.call(array);
}

module.exports = reverse;

因爲我現在只看lodash源碼,所以這個內置對象怎麼實現的就算了


3、_.slice(array, [start=0], [end=array.length])

這個又是一個JavaScript的內置對象相似的,看了中文文檔的介紹,是用來代替array#slice的
裁剪數組array,從 start 位置開始到end結束,但不包括 end 本身的位置

想到裁剪就一定想起了drop這一系列相關的功能類似的函數
JavaScript實用庫:Lodash源碼數組函數解析(三) drop、toInteger、toFinite
JavaScript實用庫:Lodash源碼數組函數解析(四)dropRight、dropWhile、dropRightWhile、baseWhile

這個官方有介紹,但是沒有例子啊

所以直接來看源碼吧

function slice(array, start, end) {
  //獲取數組長度
  var length = array == null ? 0 : array.length;
  if (!length) {
    return [];
  }
  //確定開始索引與結束索引的值
  //如果沒有值則默認開始索引值爲0,結束索引值爲數組長度
  if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
    start = 0;
    end = length;
  }
  else {
    start = start == null ? 0 : toInteger(start);
    end = end === undefined ? length : toInteger(end);
  }
  //最後使用切片函數進行切片
  return baseSlice(array, start, end);
}

module.exports = slice;

有不少見過的函數了,包括toIntegerbaseSliceisIterateeCall這些在前面的文章都已經講過了,大家可以去看看


昨天回來有點晚,也有點累,所以沒有更新,放鬆了一下
還是得每天堅持吧

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