每日原始碼分析 - lodash(chunk.js)

Canace22發表於2017-12-15

一. 寫在前面:


本系列使用 lodash 4.17.4版本

這個函式的作用是用來切割陣列的,通過傳入陣列 Array 和塊數量 size 來進行陣列分割,返回新的陣列塊.

二. 函式使用示例



function chunk(array, size) {
  size = Math.max(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++] = array.slice(index, (index += size))
  }
  return result
}
var ret = chunk(['a', 'b', 'c', 'd'], 2)
console.log(ret)
複製程式碼

輸出結果為:

[ [ 'a', 'b' ], [ 'c', 'd' ] ]
[Finished in 1.2s]
複製程式碼

三. 模組程式碼:


import slice from './slice.js'

function chunk(array, size) {
  size = Math.max(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
複製程式碼

四. 對程式碼的具體解釋(以下順序是按照程式碼順序進行解釋的)


  1. import slice from './slice.js' 通過 ECMAscript6新特性,引用 slice 模組。

  2. function chunk(array, size) {}

    (1)chunk 函式主體, 引數 array 表示原始陣列,為區域性變數;

    (2)size 表示拆分後的每個新陣列長度,為區域性變數。

  3. size = Math.max(size, 0)

    (1)尋找 0~size 之間的最大值,並賦值給size。

    (2)目的是檢查傳入的 size 值是否大於等於 0,如果 size 小於0,size 取0.

  4. const length = array == null ? 0 : array.length

    (1)宣告一個變數length,const 宣告的變數需要同時初始化,而且只能賦值一次, 一旦初始化後,該變數的值就不能改變;

    (2) 如果 array is null, then length = 0,否則 length = array.length,這裡的條件語句用了簡寫模式,需要轉一下彎,不然容易搞錯。

  5. 如果 length 等於0,或者 size 小於 1 時,返回空陣列。

if (!length || size < 1) {
    return []
  }
複製程式碼
  1. 宣告塊級變數 index、 resIndex
  let index = 0
  let resIndex = 0
複製程式碼
  1. const result = new Array(Math.ceil(length / size))

    (1)建立一個新的陣列 result ,呼叫Math方法計算length / size 的值,並向上取整。

    (2)給 result 陣列分配一個定長的記憶體空間。

  2. 當 index 小於 length 時,原陣列取 index 到 index+size 位元素,存到result陣列裡。

  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
複製程式碼
  1. return result 返回新的result陣列

  2. export default chunk 預設匯出函式 chunk

五. 寫在最後:


本文章來源於午安煎餅計劃Web組 - 初見

由於本人水平有限,很多地方理解不到位,還請各位大佬指正。

相關連結:

每日原始碼分析-Lodash(castArray.js)

每日原始碼分析 - lodash ( after.js )

HTML 語義化

關於瀏覽器核心及其 CSS 寫法

相關文章