lodash原始碼學習 陣列篇

2021-10-06 21:29:17 字數 4327 閱讀 9127

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 對結束引數進行初步處理

end = end > length ? length : end

// 1.4 對結束引數再次進行負數異常處理

if (end < 0)

//x >>> 0本質上就是保證x有意義(為數字型別),且為正整數,在有效的陣列範圍內(0 ~ 0xffffffff)

//,且在無意義的情況下預設值為0。乙個小小的表示式,隱藏著著多重的異常處理。js真是詭異啊。

length = start > end ? 0 : ((end - start) >>> 0)

start >>>= 0

let index = -1

const result = new array(length)

while (++index < ßlength)

return result

} function chunk(array, size)

let index = 0

let resindex = 0

// 用陣列的長度除以size並向上取整以得到分塊的個數,新建乙個長度為分塊個數的陣列result

const result = new array(math.ceil(length / size))

// 下面的while迴圈主要做的事情是遍歷array陣列,每次擷取array中的size個元素並將擷取結果新增到result陣列中

// while迴圈中index從0開始,每次增加size大小,直到index大於等於length時跳出迴圈

// 每次迴圈時,result陣列中的索引resindex加1

// 在每次迴圈體中,從array中擷取索引為index到(index+size)之間的元素返回乙個陣列,並將返回結果新增到result陣列中

// 擷取array元素時使用的方法slice實現可以檢視slice對應的原始碼分析

while (index < length)

// 返回最終結果result

return result

}

2,compact

// false, null, 0, "", undefined, 和 nan 都是被認為是「假值」。

// compact去除陣列的假值

function compact(array)

for (const value of array)

}return result

} export default compact

3,concat 

// array (array): 被連線的陣列。

// [values] (...*): 連線的值。

function concat(...rest))

}else

})return result;

}export default concat

4,difference

// 引數

// array (array): 要檢查的陣列。

// [values] (...array): 排除的值。

// 返回值

// (array): 返回乙個過濾值後的新陣列。

function isobjectlike(value)

function isarraylike(value)

function isarraylikeobject(value)

function basedifference(array, values, iteratee, comparator)

if (iteratee)

if (comparator)

else if (values.length >= large_array_size)

outer:

for (let value of array)

}result.push(value)

}else if (!includes(values, computed, comparator))

}return result

} function baseflatten(array, depth, predicate, isstrict, result)

for (const value of array) else

} else if (!isstrict)

}return result

} function difference(array, ...values)

export default difference

5.  differenceby

// array (array): 要檢查的陣列。

// [values] (...array): 排除的值。

// [iteratee=_.identity] (array|function|object|string): iteratee 呼叫每個元素。

// iteratee 會呼叫乙個引數:(value)。(首先使用迭代器分別迭代array 和 values中的每個元素,返回的值作為比較值)。

/** * gets the last element of `array`.

* * @since 0.1.0

* @category array

* @param array the array to query.

* @returns returns the last element of `array`.

* @example

* * last([1, 2, 3])

* // => 3

*/function last(array)

function differenceby(array, ...values)

return isarraylikeobject(array)

? basedifference(array, baseflatten(values, 1, isarraylikeobject, true), iteratee)

: }

export default differenceby

6,differencewith

// array (array): 要檢查的陣列。

// [values] (...array): 排除的值。

// [comparator] (function): comparator 呼叫每個元素。

// 這個方法類似 _.difference ,除了它接受乙個 comparator (比較器),它呼叫比較array,values中的元素。 結果值是從第一陣列中選擇。comparator 呼叫引數有兩個:(arrval, othval)。

// 用於比較處理物件陣列

function differencewith(array, ...values)

return isarraylikeobject(array)

? basedifference(array, baseflatten(values, 1, isarraylikeobject, true), undefined, comparator)

: }

export default differencewith

7,drop

const infinity = 1 / 0

const max_integer = 1.7976931348623157e+308

function tofinite(value)

value = tonumber(value)

if (value === infinity || value === -infinity)

// nan處理 nan === nan 為 false

return value === value ? value : 0

}function tointeger(value)

function drop(array, n=1)

export default drop

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

作用和用法 將陣列 array 拆分成多個 size 長度的區塊,並將這些區塊組成乙個新陣列。如果array 無法被分割成全部等長的區塊,那麼最後剩餘的元素將組成乙個區塊。用法 chunk array,size 1 array array 需要處理的陣列 size 1 number 每個陣列區塊的長...

Lodash原始碼精讀 chunk slice

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

lodash原始碼分析之Number

一 lodash版本 4.17.5 二 函式 1 clamp 1 定義 clamp number,lower upper 2 作用 返回加緊的數字。3 例子。const require lodash console.log clamp 10,1,20 輸出 10 console.log clamp ...