JavaScript實用庫:Lodash源碼數組函數解析(十)tail、take、takeRight、takeRightWhile、takeWhile

本章的內容主要是:tail、take、takeRight、takeRightWhile、takeWhile


在這裏插入圖片描述

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

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


1、_.tail(array)

根據官方文檔介紹,該方法可以獲取array數組中第一個以外的全部元素

我們發現它和之前的方法 **_.initial(array)**有點類似,initial是去除最後一個元素
JavaScript實用庫:Lodash源碼數組函數解析(八)initial、join、last、nth、baseNth、(isIndex)

下面直接看官方給出的例子:
在這裏插入圖片描述確實是去除了第一個元素

我們接下來看源碼:

function tail(array) {
  //獲取數組的長度
  var length = array == null ? 0 : array.length;
  //對array數組進行切片
  //起始索引位置固定爲1,不包含第一個元素
  //結束索引位置爲數組長度
  return length ? baseSlice(array, 1, length) : [];
}

module.exports = tail;

可以看到和initial一樣使用了核心的切片函數


2、_.take(array, [n=1])

官方解釋:創建一個數組切片,從array數組的起始元素開始提取n個元素

這個方法也有點眼熟,我馬上就想起了drop
JavaScript實用庫:Lodash源碼數組函數解析(三) drop、toInteger、toFinite

我們來看官方給出的例子:
在這裏插入圖片描述第一個例子是取出數組中前1個元素,所以得到一個含1的數組
第二個例子是取出數組中前2個元素,所以得到一個含1,2的數組

後面的就不說啦,還挺好理解的
接下來直接看源碼:

function take(array, n, guard) {
  //排除數組爲空的情況
  if (!(array && array.length)) {
    return [];
  }
  //確定n的值,n若無定義則爲1
  n = (guard || n === undefined) ? 1 : toInteger(n);
  //對數組進行切片
  //開始索引位置爲0
  //結束索引位置有兩種情況,若n小於0,則結束位置索引爲0,反之取n的值
  return baseSlice(array, 0, n < 0 ? 0 : n);
}

module.exports = take;

都是一些老朋友的核心函數了,一下就能理解是什麼意思了


3、_.takeRight(array, [n=1])

該方法從命名上就知道是從數組的右邊開始取出元素啦,所以他的功能就是取出從數組結束位置開始取出n個元素

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

例子也和第二個解釋的元素一樣,挺好理解的

我們直接看源碼吧:

function takeRight(array, n, guard) {
  //獲取數組的長度
  var length = array == null ? 0 : array.length;
  //若數組爲空則輸出空數組
  if (!length) {
    return [];
  }
  //確定n的值,默認值爲0
  n = (guard || n === undefined) ? 1 : toInteger(n);
  //將n的值處理爲開始索引的值
  n = length - n;
  //開始索引值有兩種情況,若n小於0,則取值爲0,反之就取n的值
  //結束索引值爲數組長度
  return baseSlice(array, n < 0 ? 0 : n, length);
}

module.exports = takeRight;

take的區別就是在切片的起始索引值和結束索引值啦
take中確定的是開始索引值爲0,而在該函數中,確定的是結束索引值爲數組長度


4、.takeRightWhile(array, [predicate=.identity])

官方給出的功能介紹是:從array數組的最後一個元素開始提取元素,直到 predicate 返回假值。predicate 會傳入三個參數: (value, index, array)

我們來看官方給出的例子:
在這裏插入圖片描述
這個方法和dropRightWhile功能是相對的,所以這個例子的解釋也和dropRightWhile的文章中的差不多

我們直接來看源碼:

function takeRightWhile(array, predicate) {
  return (array && array.length)
    //數組不爲空則輸出以下表達式
    //可以看到第三個值爲false就意味着不是isDrop,第四個值爲true則意味着從右(結束位置)開始
    ? baseWhile(array, baseIteratee(predicate, 3), false, true)
    : [];
}

module.exports = takeRightWhile;

這個我就餓不多說啦,可以去看看drop系列的文章,裏面有介紹baseWhile的源碼及功能


5、.takeWhile(array, [predicate=.identity])

該函數和第4個函數是一樣的,只是在baseWhile的函數中第四個值爲false,不從結束位置開始

我們來看例子和源碼:
在這裏插入圖片描述

例子就不多說啦

下面看源碼:

function takeWhile(array, predicate) {
  return (array && array.length)
    ? baseWhile(array, baseIteratee(predicate, 3))
    : [];
}

module.exports = takeWhile;

和第四個函數takeRightWhile的區別就在於baseWhile的參數,沒有第三和第四參數,所以該方法從數組開始位置開始


這個take系列和drop系列是相對應的,大家可以對比着去看,不要弄混了

今天就到這裏了

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