lodash源碼之chunk

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 出去即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容