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 ...