作用和用法
將陣列(array)拆分成多個 size 長度的區塊,並將這些區塊組成乙個新陣列。 如果array用法:無法被分割成全部等長的區塊,那麼最後剩餘的元素將組成乙個區塊。
_.chunk(array, [size=1])demo:array (array): 需要處理的陣列
[size=1] (number): 每個陣列區塊的長度
_.
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可以顯示出類的繼承和實現結構,包括它的父類和...