摘要:如果為空的情況下,也為空返回,不為空返回為空,返回數組第一個元素返回包含數組前個元素的數組返回數組中除了最后一個元素外的其他全部元素。
// Array Functions // --------------- // Get the first element of an array. Passing **n** will return the first N // values in the array. Aliased as `head` and `take`. The **guard** check // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { //如果array為空的情況下,n也為空返回undefined,n不為空返回[] if (array == null || array.length < 1) return n == null ? void 0 : []; //n為空,返回數組第一個元素 if (n == null || guard) return array[0]; //返回包含數組前n個元素的數組 return _.initial(array, array.length - n); }; // Returns everything but the last entry of the array. Especially useful on // the arguments object. Passing **n** will return all the values in // the array, excluding the last N. // 返回數組中除了最后一個元素外的其他全部元素。 在arguments對象上特別有用。 // 傳遞 n參數將從結果中排除從最后一個開始的n個元素(注:排除數組后面的 n 個元素)。 _.initial = function(array, n, guard) { return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); }; // Get the last element of an array. Passing **n** will return the last N // values in the array. // 返回數組的后n個元素 _.last = function(array, n, guard) { if (array == null || array.length < 1) return n == null ? void 0 : []; if (n == null || guard) return array[array.length - 1]; return _.rest(array, Math.max(0, array.length - n)); }; // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. // Especially useful on the arguments object. Passing an **n** will return // the rest N values in the array. // 返回從n個索引開始的元素 _.rest = _.tail = _.drop = function(array, n, guard) { return slice.call(array, n == null || guard ? 1 : n); }; // Trim out all falsy values from an array. // 返回數組中的真值 _.compact = function(array) { return _.filter(array, Boolean); }; // Internal implementation of a recursive `flatten` function. // 將嵌套多層數組轉換為一位數組 var flatten = function(input, shallow, strict, output) { output = output || []; var idx = output.length; for (var i = 0, length = getLength(input); i < length; i++) { var value = input[i]; // 元素類型為數組或者參數 if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { // Flatten current level of array or arguments object. // 傳入shallow的情況下,只展開一層就不再深入 if (shallow) { var j = 0, len = value.length; while (j < len) output[idx++] = value[j++]; } else {// 否則,迭代展開。 flatten(value, shallow, strict, output); idx = output.length; } } else if (!strict) {//非嚴格模式下,將元素加入輸出中。 output[idx++] = value; } } return output; }; // Flatten out an array, either recursively (by default), or just one level. // 展開嵌套的多層數組 _.flatten = function(array, shallow) { return flatten(array, shallow, false); }; // Return a version of the array that does not contain the specified value(s). // 返回一個刪除所有values值后的 array副本。(注:使用===表達式做相等測試。) _.without = restArguments(function(array, otherArrays) { return _.difference(array, otherArrays); }); // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. // The faster algorithm will not work with an iteratee if the iteratee // is not a one-to-one function, so providing an iteratee will disable // the faster algorithm. // Aliased as `unique`. // 返回 array去重后的副本, 使用 === 做相等測試. // 如果您確定 array 已經排序, 那么給 isSorted 參數傳遞 true值, 此函數將運行的更快的算法. // 如果要處理對象元素, 傳遞 iteratee函數來獲取要對比的屬性。 _.uniq = _.unique = function(array, isSorted, iteratee, context) { // 類似jq,做參數兼容方案 if (!_.isBoolean(isSorted)) { context = iteratee; iteratee = isSorted; isSorted = false; } if (iteratee != null) iteratee = cb(iteratee, context); var result = []; var seen = []; for (var i = 0, length = getLength(array); i < length; i++) { var value = array[i], computed = iteratee ? iteratee(value, i, array) : value; // 如果數組有序,且不存在迭代器 if (isSorted && !iteratee) { // 如果計算結果不等于seen中,或者i為第一個元素,將元素存入result中 if (!i || seen !== computed) result.push(value); // 將seen替換為最新結果 seen = computed; } else if (iteratee) {//如果存在迭代器 if (!_.contains(seen, computed)) {//如果seen中不包含計算結果 seen.push(computed);//計算結果存入seen中 result.push(value);//元素存入result中 } } else if (!_.contains(result, value)) {//如果不存在迭代器 result.push(value); } } return result; }; // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. _.union = restArguments(function(arrays) { // 將數組展開后去重 return _.uniq(flatten(arrays, true, true)); }); // Produce an array that contains every item shared between all the // passed-in arrays. // 返回傳入 arrays(數組)交集。結果中的每個值是存在于傳入的每個arrays(數組)里。 _.intersection = function(array) { var result = []; var argsLength = arguments.length; for (var i = 0, length = getLength(array); i < length; i++) { var item = array[i]; // 元素已存在于result中,則繼續下一個循環 if (_.contains(result, item)) continue; var j; for (j = 1; j < argsLength; j++) { if (!_.contains(arguments[j], item)) break; } //如果所有參數都包含item,則item為交集元素 if (j === argsLength) result.push(item); } return result; }; // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. // array中與rest不同的值 _.difference = restArguments(function(array, rest) { rest = flatten(rest, true, true); return _.filter(array, function(value) { return !_.contains(rest, value); }); }); // Complement of _.zip. Unzip accepts an array of arrays and groups // each array"s elements on shared indices. // 將每個 arrays 中相應位置的值合并在一起。 // 當您有通過匹配數組索引進行協調的獨立數據源時,這非常有用。 // 結合 apply 一起使用傳入一個二維數組。 // 如果你用來處理矩陣嵌套數組時,則可以使用它來轉換矩陣。 _.unzip = function(array) { var length = array && _.max(array, getLength).length || 0; var result = Array(length); for (var index = 0; index < length; index++) { result[index] = _.pluck(array, index); } return result; }; // Zip together multiple lists into a single array -- elements that share // an index go together. // 將多個數組,合成一個。 _.zip = restArguments(_.unzip); // Converts lists into objects. Pass either a single array of `[key, value]` // pairs, or two parallel arrays of the same length -- one of keys, and one of // the corresponding values. Passing by pairs is the reverse of _.pairs. // 將數組轉換為對象。傳遞任何一個多帶帶[key, value]對的列表,或者一個鍵的列表和一個值得列表。成對(Pairs)傳遞 則是 pairs 的反函數。 // 如果存在重復鍵,最后一個值將被返回。 _.object = function(list, values) { var result = {}; for (var i = 0, length = getLength(list); i < length; i++) { if (values) { result[list[i]] = values[i]; } else { result[list[i][0]] = list[i][1]; } } return result; }; // Generator function to create the findIndex and findLastIndex functions. var createPredicateIndexFinder = function(dir) { return function(array, predicate, context) { predicate = cb(predicate, context); var length = getLength(array); //正向起始位置為0,反向起始位置為數組末尾length-1 var index = dir > 0 ? 0 : length - 1; for (; index >= 0 && index < length; index += dir) { if (predicate(array[index], index, array)) return index; } return -1; }; }; // Returns the first index on an array-like that passes a predicate test. _.findIndex = createPredicateIndexFinder(1); _.findLastIndex = createPredicateIndexFinder(-1); // Use a comparator function to figure out the smallest index at which // an object should be inserted so as to maintain order. Uses binary search. // 假設array是有序,且是升序 // 返回iteratee(obj)值在array中的iteratee(array(index))的位置index _.sortedIndex = function(array, obj, iteratee, context) { iteratee = cb(iteratee, context, 1); var value = iteratee(obj); var low = 0, high = getLength(array); while (low < high) { var mid = Math.floor((low + high) / 2); if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; } return low; }; // Generator function to create the indexOf and lastIndexOf functions. var createIndexFinder = function(dir, predicateFind, sortedIndex) { return function(array, item, idx) { var i = 0, length = getLength(array); //存在初始位置 if (typeof idx == "number") { //正向,改變起始位置 if (dir > 0) { //起始位置 = idx為正?idx:取(length+idx)與0中的最大值 i = idx >= 0 ? idx : Math.max(idx + length, i); } else {//反向,改變數組長度 //lastIndexOf函數功能: //lastIndexOf(searchValue,fromIndex) //若在0-fromIndex之間存在searchValue,則返回最后一個出現的位置 //fromIndex為正值,范圍則是0-abs(fromIndex) //fromIndex為負值,范圍則是0-(length-abs(fromIndex))??此處為什么有+1 //看了原生lastIndexOf中就是如此設置的。 //數組長度=idx為正?取(idx+1,length):idx + length + 1 length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; } //idx數值以外的值(isSorted=true),默認array為有序數組,使用sortedIndex查找item位置 } else if (sortedIndex && idx && length) { idx = sortedIndex(array, item); return array[idx] === item ? idx : -1; } //--------------自我理解可簡寫---------- //查找值為NaN if (item !== item) { idx = predicateFind(slice.call(array, i, length), _.isNaN); return idx >= 0 ? idx + i : -1; } for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { if (array[idx] === item) return idx; } return -1; //--------------自我理解可簡寫為如下---------- var iteratee = null; if(item!==item) iteratee = _.isNaN idx = predicateFind(slice.call(array, i, length), iteratee); return idx >= 0 ? idx + i : -1; }; }; // Return the position of the first occurrence of an item in an array, // or -1 if the item is not included in the array. // If the array is large and already in sort order, pass `true` // for **isSorted** to use binary search. // 如果array數值大且是升序,可以設置_.indexOf(array,item,isSorted=true),使用二進制搜索。 _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); // Generate an integer Array containing an arithmetic progression. A port of // the native Python `range()` function. See // [the Python documentation](http://docs.python.org/library/functions.html#range). _.range = function(start, stop, step) { if (stop == null) { stop = start || 0; start = 0; } if (!step) { step = stop < start ? -1 : 1; } var length = Math.max(Math.ceil((stop - start) / step), 0); var range = Array(length); for (var idx = 0; idx < length; idx++, start += step) { range[idx] = start; } return range; }; // Chunk a single array into multiple arrays, each containing `count` or fewer // items. // 將 array 分成多個數組,每個數組包含length 或更少的項。 _.chunk = function(array, count) { if (count == null || count < 1) return []; var result = []; var i = 0, length = array.length; while (i < length) { result.push(slice.call(array, i, i += count)); } return result; };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103762.html
摘要:目前通行的模塊規范主要集中在和,因此為了讓定義的庫能夠適用于各種規范。在框架的定義時需檢測使用環境并兼容各種規范。服務端規范,檢測是否存在,滿足時通過將暴露出來,不滿足則通過對象暴露出來。前者回調函數處理的是值和下標,后者處理的是值和屬性。 本文為博主原創文章,轉載請注明出處 https://www.cnblogs.com/kidfl... underscore作為開發中比較常用的一個...
摘要:引言半月刊第四期來啦,這段時間新增了道高頻面試題,今天就把最近半月匯總的面試題和部分答案發給大家,幫助大家查漏補缺,歡迎加群互相學習。更多更全的面試題和答案匯總在下面的項目中,點擊查看。引言 半月刊第四期來啦,這段時間 Daily-Interview-Question 新增了 14 道高頻面試題,今天就把最近半月匯總的面試題和部分答案發給大家,幫助大家查漏補缺,歡迎 加群 互相學習。 更多更...
摘要:但是正則表達式需要特殊處理當匹配到第一個非封閉的符號時,要校驗它之前的第一個非空字符。采用正則表達式來匹配這一規則匹配任意 代碼細節 緩存代理函數 export function cached (fn: F): F { const cache = Object.create(null) return (function cachedFn (str: string) { ...
摘要:今天要講的是,如何在數組中尋找元素,對應中的,,,以及方法。如果往一個有序數組中插入元素,使得數組繼續保持有序,那么這個插入位置是這就是這個方法的作用,有序,很顯然用二分查找即可。 Why underscore (覺得這部分眼熟的可以直接跳到下一段了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計劃中。 閱讀一...
摘要:所以,剛開始,我從源碼比較短的包含注釋只有行開始學習起。一般,在客戶端瀏覽器環境中,即為,暴露在全局中。學習以后判斷直接使用看起來也優雅一點滑稽臉。在的函數視線中,的作用執行一個傳入函數次,并返回由每次執行結果組成的數組。 前言 最近在社區瀏覽文章的時候,看到了一位大四學長在尋求前端工作中的面經,看完不得不佩服,掌握知識點真是全面,無論是前端后臺還是其他,都有涉獵。 在他寫的文章中,有...
閱讀 1699·2021-11-12 10:36
閱讀 1615·2021-11-12 10:36
閱讀 3442·2021-11-02 14:46
閱讀 3798·2019-08-30 15:56
閱讀 3534·2019-08-30 15:55
閱讀 1463·2019-08-30 15:44
閱讀 1044·2019-08-30 14:00
閱讀 2735·2019-08-29 18:41