Lodash源碼解析-------chunk函數

基本思想

沒有看過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函數進行優化:

  1. 首先要判斷傳入函數的參數類型,如果不是array或者第二參數不是number要拋出異常
  2. 記錄每個分割的臨時數組的長度,用數組的整個長度餘上要分割的數量
  3. 看這個餘數是否爲0,如果不爲0,做除法後要加1,這是因爲我們前面要儘可能添加多的元素
  4. 這裏有個坑的點,我們最後part的值要娶一個整數,然後除法運算符默認返回IEEE754浮點數,例如:5/3返回的是1.666666667這種,要用parseInt轉換爲int
  5. 這樣之後,我們只要每次截取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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章