原文首發於Lodash源碼講解javascript
這是咱們閱讀Lodash源碼的第2篇博客,在這篇文章裏咱們來學習一下Lodash的chunk
方法。java
chunk
函數內部依賴其餘的函數,依賴的函數以下所示;git
slice
github
按照慣例,咱們先來看一下關於chunk
方法的源碼chunk.js:數組
import slice from './slice.js' /** * Creates an array of elements split into groups the length of `size`. * If `array` can't be split evenly, the final chunk will be the remaining * elements. * * @since 3.0.0 * @category Array * @param {Array} array The array to process. * @param {number} [size=1] The length of each chunk * @returns {Array} Returns the new array of chunks. * @example * * chunk(['a', 'b', 'c', 'd'], 2) * // => [['a', 'b'], ['c', 'd']] * * chunk(['a', 'b', 'c', 'd'], 3) * // => [['a', 'b', 'c'], ['d']] */ function chunk(array, size) { // #1 size = Math.max(size, 0) const length = array == null ? 0 : array.length if (!length || size < 1) { return [] } // #2 let index = 0 let resIndex = 0 const result = new Array(Math.ceil(length / size)) // #3 while (index < length) { result[resIndex++] = slice(array, index, (index += size)) } return result } export default chunk
首先來講一下這個函數的做用;這個函數是用在數組上的一個方法,它將原來數組中的元素,按照給定的長度進行均分,均分後每一部分都是一個新的(小)數組,而後將這些均分的每一部分再次組成一個新的(大)數組;若是不可以均分的話,新的(大)數組的最後一個元素則包含這些剩下的元素。app
代碼演示以下:函數
chunk(['a', 'b', 'c', 'd'], 2) // => [['a', 'b'], ['c', 'd']] chunk(['a', 'b', 'c', 'd'], 3) // => [['a', 'b', 'c'], ['d']]
接下來,咱們仍是按照標記的順序來逐步講解一下這個代碼:學習
#1
:這一部分首先對傳遞的參數作一個處理,先判斷傳遞的size
的大小,若是不大於0
,那麼就取0
做爲size
的值;而後判斷傳遞的array
的值是否爲空,若是爲空就把數組的長度設置爲零,不然就獲取數組的長度;最後判斷size
和length
的值,若是length
爲0
或者size
小於0
的話,直接返回一個空的數組。code
#2
:這部分定義了兩個變量,index
用來做爲原數組的索引,resIndex
用來做爲新生成的數組的索引;而後根據size
的大小生成了一個新的數組result
,咱們這裏使用Math.ceil(length / size)
是向上取整,由於有可能出現剩餘元素的狀況。索引
#3
:經過一個while
循環不斷地從原數組裏取出指定長度的片斷,這裏使用到了slice
函數,這個函數咱們以前已經講解過了,這裏就不在詳細的解釋了;而後當循環完成以後,咱們就把這個新的數組做爲結果返回。
這個函數的內部實現由於依賴了slice
,因此總體仍是比較簡單的;我寫了一個例子_.chunk,你們也都本身親手實踐一下;畢竟實踐出真知呀。好啦,關於函數chunk
暫時就先講到這裏啦。
與惡龍纏鬥太久,自身亦成爲惡龍;凝視深淵太久,深淵將回以凝視。