基本思想
沒有看過chunk函數的內部實現,根據官方文檔給出的功能自己編寫實現。
chunk函數接受兩個參數,第一參數爲array類型,第二個參數爲number類型,其作用的是:將數組(array)拆分成多個 size 長度的區塊,並將這些區塊組成一個新數組。 如果array 無法被分割成全部等長的區塊,那麼最後剩餘的元素將組成一個區塊。例子如下:
_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
這裏我沒有遍歷整個數組,這樣是沒有必要的,利用Aarry類型的slice函數進行優化:
- 首先要判斷傳入函數的參數類型,如果不是array或者第二參數不是number要拋出異常
- 記錄每個分割的臨時數組的長度,用數組的整個長度餘上要分割的數量
- 看這個餘數是否爲0,如果不爲0,做除法後要加1,這是因爲我們前面要儘可能添加多的元素
- 這裏有個坑的點,我們最後part的值要娶一個整數,然後除法運算符默認返回IEEE754浮點數,例如:5/3返回的是1.666666667這種,要用parseInt轉換爲int
- 這樣之後,我們只要每次截取part個值即可,只需循環size次就可以得到答案
實現代碼
(function(window){
function chunk(arr, splitnum){
/** 首先判斷類型,如果類型不對,直接拋出異常 */
if(typeof splitnum != 'number' || (Object.prototype.toString.call(arr) != '[object Array]')){
throw Error("當前參數類型錯誤");
}
let rest = arr.length % splitnum;
let newArr = [], part = (rest == 0 ? parseInt(arr.length / splitnum) : parseInt(arr.length / splitnum + 1));
for(let index = 0; index < splitnum; index ++){
let start = (index * part), end = ((start + part) > arr.length ? arr.length : (start + part));
let tmpArr = arr.slice(start, end);
newArr.push(tmpArr);
}
return newArr;
}
window.chunk = chunk;
})(window);