1、使用場景
_.chunk(array, [size=1])
將數(shù)組(array)拆分成多個 size 長度的區(qū)塊,并將這些區(qū)塊組成一個新數(shù)組。 如果 array 無法被分割成全部等長的區(qū)塊,那么最后剩余的元素將組成一個區(qū)塊。
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
2、自己實(shí)現(xiàn)一個簡單的chunk方法
看到 chunk 方法的使用示例之后,自己實(shí)現(xiàn)了一個簡單 chunk 函數(shù),不過沒有對參數(shù)的類型做太多的處理。
function chunk(arr, size = 1) {
if(size >= arr.length) {
return arr;
} else if(size < 1) {
return [];
};
const newArr = [];
const loop = Math.ceil(arr.length / size);
for(let i = 0; i < loop; i++) {
newArr.push(arr.slice(i * size, (i + 1) * size));
};
return newArr;
};
3、源碼分析
chunk.js
import slice from './slice.js'
import toInteger from './toInteger.js'
function chunk(array, size = 1) {
size = Math.max(toInteger(size), 0)
const length = array == null ? 0 : array.length
if (!length || size < 1) {
return []
}
let index = 0
let resIndex = 0
const result = new Array(Math.ceil(length / size))
while (index < length) {
result[resIndex++] = slice(array, index, (index += size))
}
return result
}
export default chunk
分析 chunk 這個函數(shù),從函數(shù)傳入的參數(shù)開始:
1. 參數(shù)
function chunk(array, size = 1)
如果 chunk() 這個方法只傳一個參數(shù),那么 size 默認(rèn)取 1,傳入的數(shù)組 array 就會被分割成長度是 1 的數(shù)組。即:chunk([1,2,3]) => [[1],[2],[3]]
2、對參數(shù)size的處理
size = Math.max(toInteger(size), 0)
首先解釋 toInteger(size) 這個方法,這個方法可以把 size 轉(zhuǎn)換成整數(shù),如果 size 不能轉(zhuǎn)換成 Number 類型,該方法就返回 0。Math.max 方法是取最大值??偨Y(jié)下來就是:
- size 是負(fù)數(shù)和0、以及轉(zhuǎn)換成 Number 類型后不是正數(shù)的,size = 0;
- 別的情況 size = Math.floor(Number(size));
3、如果傳入的array和size不符合,就直接返回[]
const length = array == null ? 0 : array.length
if (!length || size < 1) {
return []
}
這里總結(jié)了返回 [] 的幾種情況:
- size < 1;
- array 是空數(shù)組;
- array 類型是:Boolean、undefined、null、Number;
如果參數(shù)類型都符合條件,就到了正式處理的環(huán)節(jié)了:
let index = 0
let resIndex = 0
const result = new Array(Math.ceil(length / size))
while (index < length) {
result[resIndex++] = slice(array, index, (index += size))
}
return result
const result = new Array(Math.ceil(length / size))
這里先使用new Array讓result成為一個固定長度的空數(shù)組,可能會比直接讓它成為一個空數(shù)組性能更高一些;
while (index < length) {
result[resIndex++] = slice(array, index, (index += size))
}
slice(array, index, (index += size)) 實(shí)際上就類似數(shù)組的 slice 方法,即:array.slice(index, index += size) 。
最后 把 result 這個數(shù)組 return 出去即可。