Lodashソース解析------chunk関数


基本思想.
chunk関数の内部実装は見たことがなく,公式ドキュメントから与えられた機能に基づいて自分で実装を記述する.
chunk関数は、2つのパラメータを受け入れ、第1のパラメータはarrayタイプ、第2のパラメータは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または第2のパラメータがnumberでない場合、異常
  • を放出する受信関数のパラメータタイプを判断する.
  • は、分割する個々の一時配列の長さを記録し、配列全体の長さで分割する数
  • を残す.
  • この余数が0であるかどうかを見て、0でなければ、除算した後に1を加えなければならない.これは私たちの前にできるだけ多くの要素
  • を追加しなければならないからだ.
  • ここに穴がある点、私たちの最後のpartの値は整数と結婚し、除算演算子はデフォルトでIEEE 754浮動小数点数を返します.例えば、5/3は1.66666666667を返します.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);