閱讀lodash原始碼之旅陣列方法篇 chunk

2021-10-11 12:57:42 字數 4729 閱讀 4311

作用和用法

將陣列(array)拆分成多個 size 長度的區塊,並將這些區塊組成乙個新陣列。 如果array

無法被分割成全部等長的區塊,那麼最後剩餘的元素將組成乙個區塊。

用法:

_.chunk(array, [size=1])

array (array): 需要處理的陣列

[size=1] (number): 每個陣列區塊的長度

demo:

_.

chunk([

'a',

'b',

'c',

'd'],2

);// => [['a', 'b'], ['c', 'd']] _.

chunk([

'a',

'b',

'c',

'd'],3

);// => [['a', 'b', 'c'], ['d']]

原始碼分析

chunk所依賴的函式分別有

1.tonumber.js

2.tofinite

3.tointeger

4.slice

5.chunk

那麼我們就逐一來分析每個函式的具體實現過程。

1.isobject

顧名思義,這個函式是用來判斷傳遞的引數是否是物件型別,值得一提的是在js中,你用typeof null 出來的結果為object,這種情況我們需要排除掉。

知識點:

typeof null的值為object

typeof function的值為function

*

isobject()

*// => true**

isobject([

1,2,

3])*

// => true**

isobject

(function)

*// => true**

isobject

(null)*

// => false

function

isobject

(value)

2.tonumber

這個函式所作的主要功能為把你所傳遞引數,以number型別返回。

*

tonumber

(3.2)*

// => 3.2**

tonumber

(number.

min_value)*

// => 5e-324**

tonumber

(infinity)*

// => infinity**

tonumber

('3.2')*

// => 3.2

const

nan=0/

0// 用來匹配前後兩個空格

const retrim =

/^\s+|\s+$/g

// 用來檢測二進位制的數字 i 不區分(ignore)大小寫;

const reisbinary =

/^0b[01]+$/i

// 用來檢測八進位制的數字 i 不區分(ignore)大小寫;

const reisoctal =

/^0o[0-7]+$/i

// 用來檢測錯誤的16進製制的數字 i 不區分(ignore)大小寫;

const reisbadhex =

/^[-+]0x[0-9a-f]+$/i

const freeparseint = parseint

function

tonumber

(value)if(

issymbol

(value))if

(isobject

(value))`

: other

}// 判斷null的情況if(

typeof value !==

"string"

) value = value.

replace

(retrim,'')

// 替換前後兩個空格

// 如果是十進位制的數字 直接+value 返回

const isbinary = reisbinary.

test

(value)

return

(isbinary || reisoctal.

test

(value))?

freeparseint

(value.

slice(2

), isbinary ?2:

8):(reisbadhex.

test

(value)

?nan

:+value)

}function

issymbol

(value)

知識點:

valueof— 除了null和undefine沒有valueof方法之外,其它的基本資料型別都有

js隱式轉換

3.tofinite

這個函式是把number型別的數字轉換成為有限的數字

const

infinity=1

/0const

max_integer

=1.7976931348623157e+308

function

tofinite

(value)

value =

tonumber

(value)

if(value ===

infinity

|| value ===

-infinity

)return value === value ? value :

0// 如果是nan === nan 則為false 此時的值為0

}

4.tointeger

這個函式是把輸入的value轉換成為整數

*

tointeger

(3.2)*

// => 3**

tointeger

(number.

min_value)*

// => 0**

tointeger

(infinity)*

// => 1.7976931348623157e+308**

tointeger

('3.2')*

// => 3

*/

function

tointeger

(value)

5.slice

example

var array =[1

,2,3

,4] _.

slice

(array,2)

// => [3, 4]

這個函式是用於切割陣列,

第乙個引數為切割的陣列,

第二個引數則是切割的起始值begin

第三個引數則是切割的終止位址,切割的個數為end - begin 個數。

let length = array ==

null?0

: array.length

if(!length)

start = start ==

null?0

: start

end = end === undefined ? length : end

if(start <0)

end = end > length ? length : end

if(end <0)

length = start > end ?0:

((end - start)

>>>0)

start >>>=

0let index =-1

const result =

newarray

(length)

while

(++index < length)

return result

知識點:

>>>

1 所有非數值轉換成0

2.所有大於等於 0 等數取整數部分

6.chunk

剩下來的這個函式就比較簡單了,

function

chunk

(array, size =1)

let index =

0let resindex =

0const result =

newarray

(math.

ceil

(length / size)

)// 向上取整獲取最大的陣列數

while

(index < length)

return result

}

lodash原始碼學習 陣列篇

1,chunk function slice array,start,end 1.1 對開始引數進行初步處理 start start null 0 start end end undefined length end 1.2 對開始引數再次進行負數異常處理 if start 0 1.3 對結束引數進...

Lodash原始碼精讀 chunk slice

today 2021.3.12 lodash 原始碼 將陣列 array 拆分成多個 size 長度的區塊,並將這些區塊組成乙個新陣列。如果array 無法被分割成全部等長的區塊,那麼最後剩餘的元素將組成乙個區塊。function chunk array,size 1 let index 0let ...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...