|
1 /** |
|
2 * @license |
|
3 * Lodash <https://lodash.com/> |
|
4 * Copyright JS Foundation and other contributors <https://js.foundation/> |
|
5 * Released under MIT license <https://lodash.com/license> |
|
6 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> |
|
7 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
|
8 */ |
|
9 ;(function() { |
|
10 |
|
11 /** Used as a safe reference for `undefined` in pre-ES5 environments. */ |
|
12 var undefined; |
|
13 |
|
14 /** Used as the semantic version number. */ |
|
15 var VERSION = '4.17.11'; |
|
16 |
|
17 /** Used as the size to enable large array optimizations. */ |
|
18 var LARGE_ARRAY_SIZE = 200; |
|
19 |
|
20 /** Error message constants. */ |
|
21 var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', |
|
22 FUNC_ERROR_TEXT = 'Expected a function'; |
|
23 |
|
24 /** Used to stand-in for `undefined` hash values. */ |
|
25 var HASH_UNDEFINED = '__lodash_hash_undefined__'; |
|
26 |
|
27 /** Used as the maximum memoize cache size. */ |
|
28 var MAX_MEMOIZE_SIZE = 500; |
|
29 |
|
30 /** Used as the internal argument placeholder. */ |
|
31 var PLACEHOLDER = '__lodash_placeholder__'; |
|
32 |
|
33 /** Used to compose bitmasks for cloning. */ |
|
34 var CLONE_DEEP_FLAG = 1, |
|
35 CLONE_FLAT_FLAG = 2, |
|
36 CLONE_SYMBOLS_FLAG = 4; |
|
37 |
|
38 /** Used to compose bitmasks for value comparisons. */ |
|
39 var COMPARE_PARTIAL_FLAG = 1, |
|
40 COMPARE_UNORDERED_FLAG = 2; |
|
41 |
|
42 /** Used to compose bitmasks for function metadata. */ |
|
43 var WRAP_BIND_FLAG = 1, |
|
44 WRAP_BIND_KEY_FLAG = 2, |
|
45 WRAP_CURRY_BOUND_FLAG = 4, |
|
46 WRAP_CURRY_FLAG = 8, |
|
47 WRAP_CURRY_RIGHT_FLAG = 16, |
|
48 WRAP_PARTIAL_FLAG = 32, |
|
49 WRAP_PARTIAL_RIGHT_FLAG = 64, |
|
50 WRAP_ARY_FLAG = 128, |
|
51 WRAP_REARG_FLAG = 256, |
|
52 WRAP_FLIP_FLAG = 512; |
|
53 |
|
54 /** Used as default options for `_.truncate`. */ |
|
55 var DEFAULT_TRUNC_LENGTH = 30, |
|
56 DEFAULT_TRUNC_OMISSION = '...'; |
|
57 |
|
58 /** Used to detect hot functions by number of calls within a span of milliseconds. */ |
|
59 var HOT_COUNT = 800, |
|
60 HOT_SPAN = 16; |
|
61 |
|
62 /** Used to indicate the type of lazy iteratees. */ |
|
63 var LAZY_FILTER_FLAG = 1, |
|
64 LAZY_MAP_FLAG = 2, |
|
65 LAZY_WHILE_FLAG = 3; |
|
66 |
|
67 /** Used as references for various `Number` constants. */ |
|
68 var INFINITY = 1 / 0, |
|
69 MAX_SAFE_INTEGER = 9007199254740991, |
|
70 MAX_INTEGER = 1.7976931348623157e+308, |
|
71 NAN = 0 / 0; |
|
72 |
|
73 /** Used as references for the maximum length and index of an array. */ |
|
74 var MAX_ARRAY_LENGTH = 4294967295, |
|
75 MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, |
|
76 HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; |
|
77 |
|
78 /** Used to associate wrap methods with their bit flags. */ |
|
79 var wrapFlags = [ |
|
80 ['ary', WRAP_ARY_FLAG], |
|
81 ['bind', WRAP_BIND_FLAG], |
|
82 ['bindKey', WRAP_BIND_KEY_FLAG], |
|
83 ['curry', WRAP_CURRY_FLAG], |
|
84 ['curryRight', WRAP_CURRY_RIGHT_FLAG], |
|
85 ['flip', WRAP_FLIP_FLAG], |
|
86 ['partial', WRAP_PARTIAL_FLAG], |
|
87 ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], |
|
88 ['rearg', WRAP_REARG_FLAG] |
|
89 ]; |
|
90 |
|
91 /** `Object#toString` result references. */ |
|
92 var argsTag = '[object Arguments]', |
|
93 arrayTag = '[object Array]', |
|
94 asyncTag = '[object AsyncFunction]', |
|
95 boolTag = '[object Boolean]', |
|
96 dateTag = '[object Date]', |
|
97 domExcTag = '[object DOMException]', |
|
98 errorTag = '[object Error]', |
|
99 funcTag = '[object Function]', |
|
100 genTag = '[object GeneratorFunction]', |
|
101 mapTag = '[object Map]', |
|
102 numberTag = '[object Number]', |
|
103 nullTag = '[object Null]', |
|
104 objectTag = '[object Object]', |
|
105 promiseTag = '[object Promise]', |
|
106 proxyTag = '[object Proxy]', |
|
107 regexpTag = '[object RegExp]', |
|
108 setTag = '[object Set]', |
|
109 stringTag = '[object String]', |
|
110 symbolTag = '[object Symbol]', |
|
111 undefinedTag = '[object Undefined]', |
|
112 weakMapTag = '[object WeakMap]', |
|
113 weakSetTag = '[object WeakSet]'; |
|
114 |
|
115 var arrayBufferTag = '[object ArrayBuffer]', |
|
116 dataViewTag = '[object DataView]', |
|
117 float32Tag = '[object Float32Array]', |
|
118 float64Tag = '[object Float64Array]', |
|
119 int8Tag = '[object Int8Array]', |
|
120 int16Tag = '[object Int16Array]', |
|
121 int32Tag = '[object Int32Array]', |
|
122 uint8Tag = '[object Uint8Array]', |
|
123 uint8ClampedTag = '[object Uint8ClampedArray]', |
|
124 uint16Tag = '[object Uint16Array]', |
|
125 uint32Tag = '[object Uint32Array]'; |
|
126 |
|
127 /** Used to match empty string literals in compiled template source. */ |
|
128 var reEmptyStringLeading = /\b__p \+= '';/g, |
|
129 reEmptyStringMiddle = /\b(__p \+=) '' \+/g, |
|
130 reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; |
|
131 |
|
132 /** Used to match HTML entities and HTML characters. */ |
|
133 var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, |
|
134 reUnescapedHtml = /[&<>"']/g, |
|
135 reHasEscapedHtml = RegExp(reEscapedHtml.source), |
|
136 reHasUnescapedHtml = RegExp(reUnescapedHtml.source); |
|
137 |
|
138 /** Used to match template delimiters. */ |
|
139 var reEscape = /<%-([\s\S]+?)%>/g, |
|
140 reEvaluate = /<%([\s\S]+?)%>/g, |
|
141 reInterpolate = /<%=([\s\S]+?)%>/g; |
|
142 |
|
143 /** Used to match property names within property paths. */ |
|
144 var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, |
|
145 reIsPlainProp = /^\w*$/, |
|
146 rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; |
|
147 |
|
148 /** |
|
149 * Used to match `RegExp` |
|
150 * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). |
|
151 */ |
|
152 var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, |
|
153 reHasRegExpChar = RegExp(reRegExpChar.source); |
|
154 |
|
155 /** Used to match leading and trailing whitespace. */ |
|
156 var reTrim = /^\s+|\s+$/g, |
|
157 reTrimStart = /^\s+/, |
|
158 reTrimEnd = /\s+$/; |
|
159 |
|
160 /** Used to match wrap detail comments. */ |
|
161 var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, |
|
162 reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, |
|
163 reSplitDetails = /,? & /; |
|
164 |
|
165 /** Used to match words composed of alphanumeric characters. */ |
|
166 var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; |
|
167 |
|
168 /** Used to match backslashes in property paths. */ |
|
169 var reEscapeChar = /\\(\\)?/g; |
|
170 |
|
171 /** |
|
172 * Used to match |
|
173 * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). |
|
174 */ |
|
175 var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; |
|
176 |
|
177 /** Used to match `RegExp` flags from their coerced string values. */ |
|
178 var reFlags = /\w*$/; |
|
179 |
|
180 /** Used to detect bad signed hexadecimal string values. */ |
|
181 var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; |
|
182 |
|
183 /** Used to detect binary string values. */ |
|
184 var reIsBinary = /^0b[01]+$/i; |
|
185 |
|
186 /** Used to detect host constructors (Safari). */ |
|
187 var reIsHostCtor = /^\[object .+?Constructor\]$/; |
|
188 |
|
189 /** Used to detect octal string values. */ |
|
190 var reIsOctal = /^0o[0-7]+$/i; |
|
191 |
|
192 /** Used to detect unsigned integer values. */ |
|
193 var reIsUint = /^(?:0|[1-9]\d*)$/; |
|
194 |
|
195 /** Used to match Latin Unicode letters (excluding mathematical operators). */ |
|
196 var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; |
|
197 |
|
198 /** Used to ensure capturing order of template delimiters. */ |
|
199 var reNoMatch = /($^)/; |
|
200 |
|
201 /** Used to match unescaped characters in compiled string literals. */ |
|
202 var reUnescapedString = /['\n\r\u2028\u2029\\]/g; |
|
203 |
|
204 /** Used to compose unicode character classes. */ |
|
205 var rsAstralRange = '\\ud800-\\udfff', |
|
206 rsComboMarksRange = '\\u0300-\\u036f', |
|
207 reComboHalfMarksRange = '\\ufe20-\\ufe2f', |
|
208 rsComboSymbolsRange = '\\u20d0-\\u20ff', |
|
209 rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, |
|
210 rsDingbatRange = '\\u2700-\\u27bf', |
|
211 rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', |
|
212 rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', |
|
213 rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', |
|
214 rsPunctuationRange = '\\u2000-\\u206f', |
|
215 rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', |
|
216 rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', |
|
217 rsVarRange = '\\ufe0e\\ufe0f', |
|
218 rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; |
|
219 |
|
220 /** Used to compose unicode capture groups. */ |
|
221 var rsApos = "['\u2019]", |
|
222 rsAstral = '[' + rsAstralRange + ']', |
|
223 rsBreak = '[' + rsBreakRange + ']', |
|
224 rsCombo = '[' + rsComboRange + ']', |
|
225 rsDigits = '\\d+', |
|
226 rsDingbat = '[' + rsDingbatRange + ']', |
|
227 rsLower = '[' + rsLowerRange + ']', |
|
228 rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', |
|
229 rsFitz = '\\ud83c[\\udffb-\\udfff]', |
|
230 rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', |
|
231 rsNonAstral = '[^' + rsAstralRange + ']', |
|
232 rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', |
|
233 rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', |
|
234 rsUpper = '[' + rsUpperRange + ']', |
|
235 rsZWJ = '\\u200d'; |
|
236 |
|
237 /** Used to compose unicode regexes. */ |
|
238 var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', |
|
239 rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', |
|
240 rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', |
|
241 rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', |
|
242 reOptMod = rsModifier + '?', |
|
243 rsOptVar = '[' + rsVarRange + ']?', |
|
244 rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', |
|
245 rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', |
|
246 rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', |
|
247 rsSeq = rsOptVar + reOptMod + rsOptJoin, |
|
248 rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, |
|
249 rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; |
|
250 |
|
251 /** Used to match apostrophes. */ |
|
252 var reApos = RegExp(rsApos, 'g'); |
|
253 |
|
254 /** |
|
255 * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and |
|
256 * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). |
|
257 */ |
|
258 var reComboMark = RegExp(rsCombo, 'g'); |
|
259 |
|
260 /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ |
|
261 var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); |
|
262 |
|
263 /** Used to match complex or compound words. */ |
|
264 var reUnicodeWord = RegExp([ |
|
265 rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', |
|
266 rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', |
|
267 rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, |
|
268 rsUpper + '+' + rsOptContrUpper, |
|
269 rsOrdUpper, |
|
270 rsOrdLower, |
|
271 rsDigits, |
|
272 rsEmoji |
|
273 ].join('|'), 'g'); |
|
274 |
|
275 /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ |
|
276 var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); |
|
277 |
|
278 /** Used to detect strings that need a more robust regexp to match words. */ |
|
279 var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; |
|
280 |
|
281 /** Used to assign default `context` object properties. */ |
|
282 var contextProps = [ |
|
283 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', |
|
284 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', |
|
285 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', |
|
286 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', |
|
287 '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' |
|
288 ]; |
|
289 |
|
290 /** Used to make template sourceURLs easier to identify. */ |
|
291 var templateCounter = -1; |
|
292 |
|
293 /** Used to identify `toStringTag` values of typed arrays. */ |
|
294 var typedArrayTags = {}; |
|
295 typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = |
|
296 typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = |
|
297 typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = |
|
298 typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = |
|
299 typedArrayTags[uint32Tag] = true; |
|
300 typedArrayTags[argsTag] = typedArrayTags[arrayTag] = |
|
301 typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = |
|
302 typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = |
|
303 typedArrayTags[errorTag] = typedArrayTags[funcTag] = |
|
304 typedArrayTags[mapTag] = typedArrayTags[numberTag] = |
|
305 typedArrayTags[objectTag] = typedArrayTags[regexpTag] = |
|
306 typedArrayTags[setTag] = typedArrayTags[stringTag] = |
|
307 typedArrayTags[weakMapTag] = false; |
|
308 |
|
309 /** Used to identify `toStringTag` values supported by `_.clone`. */ |
|
310 var cloneableTags = {}; |
|
311 cloneableTags[argsTag] = cloneableTags[arrayTag] = |
|
312 cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = |
|
313 cloneableTags[boolTag] = cloneableTags[dateTag] = |
|
314 cloneableTags[float32Tag] = cloneableTags[float64Tag] = |
|
315 cloneableTags[int8Tag] = cloneableTags[int16Tag] = |
|
316 cloneableTags[int32Tag] = cloneableTags[mapTag] = |
|
317 cloneableTags[numberTag] = cloneableTags[objectTag] = |
|
318 cloneableTags[regexpTag] = cloneableTags[setTag] = |
|
319 cloneableTags[stringTag] = cloneableTags[symbolTag] = |
|
320 cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = |
|
321 cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; |
|
322 cloneableTags[errorTag] = cloneableTags[funcTag] = |
|
323 cloneableTags[weakMapTag] = false; |
|
324 |
|
325 /** Used to map Latin Unicode letters to basic Latin letters. */ |
|
326 var deburredLetters = { |
|
327 // Latin-1 Supplement block. |
|
328 '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', |
|
329 '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', |
|
330 '\xc7': 'C', '\xe7': 'c', |
|
331 '\xd0': 'D', '\xf0': 'd', |
|
332 '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', |
|
333 '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', |
|
334 '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', |
|
335 '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', |
|
336 '\xd1': 'N', '\xf1': 'n', |
|
337 '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', |
|
338 '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', |
|
339 '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', |
|
340 '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', |
|
341 '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', |
|
342 '\xc6': 'Ae', '\xe6': 'ae', |
|
343 '\xde': 'Th', '\xfe': 'th', |
|
344 '\xdf': 'ss', |
|
345 // Latin Extended-A block. |
|
346 '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', |
|
347 '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', |
|
348 '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', |
|
349 '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', |
|
350 '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', |
|
351 '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', |
|
352 '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', |
|
353 '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', |
|
354 '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', |
|
355 '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', |
|
356 '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', |
|
357 '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', |
|
358 '\u0134': 'J', '\u0135': 'j', |
|
359 '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', |
|
360 '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', |
|
361 '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', |
|
362 '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', |
|
363 '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', |
|
364 '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', |
|
365 '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', |
|
366 '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', |
|
367 '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', |
|
368 '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', |
|
369 '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', |
|
370 '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', |
|
371 '\u0163': 't', '\u0165': 't', '\u0167': 't', |
|
372 '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', |
|
373 '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', |
|
374 '\u0174': 'W', '\u0175': 'w', |
|
375 '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', |
|
376 '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', |
|
377 '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', |
|
378 '\u0132': 'IJ', '\u0133': 'ij', |
|
379 '\u0152': 'Oe', '\u0153': 'oe', |
|
380 '\u0149': "'n", '\u017f': 's' |
|
381 }; |
|
382 |
|
383 /** Used to map characters to HTML entities. */ |
|
384 var htmlEscapes = { |
|
385 '&': '&', |
|
386 '<': '<', |
|
387 '>': '>', |
|
388 '"': '"', |
|
389 "'": ''' |
|
390 }; |
|
391 |
|
392 /** Used to map HTML entities to characters. */ |
|
393 var htmlUnescapes = { |
|
394 '&': '&', |
|
395 '<': '<', |
|
396 '>': '>', |
|
397 '"': '"', |
|
398 ''': "'" |
|
399 }; |
|
400 |
|
401 /** Used to escape characters for inclusion in compiled string literals. */ |
|
402 var stringEscapes = { |
|
403 '\\': '\\', |
|
404 "'": "'", |
|
405 '\n': 'n', |
|
406 '\r': 'r', |
|
407 '\u2028': 'u2028', |
|
408 '\u2029': 'u2029' |
|
409 }; |
|
410 |
|
411 /** Built-in method references without a dependency on `root`. */ |
|
412 var freeParseFloat = parseFloat, |
|
413 freeParseInt = parseInt; |
|
414 |
|
415 /** Detect free variable `global` from Node.js. */ |
|
416 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; |
|
417 |
|
418 /** Detect free variable `self`. */ |
|
419 var freeSelf = typeof self == 'object' && self && self.Object === Object && self; |
|
420 |
|
421 /** Used as a reference to the global object. */ |
|
422 var root = freeGlobal || freeSelf || Function('return this')(); |
|
423 |
|
424 /** Detect free variable `exports`. */ |
|
425 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; |
|
426 |
|
427 /** Detect free variable `module`. */ |
|
428 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; |
|
429 |
|
430 /** Detect the popular CommonJS extension `module.exports`. */ |
|
431 var moduleExports = freeModule && freeModule.exports === freeExports; |
|
432 |
|
433 /** Detect free variable `process` from Node.js. */ |
|
434 var freeProcess = moduleExports && freeGlobal.process; |
|
435 |
|
436 /** Used to access faster Node.js helpers. */ |
|
437 var nodeUtil = (function() { |
|
438 try { |
|
439 // Use `util.types` for Node.js 10+. |
|
440 var types = freeModule && freeModule.require && freeModule.require('util').types; |
|
441 |
|
442 if (types) { |
|
443 return types; |
|
444 } |
|
445 |
|
446 // Legacy `process.binding('util')` for Node.js < 10. |
|
447 return freeProcess && freeProcess.binding && freeProcess.binding('util'); |
|
448 } catch (e) {} |
|
449 }()); |
|
450 |
|
451 /* Node.js helper references. */ |
|
452 var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, |
|
453 nodeIsDate = nodeUtil && nodeUtil.isDate, |
|
454 nodeIsMap = nodeUtil && nodeUtil.isMap, |
|
455 nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, |
|
456 nodeIsSet = nodeUtil && nodeUtil.isSet, |
|
457 nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; |
|
458 |
|
459 /*--------------------------------------------------------------------------*/ |
|
460 |
|
461 /** |
|
462 * A faster alternative to `Function#apply`, this function invokes `func` |
|
463 * with the `this` binding of `thisArg` and the arguments of `args`. |
|
464 * |
|
465 * @private |
|
466 * @param {Function} func The function to invoke. |
|
467 * @param {*} thisArg The `this` binding of `func`. |
|
468 * @param {Array} args The arguments to invoke `func` with. |
|
469 * @returns {*} Returns the result of `func`. |
|
470 */ |
|
471 function apply(func, thisArg, args) { |
|
472 switch (args.length) { |
|
473 case 0: return func.call(thisArg); |
|
474 case 1: return func.call(thisArg, args[0]); |
|
475 case 2: return func.call(thisArg, args[0], args[1]); |
|
476 case 3: return func.call(thisArg, args[0], args[1], args[2]); |
|
477 } |
|
478 return func.apply(thisArg, args); |
|
479 } |
|
480 |
|
481 /** |
|
482 * A specialized version of `baseAggregator` for arrays. |
|
483 * |
|
484 * @private |
|
485 * @param {Array} [array] The array to iterate over. |
|
486 * @param {Function} setter The function to set `accumulator` values. |
|
487 * @param {Function} iteratee The iteratee to transform keys. |
|
488 * @param {Object} accumulator The initial aggregated object. |
|
489 * @returns {Function} Returns `accumulator`. |
|
490 */ |
|
491 function arrayAggregator(array, setter, iteratee, accumulator) { |
|
492 var index = -1, |
|
493 length = array == null ? 0 : array.length; |
|
494 |
|
495 while (++index < length) { |
|
496 var value = array[index]; |
|
497 setter(accumulator, value, iteratee(value), array); |
|
498 } |
|
499 return accumulator; |
|
500 } |
|
501 |
|
502 /** |
|
503 * A specialized version of `_.forEach` for arrays without support for |
|
504 * iteratee shorthands. |
|
505 * |
|
506 * @private |
|
507 * @param {Array} [array] The array to iterate over. |
|
508 * @param {Function} iteratee The function invoked per iteration. |
|
509 * @returns {Array} Returns `array`. |
|
510 */ |
|
511 function arrayEach(array, iteratee) { |
|
512 var index = -1, |
|
513 length = array == null ? 0 : array.length; |
|
514 |
|
515 while (++index < length) { |
|
516 if (iteratee(array[index], index, array) === false) { |
|
517 break; |
|
518 } |
|
519 } |
|
520 return array; |
|
521 } |
|
522 |
|
523 /** |
|
524 * A specialized version of `_.forEachRight` for arrays without support for |
|
525 * iteratee shorthands. |
|
526 * |
|
527 * @private |
|
528 * @param {Array} [array] The array to iterate over. |
|
529 * @param {Function} iteratee The function invoked per iteration. |
|
530 * @returns {Array} Returns `array`. |
|
531 */ |
|
532 function arrayEachRight(array, iteratee) { |
|
533 var length = array == null ? 0 : array.length; |
|
534 |
|
535 while (length--) { |
|
536 if (iteratee(array[length], length, array) === false) { |
|
537 break; |
|
538 } |
|
539 } |
|
540 return array; |
|
541 } |
|
542 |
|
543 /** |
|
544 * A specialized version of `_.every` for arrays without support for |
|
545 * iteratee shorthands. |
|
546 * |
|
547 * @private |
|
548 * @param {Array} [array] The array to iterate over. |
|
549 * @param {Function} predicate The function invoked per iteration. |
|
550 * @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
551 * else `false`. |
|
552 */ |
|
553 function arrayEvery(array, predicate) { |
|
554 var index = -1, |
|
555 length = array == null ? 0 : array.length; |
|
556 |
|
557 while (++index < length) { |
|
558 if (!predicate(array[index], index, array)) { |
|
559 return false; |
|
560 } |
|
561 } |
|
562 return true; |
|
563 } |
|
564 |
|
565 /** |
|
566 * A specialized version of `_.filter` for arrays without support for |
|
567 * iteratee shorthands. |
|
568 * |
|
569 * @private |
|
570 * @param {Array} [array] The array to iterate over. |
|
571 * @param {Function} predicate The function invoked per iteration. |
|
572 * @returns {Array} Returns the new filtered array. |
|
573 */ |
|
574 function arrayFilter(array, predicate) { |
|
575 var index = -1, |
|
576 length = array == null ? 0 : array.length, |
|
577 resIndex = 0, |
|
578 result = []; |
|
579 |
|
580 while (++index < length) { |
|
581 var value = array[index]; |
|
582 if (predicate(value, index, array)) { |
|
583 result[resIndex++] = value; |
|
584 } |
|
585 } |
|
586 return result; |
|
587 } |
|
588 |
|
589 /** |
|
590 * A specialized version of `_.includes` for arrays without support for |
|
591 * specifying an index to search from. |
|
592 * |
|
593 * @private |
|
594 * @param {Array} [array] The array to inspect. |
|
595 * @param {*} target The value to search for. |
|
596 * @returns {boolean} Returns `true` if `target` is found, else `false`. |
|
597 */ |
|
598 function arrayIncludes(array, value) { |
|
599 var length = array == null ? 0 : array.length; |
|
600 return !!length && baseIndexOf(array, value, 0) > -1; |
|
601 } |
|
602 |
|
603 /** |
|
604 * This function is like `arrayIncludes` except that it accepts a comparator. |
|
605 * |
|
606 * @private |
|
607 * @param {Array} [array] The array to inspect. |
|
608 * @param {*} target The value to search for. |
|
609 * @param {Function} comparator The comparator invoked per element. |
|
610 * @returns {boolean} Returns `true` if `target` is found, else `false`. |
|
611 */ |
|
612 function arrayIncludesWith(array, value, comparator) { |
|
613 var index = -1, |
|
614 length = array == null ? 0 : array.length; |
|
615 |
|
616 while (++index < length) { |
|
617 if (comparator(value, array[index])) { |
|
618 return true; |
|
619 } |
|
620 } |
|
621 return false; |
|
622 } |
|
623 |
|
624 /** |
|
625 * A specialized version of `_.map` for arrays without support for iteratee |
|
626 * shorthands. |
|
627 * |
|
628 * @private |
|
629 * @param {Array} [array] The array to iterate over. |
|
630 * @param {Function} iteratee The function invoked per iteration. |
|
631 * @returns {Array} Returns the new mapped array. |
|
632 */ |
|
633 function arrayMap(array, iteratee) { |
|
634 var index = -1, |
|
635 length = array == null ? 0 : array.length, |
|
636 result = Array(length); |
|
637 |
|
638 while (++index < length) { |
|
639 result[index] = iteratee(array[index], index, array); |
|
640 } |
|
641 return result; |
|
642 } |
|
643 |
|
644 /** |
|
645 * Appends the elements of `values` to `array`. |
|
646 * |
|
647 * @private |
|
648 * @param {Array} array The array to modify. |
|
649 * @param {Array} values The values to append. |
|
650 * @returns {Array} Returns `array`. |
|
651 */ |
|
652 function arrayPush(array, values) { |
|
653 var index = -1, |
|
654 length = values.length, |
|
655 offset = array.length; |
|
656 |
|
657 while (++index < length) { |
|
658 array[offset + index] = values[index]; |
|
659 } |
|
660 return array; |
|
661 } |
|
662 |
|
663 /** |
|
664 * A specialized version of `_.reduce` for arrays without support for |
|
665 * iteratee shorthands. |
|
666 * |
|
667 * @private |
|
668 * @param {Array} [array] The array to iterate over. |
|
669 * @param {Function} iteratee The function invoked per iteration. |
|
670 * @param {*} [accumulator] The initial value. |
|
671 * @param {boolean} [initAccum] Specify using the first element of `array` as |
|
672 * the initial value. |
|
673 * @returns {*} Returns the accumulated value. |
|
674 */ |
|
675 function arrayReduce(array, iteratee, accumulator, initAccum) { |
|
676 var index = -1, |
|
677 length = array == null ? 0 : array.length; |
|
678 |
|
679 if (initAccum && length) { |
|
680 accumulator = array[++index]; |
|
681 } |
|
682 while (++index < length) { |
|
683 accumulator = iteratee(accumulator, array[index], index, array); |
|
684 } |
|
685 return accumulator; |
|
686 } |
|
687 |
|
688 /** |
|
689 * A specialized version of `_.reduceRight` for arrays without support for |
|
690 * iteratee shorthands. |
|
691 * |
|
692 * @private |
|
693 * @param {Array} [array] The array to iterate over. |
|
694 * @param {Function} iteratee The function invoked per iteration. |
|
695 * @param {*} [accumulator] The initial value. |
|
696 * @param {boolean} [initAccum] Specify using the last element of `array` as |
|
697 * the initial value. |
|
698 * @returns {*} Returns the accumulated value. |
|
699 */ |
|
700 function arrayReduceRight(array, iteratee, accumulator, initAccum) { |
|
701 var length = array == null ? 0 : array.length; |
|
702 if (initAccum && length) { |
|
703 accumulator = array[--length]; |
|
704 } |
|
705 while (length--) { |
|
706 accumulator = iteratee(accumulator, array[length], length, array); |
|
707 } |
|
708 return accumulator; |
|
709 } |
|
710 |
|
711 /** |
|
712 * A specialized version of `_.some` for arrays without support for iteratee |
|
713 * shorthands. |
|
714 * |
|
715 * @private |
|
716 * @param {Array} [array] The array to iterate over. |
|
717 * @param {Function} predicate The function invoked per iteration. |
|
718 * @returns {boolean} Returns `true` if any element passes the predicate check, |
|
719 * else `false`. |
|
720 */ |
|
721 function arraySome(array, predicate) { |
|
722 var index = -1, |
|
723 length = array == null ? 0 : array.length; |
|
724 |
|
725 while (++index < length) { |
|
726 if (predicate(array[index], index, array)) { |
|
727 return true; |
|
728 } |
|
729 } |
|
730 return false; |
|
731 } |
|
732 |
|
733 /** |
|
734 * Gets the size of an ASCII `string`. |
|
735 * |
|
736 * @private |
|
737 * @param {string} string The string inspect. |
|
738 * @returns {number} Returns the string size. |
|
739 */ |
|
740 var asciiSize = baseProperty('length'); |
|
741 |
|
742 /** |
|
743 * Converts an ASCII `string` to an array. |
|
744 * |
|
745 * @private |
|
746 * @param {string} string The string to convert. |
|
747 * @returns {Array} Returns the converted array. |
|
748 */ |
|
749 function asciiToArray(string) { |
|
750 return string.split(''); |
|
751 } |
|
752 |
|
753 /** |
|
754 * Splits an ASCII `string` into an array of its words. |
|
755 * |
|
756 * @private |
|
757 * @param {string} The string to inspect. |
|
758 * @returns {Array} Returns the words of `string`. |
|
759 */ |
|
760 function asciiWords(string) { |
|
761 return string.match(reAsciiWord) || []; |
|
762 } |
|
763 |
|
764 /** |
|
765 * The base implementation of methods like `_.findKey` and `_.findLastKey`, |
|
766 * without support for iteratee shorthands, which iterates over `collection` |
|
767 * using `eachFunc`. |
|
768 * |
|
769 * @private |
|
770 * @param {Array|Object} collection The collection to inspect. |
|
771 * @param {Function} predicate The function invoked per iteration. |
|
772 * @param {Function} eachFunc The function to iterate over `collection`. |
|
773 * @returns {*} Returns the found element or its key, else `undefined`. |
|
774 */ |
|
775 function baseFindKey(collection, predicate, eachFunc) { |
|
776 var result; |
|
777 eachFunc(collection, function(value, key, collection) { |
|
778 if (predicate(value, key, collection)) { |
|
779 result = key; |
|
780 return false; |
|
781 } |
|
782 }); |
|
783 return result; |
|
784 } |
|
785 |
|
786 /** |
|
787 * The base implementation of `_.findIndex` and `_.findLastIndex` without |
|
788 * support for iteratee shorthands. |
|
789 * |
|
790 * @private |
|
791 * @param {Array} array The array to inspect. |
|
792 * @param {Function} predicate The function invoked per iteration. |
|
793 * @param {number} fromIndex The index to search from. |
|
794 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
795 * @returns {number} Returns the index of the matched value, else `-1`. |
|
796 */ |
|
797 function baseFindIndex(array, predicate, fromIndex, fromRight) { |
|
798 var length = array.length, |
|
799 index = fromIndex + (fromRight ? 1 : -1); |
|
800 |
|
801 while ((fromRight ? index-- : ++index < length)) { |
|
802 if (predicate(array[index], index, array)) { |
|
803 return index; |
|
804 } |
|
805 } |
|
806 return -1; |
|
807 } |
|
808 |
|
809 /** |
|
810 * The base implementation of `_.indexOf` without `fromIndex` bounds checks. |
|
811 * |
|
812 * @private |
|
813 * @param {Array} array The array to inspect. |
|
814 * @param {*} value The value to search for. |
|
815 * @param {number} fromIndex The index to search from. |
|
816 * @returns {number} Returns the index of the matched value, else `-1`. |
|
817 */ |
|
818 function baseIndexOf(array, value, fromIndex) { |
|
819 return value === value |
|
820 ? strictIndexOf(array, value, fromIndex) |
|
821 : baseFindIndex(array, baseIsNaN, fromIndex); |
|
822 } |
|
823 |
|
824 /** |
|
825 * This function is like `baseIndexOf` except that it accepts a comparator. |
|
826 * |
|
827 * @private |
|
828 * @param {Array} array The array to inspect. |
|
829 * @param {*} value The value to search for. |
|
830 * @param {number} fromIndex The index to search from. |
|
831 * @param {Function} comparator The comparator invoked per element. |
|
832 * @returns {number} Returns the index of the matched value, else `-1`. |
|
833 */ |
|
834 function baseIndexOfWith(array, value, fromIndex, comparator) { |
|
835 var index = fromIndex - 1, |
|
836 length = array.length; |
|
837 |
|
838 while (++index < length) { |
|
839 if (comparator(array[index], value)) { |
|
840 return index; |
|
841 } |
|
842 } |
|
843 return -1; |
|
844 } |
|
845 |
|
846 /** |
|
847 * The base implementation of `_.isNaN` without support for number objects. |
|
848 * |
|
849 * @private |
|
850 * @param {*} value The value to check. |
|
851 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. |
|
852 */ |
|
853 function baseIsNaN(value) { |
|
854 return value !== value; |
|
855 } |
|
856 |
|
857 /** |
|
858 * The base implementation of `_.mean` and `_.meanBy` without support for |
|
859 * iteratee shorthands. |
|
860 * |
|
861 * @private |
|
862 * @param {Array} array The array to iterate over. |
|
863 * @param {Function} iteratee The function invoked per iteration. |
|
864 * @returns {number} Returns the mean. |
|
865 */ |
|
866 function baseMean(array, iteratee) { |
|
867 var length = array == null ? 0 : array.length; |
|
868 return length ? (baseSum(array, iteratee) / length) : NAN; |
|
869 } |
|
870 |
|
871 /** |
|
872 * The base implementation of `_.property` without support for deep paths. |
|
873 * |
|
874 * @private |
|
875 * @param {string} key The key of the property to get. |
|
876 * @returns {Function} Returns the new accessor function. |
|
877 */ |
|
878 function baseProperty(key) { |
|
879 return function(object) { |
|
880 return object == null ? undefined : object[key]; |
|
881 }; |
|
882 } |
|
883 |
|
884 /** |
|
885 * The base implementation of `_.propertyOf` without support for deep paths. |
|
886 * |
|
887 * @private |
|
888 * @param {Object} object The object to query. |
|
889 * @returns {Function} Returns the new accessor function. |
|
890 */ |
|
891 function basePropertyOf(object) { |
|
892 return function(key) { |
|
893 return object == null ? undefined : object[key]; |
|
894 }; |
|
895 } |
|
896 |
|
897 /** |
|
898 * The base implementation of `_.reduce` and `_.reduceRight`, without support |
|
899 * for iteratee shorthands, which iterates over `collection` using `eachFunc`. |
|
900 * |
|
901 * @private |
|
902 * @param {Array|Object} collection The collection to iterate over. |
|
903 * @param {Function} iteratee The function invoked per iteration. |
|
904 * @param {*} accumulator The initial value. |
|
905 * @param {boolean} initAccum Specify using the first or last element of |
|
906 * `collection` as the initial value. |
|
907 * @param {Function} eachFunc The function to iterate over `collection`. |
|
908 * @returns {*} Returns the accumulated value. |
|
909 */ |
|
910 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { |
|
911 eachFunc(collection, function(value, index, collection) { |
|
912 accumulator = initAccum |
|
913 ? (initAccum = false, value) |
|
914 : iteratee(accumulator, value, index, collection); |
|
915 }); |
|
916 return accumulator; |
|
917 } |
|
918 |
|
919 /** |
|
920 * The base implementation of `_.sortBy` which uses `comparer` to define the |
|
921 * sort order of `array` and replaces criteria objects with their corresponding |
|
922 * values. |
|
923 * |
|
924 * @private |
|
925 * @param {Array} array The array to sort. |
|
926 * @param {Function} comparer The function to define sort order. |
|
927 * @returns {Array} Returns `array`. |
|
928 */ |
|
929 function baseSortBy(array, comparer) { |
|
930 var length = array.length; |
|
931 |
|
932 array.sort(comparer); |
|
933 while (length--) { |
|
934 array[length] = array[length].value; |
|
935 } |
|
936 return array; |
|
937 } |
|
938 |
|
939 /** |
|
940 * The base implementation of `_.sum` and `_.sumBy` without support for |
|
941 * iteratee shorthands. |
|
942 * |
|
943 * @private |
|
944 * @param {Array} array The array to iterate over. |
|
945 * @param {Function} iteratee The function invoked per iteration. |
|
946 * @returns {number} Returns the sum. |
|
947 */ |
|
948 function baseSum(array, iteratee) { |
|
949 var result, |
|
950 index = -1, |
|
951 length = array.length; |
|
952 |
|
953 while (++index < length) { |
|
954 var current = iteratee(array[index]); |
|
955 if (current !== undefined) { |
|
956 result = result === undefined ? current : (result + current); |
|
957 } |
|
958 } |
|
959 return result; |
|
960 } |
|
961 |
|
962 /** |
|
963 * The base implementation of `_.times` without support for iteratee shorthands |
|
964 * or max array length checks. |
|
965 * |
|
966 * @private |
|
967 * @param {number} n The number of times to invoke `iteratee`. |
|
968 * @param {Function} iteratee The function invoked per iteration. |
|
969 * @returns {Array} Returns the array of results. |
|
970 */ |
|
971 function baseTimes(n, iteratee) { |
|
972 var index = -1, |
|
973 result = Array(n); |
|
974 |
|
975 while (++index < n) { |
|
976 result[index] = iteratee(index); |
|
977 } |
|
978 return result; |
|
979 } |
|
980 |
|
981 /** |
|
982 * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array |
|
983 * of key-value pairs for `object` corresponding to the property names of `props`. |
|
984 * |
|
985 * @private |
|
986 * @param {Object} object The object to query. |
|
987 * @param {Array} props The property names to get values for. |
|
988 * @returns {Object} Returns the key-value pairs. |
|
989 */ |
|
990 function baseToPairs(object, props) { |
|
991 return arrayMap(props, function(key) { |
|
992 return [key, object[key]]; |
|
993 }); |
|
994 } |
|
995 |
|
996 /** |
|
997 * The base implementation of `_.unary` without support for storing metadata. |
|
998 * |
|
999 * @private |
|
1000 * @param {Function} func The function to cap arguments for. |
|
1001 * @returns {Function} Returns the new capped function. |
|
1002 */ |
|
1003 function baseUnary(func) { |
|
1004 return function(value) { |
|
1005 return func(value); |
|
1006 }; |
|
1007 } |
|
1008 |
|
1009 /** |
|
1010 * The base implementation of `_.values` and `_.valuesIn` which creates an |
|
1011 * array of `object` property values corresponding to the property names |
|
1012 * of `props`. |
|
1013 * |
|
1014 * @private |
|
1015 * @param {Object} object The object to query. |
|
1016 * @param {Array} props The property names to get values for. |
|
1017 * @returns {Object} Returns the array of property values. |
|
1018 */ |
|
1019 function baseValues(object, props) { |
|
1020 return arrayMap(props, function(key) { |
|
1021 return object[key]; |
|
1022 }); |
|
1023 } |
|
1024 |
|
1025 /** |
|
1026 * Checks if a `cache` value for `key` exists. |
|
1027 * |
|
1028 * @private |
|
1029 * @param {Object} cache The cache to query. |
|
1030 * @param {string} key The key of the entry to check. |
|
1031 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
|
1032 */ |
|
1033 function cacheHas(cache, key) { |
|
1034 return cache.has(key); |
|
1035 } |
|
1036 |
|
1037 /** |
|
1038 * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol |
|
1039 * that is not found in the character symbols. |
|
1040 * |
|
1041 * @private |
|
1042 * @param {Array} strSymbols The string symbols to inspect. |
|
1043 * @param {Array} chrSymbols The character symbols to find. |
|
1044 * @returns {number} Returns the index of the first unmatched string symbol. |
|
1045 */ |
|
1046 function charsStartIndex(strSymbols, chrSymbols) { |
|
1047 var index = -1, |
|
1048 length = strSymbols.length; |
|
1049 |
|
1050 while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} |
|
1051 return index; |
|
1052 } |
|
1053 |
|
1054 /** |
|
1055 * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol |
|
1056 * that is not found in the character symbols. |
|
1057 * |
|
1058 * @private |
|
1059 * @param {Array} strSymbols The string symbols to inspect. |
|
1060 * @param {Array} chrSymbols The character symbols to find. |
|
1061 * @returns {number} Returns the index of the last unmatched string symbol. |
|
1062 */ |
|
1063 function charsEndIndex(strSymbols, chrSymbols) { |
|
1064 var index = strSymbols.length; |
|
1065 |
|
1066 while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} |
|
1067 return index; |
|
1068 } |
|
1069 |
|
1070 /** |
|
1071 * Gets the number of `placeholder` occurrences in `array`. |
|
1072 * |
|
1073 * @private |
|
1074 * @param {Array} array The array to inspect. |
|
1075 * @param {*} placeholder The placeholder to search for. |
|
1076 * @returns {number} Returns the placeholder count. |
|
1077 */ |
|
1078 function countHolders(array, placeholder) { |
|
1079 var length = array.length, |
|
1080 result = 0; |
|
1081 |
|
1082 while (length--) { |
|
1083 if (array[length] === placeholder) { |
|
1084 ++result; |
|
1085 } |
|
1086 } |
|
1087 return result; |
|
1088 } |
|
1089 |
|
1090 /** |
|
1091 * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A |
|
1092 * letters to basic Latin letters. |
|
1093 * |
|
1094 * @private |
|
1095 * @param {string} letter The matched letter to deburr. |
|
1096 * @returns {string} Returns the deburred letter. |
|
1097 */ |
|
1098 var deburrLetter = basePropertyOf(deburredLetters); |
|
1099 |
|
1100 /** |
|
1101 * Used by `_.escape` to convert characters to HTML entities. |
|
1102 * |
|
1103 * @private |
|
1104 * @param {string} chr The matched character to escape. |
|
1105 * @returns {string} Returns the escaped character. |
|
1106 */ |
|
1107 var escapeHtmlChar = basePropertyOf(htmlEscapes); |
|
1108 |
|
1109 /** |
|
1110 * Used by `_.template` to escape characters for inclusion in compiled string literals. |
|
1111 * |
|
1112 * @private |
|
1113 * @param {string} chr The matched character to escape. |
|
1114 * @returns {string} Returns the escaped character. |
|
1115 */ |
|
1116 function escapeStringChar(chr) { |
|
1117 return '\\' + stringEscapes[chr]; |
|
1118 } |
|
1119 |
|
1120 /** |
|
1121 * Gets the value at `key` of `object`. |
|
1122 * |
|
1123 * @private |
|
1124 * @param {Object} [object] The object to query. |
|
1125 * @param {string} key The key of the property to get. |
|
1126 * @returns {*} Returns the property value. |
|
1127 */ |
|
1128 function getValue(object, key) { |
|
1129 return object == null ? undefined : object[key]; |
|
1130 } |
|
1131 |
|
1132 /** |
|
1133 * Checks if `string` contains Unicode symbols. |
|
1134 * |
|
1135 * @private |
|
1136 * @param {string} string The string to inspect. |
|
1137 * @returns {boolean} Returns `true` if a symbol is found, else `false`. |
|
1138 */ |
|
1139 function hasUnicode(string) { |
|
1140 return reHasUnicode.test(string); |
|
1141 } |
|
1142 |
|
1143 /** |
|
1144 * Checks if `string` contains a word composed of Unicode symbols. |
|
1145 * |
|
1146 * @private |
|
1147 * @param {string} string The string to inspect. |
|
1148 * @returns {boolean} Returns `true` if a word is found, else `false`. |
|
1149 */ |
|
1150 function hasUnicodeWord(string) { |
|
1151 return reHasUnicodeWord.test(string); |
|
1152 } |
|
1153 |
|
1154 /** |
|
1155 * Converts `iterator` to an array. |
|
1156 * |
|
1157 * @private |
|
1158 * @param {Object} iterator The iterator to convert. |
|
1159 * @returns {Array} Returns the converted array. |
|
1160 */ |
|
1161 function iteratorToArray(iterator) { |
|
1162 var data, |
|
1163 result = []; |
|
1164 |
|
1165 while (!(data = iterator.next()).done) { |
|
1166 result.push(data.value); |
|
1167 } |
|
1168 return result; |
|
1169 } |
|
1170 |
|
1171 /** |
|
1172 * Converts `map` to its key-value pairs. |
|
1173 * |
|
1174 * @private |
|
1175 * @param {Object} map The map to convert. |
|
1176 * @returns {Array} Returns the key-value pairs. |
|
1177 */ |
|
1178 function mapToArray(map) { |
|
1179 var index = -1, |
|
1180 result = Array(map.size); |
|
1181 |
|
1182 map.forEach(function(value, key) { |
|
1183 result[++index] = [key, value]; |
|
1184 }); |
|
1185 return result; |
|
1186 } |
|
1187 |
|
1188 /** |
|
1189 * Creates a unary function that invokes `func` with its argument transformed. |
|
1190 * |
|
1191 * @private |
|
1192 * @param {Function} func The function to wrap. |
|
1193 * @param {Function} transform The argument transform. |
|
1194 * @returns {Function} Returns the new function. |
|
1195 */ |
|
1196 function overArg(func, transform) { |
|
1197 return function(arg) { |
|
1198 return func(transform(arg)); |
|
1199 }; |
|
1200 } |
|
1201 |
|
1202 /** |
|
1203 * Replaces all `placeholder` elements in `array` with an internal placeholder |
|
1204 * and returns an array of their indexes. |
|
1205 * |
|
1206 * @private |
|
1207 * @param {Array} array The array to modify. |
|
1208 * @param {*} placeholder The placeholder to replace. |
|
1209 * @returns {Array} Returns the new array of placeholder indexes. |
|
1210 */ |
|
1211 function replaceHolders(array, placeholder) { |
|
1212 var index = -1, |
|
1213 length = array.length, |
|
1214 resIndex = 0, |
|
1215 result = []; |
|
1216 |
|
1217 while (++index < length) { |
|
1218 var value = array[index]; |
|
1219 if (value === placeholder || value === PLACEHOLDER) { |
|
1220 array[index] = PLACEHOLDER; |
|
1221 result[resIndex++] = index; |
|
1222 } |
|
1223 } |
|
1224 return result; |
|
1225 } |
|
1226 |
|
1227 /** |
|
1228 * Converts `set` to an array of its values. |
|
1229 * |
|
1230 * @private |
|
1231 * @param {Object} set The set to convert. |
|
1232 * @returns {Array} Returns the values. |
|
1233 */ |
|
1234 function setToArray(set) { |
|
1235 var index = -1, |
|
1236 result = Array(set.size); |
|
1237 |
|
1238 set.forEach(function(value) { |
|
1239 result[++index] = value; |
|
1240 }); |
|
1241 return result; |
|
1242 } |
|
1243 |
|
1244 /** |
|
1245 * Converts `set` to its value-value pairs. |
|
1246 * |
|
1247 * @private |
|
1248 * @param {Object} set The set to convert. |
|
1249 * @returns {Array} Returns the value-value pairs. |
|
1250 */ |
|
1251 function setToPairs(set) { |
|
1252 var index = -1, |
|
1253 result = Array(set.size); |
|
1254 |
|
1255 set.forEach(function(value) { |
|
1256 result[++index] = [value, value]; |
|
1257 }); |
|
1258 return result; |
|
1259 } |
|
1260 |
|
1261 /** |
|
1262 * A specialized version of `_.indexOf` which performs strict equality |
|
1263 * comparisons of values, i.e. `===`. |
|
1264 * |
|
1265 * @private |
|
1266 * @param {Array} array The array to inspect. |
|
1267 * @param {*} value The value to search for. |
|
1268 * @param {number} fromIndex The index to search from. |
|
1269 * @returns {number} Returns the index of the matched value, else `-1`. |
|
1270 */ |
|
1271 function strictIndexOf(array, value, fromIndex) { |
|
1272 var index = fromIndex - 1, |
|
1273 length = array.length; |
|
1274 |
|
1275 while (++index < length) { |
|
1276 if (array[index] === value) { |
|
1277 return index; |
|
1278 } |
|
1279 } |
|
1280 return -1; |
|
1281 } |
|
1282 |
|
1283 /** |
|
1284 * A specialized version of `_.lastIndexOf` which performs strict equality |
|
1285 * comparisons of values, i.e. `===`. |
|
1286 * |
|
1287 * @private |
|
1288 * @param {Array} array The array to inspect. |
|
1289 * @param {*} value The value to search for. |
|
1290 * @param {number} fromIndex The index to search from. |
|
1291 * @returns {number} Returns the index of the matched value, else `-1`. |
|
1292 */ |
|
1293 function strictLastIndexOf(array, value, fromIndex) { |
|
1294 var index = fromIndex + 1; |
|
1295 while (index--) { |
|
1296 if (array[index] === value) { |
|
1297 return index; |
|
1298 } |
|
1299 } |
|
1300 return index; |
|
1301 } |
|
1302 |
|
1303 /** |
|
1304 * Gets the number of symbols in `string`. |
|
1305 * |
|
1306 * @private |
|
1307 * @param {string} string The string to inspect. |
|
1308 * @returns {number} Returns the string size. |
|
1309 */ |
|
1310 function stringSize(string) { |
|
1311 return hasUnicode(string) |
|
1312 ? unicodeSize(string) |
|
1313 : asciiSize(string); |
|
1314 } |
|
1315 |
|
1316 /** |
|
1317 * Converts `string` to an array. |
|
1318 * |
|
1319 * @private |
|
1320 * @param {string} string The string to convert. |
|
1321 * @returns {Array} Returns the converted array. |
|
1322 */ |
|
1323 function stringToArray(string) { |
|
1324 return hasUnicode(string) |
|
1325 ? unicodeToArray(string) |
|
1326 : asciiToArray(string); |
|
1327 } |
|
1328 |
|
1329 /** |
|
1330 * Used by `_.unescape` to convert HTML entities to characters. |
|
1331 * |
|
1332 * @private |
|
1333 * @param {string} chr The matched character to unescape. |
|
1334 * @returns {string} Returns the unescaped character. |
|
1335 */ |
|
1336 var unescapeHtmlChar = basePropertyOf(htmlUnescapes); |
|
1337 |
|
1338 /** |
|
1339 * Gets the size of a Unicode `string`. |
|
1340 * |
|
1341 * @private |
|
1342 * @param {string} string The string inspect. |
|
1343 * @returns {number} Returns the string size. |
|
1344 */ |
|
1345 function unicodeSize(string) { |
|
1346 var result = reUnicode.lastIndex = 0; |
|
1347 while (reUnicode.test(string)) { |
|
1348 ++result; |
|
1349 } |
|
1350 return result; |
|
1351 } |
|
1352 |
|
1353 /** |
|
1354 * Converts a Unicode `string` to an array. |
|
1355 * |
|
1356 * @private |
|
1357 * @param {string} string The string to convert. |
|
1358 * @returns {Array} Returns the converted array. |
|
1359 */ |
|
1360 function unicodeToArray(string) { |
|
1361 return string.match(reUnicode) || []; |
|
1362 } |
|
1363 |
|
1364 /** |
|
1365 * Splits a Unicode `string` into an array of its words. |
|
1366 * |
|
1367 * @private |
|
1368 * @param {string} The string to inspect. |
|
1369 * @returns {Array} Returns the words of `string`. |
|
1370 */ |
|
1371 function unicodeWords(string) { |
|
1372 return string.match(reUnicodeWord) || []; |
|
1373 } |
|
1374 |
|
1375 /*--------------------------------------------------------------------------*/ |
|
1376 |
|
1377 /** |
|
1378 * Create a new pristine `lodash` function using the `context` object. |
|
1379 * |
|
1380 * @static |
|
1381 * @memberOf _ |
|
1382 * @since 1.1.0 |
|
1383 * @category Util |
|
1384 * @param {Object} [context=root] The context object. |
|
1385 * @returns {Function} Returns a new `lodash` function. |
|
1386 * @example |
|
1387 * |
|
1388 * _.mixin({ 'foo': _.constant('foo') }); |
|
1389 * |
|
1390 * var lodash = _.runInContext(); |
|
1391 * lodash.mixin({ 'bar': lodash.constant('bar') }); |
|
1392 * |
|
1393 * _.isFunction(_.foo); |
|
1394 * // => true |
|
1395 * _.isFunction(_.bar); |
|
1396 * // => false |
|
1397 * |
|
1398 * lodash.isFunction(lodash.foo); |
|
1399 * // => false |
|
1400 * lodash.isFunction(lodash.bar); |
|
1401 * // => true |
|
1402 * |
|
1403 * // Create a suped-up `defer` in Node.js. |
|
1404 * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; |
|
1405 */ |
|
1406 var runInContext = (function runInContext(context) { |
|
1407 context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); |
|
1408 |
|
1409 /** Built-in constructor references. */ |
|
1410 var Array = context.Array, |
|
1411 Date = context.Date, |
|
1412 Error = context.Error, |
|
1413 Function = context.Function, |
|
1414 Math = context.Math, |
|
1415 Object = context.Object, |
|
1416 RegExp = context.RegExp, |
|
1417 String = context.String, |
|
1418 TypeError = context.TypeError; |
|
1419 |
|
1420 /** Used for built-in method references. */ |
|
1421 var arrayProto = Array.prototype, |
|
1422 funcProto = Function.prototype, |
|
1423 objectProto = Object.prototype; |
|
1424 |
|
1425 /** Used to detect overreaching core-js shims. */ |
|
1426 var coreJsData = context['__core-js_shared__']; |
|
1427 |
|
1428 /** Used to resolve the decompiled source of functions. */ |
|
1429 var funcToString = funcProto.toString; |
|
1430 |
|
1431 /** Used to check objects for own properties. */ |
|
1432 var hasOwnProperty = objectProto.hasOwnProperty; |
|
1433 |
|
1434 /** Used to generate unique IDs. */ |
|
1435 var idCounter = 0; |
|
1436 |
|
1437 /** Used to detect methods masquerading as native. */ |
|
1438 var maskSrcKey = (function() { |
|
1439 var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); |
|
1440 return uid ? ('Symbol(src)_1.' + uid) : ''; |
|
1441 }()); |
|
1442 |
|
1443 /** |
|
1444 * Used to resolve the |
|
1445 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) |
|
1446 * of values. |
|
1447 */ |
|
1448 var nativeObjectToString = objectProto.toString; |
|
1449 |
|
1450 /** Used to infer the `Object` constructor. */ |
|
1451 var objectCtorString = funcToString.call(Object); |
|
1452 |
|
1453 /** Used to restore the original `_` reference in `_.noConflict`. */ |
|
1454 var oldDash = root._; |
|
1455 |
|
1456 /** Used to detect if a method is native. */ |
|
1457 var reIsNative = RegExp('^' + |
|
1458 funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') |
|
1459 .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' |
|
1460 ); |
|
1461 |
|
1462 /** Built-in value references. */ |
|
1463 var Buffer = moduleExports ? context.Buffer : undefined, |
|
1464 Symbol = context.Symbol, |
|
1465 Uint8Array = context.Uint8Array, |
|
1466 allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, |
|
1467 getPrototype = overArg(Object.getPrototypeOf, Object), |
|
1468 objectCreate = Object.create, |
|
1469 propertyIsEnumerable = objectProto.propertyIsEnumerable, |
|
1470 splice = arrayProto.splice, |
|
1471 spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, |
|
1472 symIterator = Symbol ? Symbol.iterator : undefined, |
|
1473 symToStringTag = Symbol ? Symbol.toStringTag : undefined; |
|
1474 |
|
1475 var defineProperty = (function() { |
|
1476 try { |
|
1477 var func = getNative(Object, 'defineProperty'); |
|
1478 func({}, '', {}); |
|
1479 return func; |
|
1480 } catch (e) {} |
|
1481 }()); |
|
1482 |
|
1483 /** Mocked built-ins. */ |
|
1484 var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, |
|
1485 ctxNow = Date && Date.now !== root.Date.now && Date.now, |
|
1486 ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; |
|
1487 |
|
1488 /* Built-in method references for those with the same name as other `lodash` methods. */ |
|
1489 var nativeCeil = Math.ceil, |
|
1490 nativeFloor = Math.floor, |
|
1491 nativeGetSymbols = Object.getOwnPropertySymbols, |
|
1492 nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, |
|
1493 nativeIsFinite = context.isFinite, |
|
1494 nativeJoin = arrayProto.join, |
|
1495 nativeKeys = overArg(Object.keys, Object), |
|
1496 nativeMax = Math.max, |
|
1497 nativeMin = Math.min, |
|
1498 nativeNow = Date.now, |
|
1499 nativeParseInt = context.parseInt, |
|
1500 nativeRandom = Math.random, |
|
1501 nativeReverse = arrayProto.reverse; |
|
1502 |
|
1503 /* Built-in method references that are verified to be native. */ |
|
1504 var DataView = getNative(context, 'DataView'), |
|
1505 Map = getNative(context, 'Map'), |
|
1506 Promise = getNative(context, 'Promise'), |
|
1507 Set = getNative(context, 'Set'), |
|
1508 WeakMap = getNative(context, 'WeakMap'), |
|
1509 nativeCreate = getNative(Object, 'create'); |
|
1510 |
|
1511 /** Used to store function metadata. */ |
|
1512 var metaMap = WeakMap && new WeakMap; |
|
1513 |
|
1514 /** Used to lookup unminified function names. */ |
|
1515 var realNames = {}; |
|
1516 |
|
1517 /** Used to detect maps, sets, and weakmaps. */ |
|
1518 var dataViewCtorString = toSource(DataView), |
|
1519 mapCtorString = toSource(Map), |
|
1520 promiseCtorString = toSource(Promise), |
|
1521 setCtorString = toSource(Set), |
|
1522 weakMapCtorString = toSource(WeakMap); |
|
1523 |
|
1524 /** Used to convert symbols to primitives and strings. */ |
|
1525 var symbolProto = Symbol ? Symbol.prototype : undefined, |
|
1526 symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, |
|
1527 symbolToString = symbolProto ? symbolProto.toString : undefined; |
|
1528 |
|
1529 /*------------------------------------------------------------------------*/ |
|
1530 |
|
1531 /** |
|
1532 * Creates a `lodash` object which wraps `value` to enable implicit method |
|
1533 * chain sequences. Methods that operate on and return arrays, collections, |
|
1534 * and functions can be chained together. Methods that retrieve a single value |
|
1535 * or may return a primitive value will automatically end the chain sequence |
|
1536 * and return the unwrapped value. Otherwise, the value must be unwrapped |
|
1537 * with `_#value`. |
|
1538 * |
|
1539 * Explicit chain sequences, which must be unwrapped with `_#value`, may be |
|
1540 * enabled using `_.chain`. |
|
1541 * |
|
1542 * The execution of chained methods is lazy, that is, it's deferred until |
|
1543 * `_#value` is implicitly or explicitly called. |
|
1544 * |
|
1545 * Lazy evaluation allows several methods to support shortcut fusion. |
|
1546 * Shortcut fusion is an optimization to merge iteratee calls; this avoids |
|
1547 * the creation of intermediate arrays and can greatly reduce the number of |
|
1548 * iteratee executions. Sections of a chain sequence qualify for shortcut |
|
1549 * fusion if the section is applied to an array and iteratees accept only |
|
1550 * one argument. The heuristic for whether a section qualifies for shortcut |
|
1551 * fusion is subject to change. |
|
1552 * |
|
1553 * Chaining is supported in custom builds as long as the `_#value` method is |
|
1554 * directly or indirectly included in the build. |
|
1555 * |
|
1556 * In addition to lodash methods, wrappers have `Array` and `String` methods. |
|
1557 * |
|
1558 * The wrapper `Array` methods are: |
|
1559 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` |
|
1560 * |
|
1561 * The wrapper `String` methods are: |
|
1562 * `replace` and `split` |
|
1563 * |
|
1564 * The wrapper methods that support shortcut fusion are: |
|
1565 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, |
|
1566 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, |
|
1567 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` |
|
1568 * |
|
1569 * The chainable wrapper methods are: |
|
1570 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, |
|
1571 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, |
|
1572 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, |
|
1573 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, |
|
1574 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, |
|
1575 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, |
|
1576 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, |
|
1577 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, |
|
1578 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, |
|
1579 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, |
|
1580 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, |
|
1581 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, |
|
1582 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, |
|
1583 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, |
|
1584 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, |
|
1585 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, |
|
1586 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, |
|
1587 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, |
|
1588 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, |
|
1589 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, |
|
1590 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, |
|
1591 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, |
|
1592 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, |
|
1593 * `zipObject`, `zipObjectDeep`, and `zipWith` |
|
1594 * |
|
1595 * The wrapper methods that are **not** chainable by default are: |
|
1596 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, |
|
1597 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, |
|
1598 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, |
|
1599 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, |
|
1600 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, |
|
1601 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, |
|
1602 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, |
|
1603 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, |
|
1604 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, |
|
1605 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, |
|
1606 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, |
|
1607 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, |
|
1608 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, |
|
1609 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, |
|
1610 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, |
|
1611 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, |
|
1612 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, |
|
1613 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, |
|
1614 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, |
|
1615 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, |
|
1616 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, |
|
1617 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, |
|
1618 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, |
|
1619 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, |
|
1620 * `upperFirst`, `value`, and `words` |
|
1621 * |
|
1622 * @name _ |
|
1623 * @constructor |
|
1624 * @category Seq |
|
1625 * @param {*} value The value to wrap in a `lodash` instance. |
|
1626 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
1627 * @example |
|
1628 * |
|
1629 * function square(n) { |
|
1630 * return n * n; |
|
1631 * } |
|
1632 * |
|
1633 * var wrapped = _([1, 2, 3]); |
|
1634 * |
|
1635 * // Returns an unwrapped value. |
|
1636 * wrapped.reduce(_.add); |
|
1637 * // => 6 |
|
1638 * |
|
1639 * // Returns a wrapped value. |
|
1640 * var squares = wrapped.map(square); |
|
1641 * |
|
1642 * _.isArray(squares); |
|
1643 * // => false |
|
1644 * |
|
1645 * _.isArray(squares.value()); |
|
1646 * // => true |
|
1647 */ |
|
1648 function lodash(value) { |
|
1649 if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { |
|
1650 if (value instanceof LodashWrapper) { |
|
1651 return value; |
|
1652 } |
|
1653 if (hasOwnProperty.call(value, '__wrapped__')) { |
|
1654 return wrapperClone(value); |
|
1655 } |
|
1656 } |
|
1657 return new LodashWrapper(value); |
|
1658 } |
|
1659 |
|
1660 /** |
|
1661 * The base implementation of `_.create` without support for assigning |
|
1662 * properties to the created object. |
|
1663 * |
|
1664 * @private |
|
1665 * @param {Object} proto The object to inherit from. |
|
1666 * @returns {Object} Returns the new object. |
|
1667 */ |
|
1668 var baseCreate = (function() { |
|
1669 function object() {} |
|
1670 return function(proto) { |
|
1671 if (!isObject(proto)) { |
|
1672 return {}; |
|
1673 } |
|
1674 if (objectCreate) { |
|
1675 return objectCreate(proto); |
|
1676 } |
|
1677 object.prototype = proto; |
|
1678 var result = new object; |
|
1679 object.prototype = undefined; |
|
1680 return result; |
|
1681 }; |
|
1682 }()); |
|
1683 |
|
1684 /** |
|
1685 * The function whose prototype chain sequence wrappers inherit from. |
|
1686 * |
|
1687 * @private |
|
1688 */ |
|
1689 function baseLodash() { |
|
1690 // No operation performed. |
|
1691 } |
|
1692 |
|
1693 /** |
|
1694 * The base constructor for creating `lodash` wrapper objects. |
|
1695 * |
|
1696 * @private |
|
1697 * @param {*} value The value to wrap. |
|
1698 * @param {boolean} [chainAll] Enable explicit method chain sequences. |
|
1699 */ |
|
1700 function LodashWrapper(value, chainAll) { |
|
1701 this.__wrapped__ = value; |
|
1702 this.__actions__ = []; |
|
1703 this.__chain__ = !!chainAll; |
|
1704 this.__index__ = 0; |
|
1705 this.__values__ = undefined; |
|
1706 } |
|
1707 |
|
1708 /** |
|
1709 * By default, the template delimiters used by lodash are like those in |
|
1710 * embedded Ruby (ERB) as well as ES2015 template strings. Change the |
|
1711 * following template settings to use alternative delimiters. |
|
1712 * |
|
1713 * @static |
|
1714 * @memberOf _ |
|
1715 * @type {Object} |
|
1716 */ |
|
1717 lodash.templateSettings = { |
|
1718 |
|
1719 /** |
|
1720 * Used to detect `data` property values to be HTML-escaped. |
|
1721 * |
|
1722 * @memberOf _.templateSettings |
|
1723 * @type {RegExp} |
|
1724 */ |
|
1725 'escape': reEscape, |
|
1726 |
|
1727 /** |
|
1728 * Used to detect code to be evaluated. |
|
1729 * |
|
1730 * @memberOf _.templateSettings |
|
1731 * @type {RegExp} |
|
1732 */ |
|
1733 'evaluate': reEvaluate, |
|
1734 |
|
1735 /** |
|
1736 * Used to detect `data` property values to inject. |
|
1737 * |
|
1738 * @memberOf _.templateSettings |
|
1739 * @type {RegExp} |
|
1740 */ |
|
1741 'interpolate': reInterpolate, |
|
1742 |
|
1743 /** |
|
1744 * Used to reference the data object in the template text. |
|
1745 * |
|
1746 * @memberOf _.templateSettings |
|
1747 * @type {string} |
|
1748 */ |
|
1749 'variable': '', |
|
1750 |
|
1751 /** |
|
1752 * Used to import variables into the compiled template. |
|
1753 * |
|
1754 * @memberOf _.templateSettings |
|
1755 * @type {Object} |
|
1756 */ |
|
1757 'imports': { |
|
1758 |
|
1759 /** |
|
1760 * A reference to the `lodash` function. |
|
1761 * |
|
1762 * @memberOf _.templateSettings.imports |
|
1763 * @type {Function} |
|
1764 */ |
|
1765 '_': lodash |
|
1766 } |
|
1767 }; |
|
1768 |
|
1769 // Ensure wrappers are instances of `baseLodash`. |
|
1770 lodash.prototype = baseLodash.prototype; |
|
1771 lodash.prototype.constructor = lodash; |
|
1772 |
|
1773 LodashWrapper.prototype = baseCreate(baseLodash.prototype); |
|
1774 LodashWrapper.prototype.constructor = LodashWrapper; |
|
1775 |
|
1776 /*------------------------------------------------------------------------*/ |
|
1777 |
|
1778 /** |
|
1779 * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. |
|
1780 * |
|
1781 * @private |
|
1782 * @constructor |
|
1783 * @param {*} value The value to wrap. |
|
1784 */ |
|
1785 function LazyWrapper(value) { |
|
1786 this.__wrapped__ = value; |
|
1787 this.__actions__ = []; |
|
1788 this.__dir__ = 1; |
|
1789 this.__filtered__ = false; |
|
1790 this.__iteratees__ = []; |
|
1791 this.__takeCount__ = MAX_ARRAY_LENGTH; |
|
1792 this.__views__ = []; |
|
1793 } |
|
1794 |
|
1795 /** |
|
1796 * Creates a clone of the lazy wrapper object. |
|
1797 * |
|
1798 * @private |
|
1799 * @name clone |
|
1800 * @memberOf LazyWrapper |
|
1801 * @returns {Object} Returns the cloned `LazyWrapper` object. |
|
1802 */ |
|
1803 function lazyClone() { |
|
1804 var result = new LazyWrapper(this.__wrapped__); |
|
1805 result.__actions__ = copyArray(this.__actions__); |
|
1806 result.__dir__ = this.__dir__; |
|
1807 result.__filtered__ = this.__filtered__; |
|
1808 result.__iteratees__ = copyArray(this.__iteratees__); |
|
1809 result.__takeCount__ = this.__takeCount__; |
|
1810 result.__views__ = copyArray(this.__views__); |
|
1811 return result; |
|
1812 } |
|
1813 |
|
1814 /** |
|
1815 * Reverses the direction of lazy iteration. |
|
1816 * |
|
1817 * @private |
|
1818 * @name reverse |
|
1819 * @memberOf LazyWrapper |
|
1820 * @returns {Object} Returns the new reversed `LazyWrapper` object. |
|
1821 */ |
|
1822 function lazyReverse() { |
|
1823 if (this.__filtered__) { |
|
1824 var result = new LazyWrapper(this); |
|
1825 result.__dir__ = -1; |
|
1826 result.__filtered__ = true; |
|
1827 } else { |
|
1828 result = this.clone(); |
|
1829 result.__dir__ *= -1; |
|
1830 } |
|
1831 return result; |
|
1832 } |
|
1833 |
|
1834 /** |
|
1835 * Extracts the unwrapped value from its lazy wrapper. |
|
1836 * |
|
1837 * @private |
|
1838 * @name value |
|
1839 * @memberOf LazyWrapper |
|
1840 * @returns {*} Returns the unwrapped value. |
|
1841 */ |
|
1842 function lazyValue() { |
|
1843 var array = this.__wrapped__.value(), |
|
1844 dir = this.__dir__, |
|
1845 isArr = isArray(array), |
|
1846 isRight = dir < 0, |
|
1847 arrLength = isArr ? array.length : 0, |
|
1848 view = getView(0, arrLength, this.__views__), |
|
1849 start = view.start, |
|
1850 end = view.end, |
|
1851 length = end - start, |
|
1852 index = isRight ? end : (start - 1), |
|
1853 iteratees = this.__iteratees__, |
|
1854 iterLength = iteratees.length, |
|
1855 resIndex = 0, |
|
1856 takeCount = nativeMin(length, this.__takeCount__); |
|
1857 |
|
1858 if (!isArr || (!isRight && arrLength == length && takeCount == length)) { |
|
1859 return baseWrapperValue(array, this.__actions__); |
|
1860 } |
|
1861 var result = []; |
|
1862 |
|
1863 outer: |
|
1864 while (length-- && resIndex < takeCount) { |
|
1865 index += dir; |
|
1866 |
|
1867 var iterIndex = -1, |
|
1868 value = array[index]; |
|
1869 |
|
1870 while (++iterIndex < iterLength) { |
|
1871 var data = iteratees[iterIndex], |
|
1872 iteratee = data.iteratee, |
|
1873 type = data.type, |
|
1874 computed = iteratee(value); |
|
1875 |
|
1876 if (type == LAZY_MAP_FLAG) { |
|
1877 value = computed; |
|
1878 } else if (!computed) { |
|
1879 if (type == LAZY_FILTER_FLAG) { |
|
1880 continue outer; |
|
1881 } else { |
|
1882 break outer; |
|
1883 } |
|
1884 } |
|
1885 } |
|
1886 result[resIndex++] = value; |
|
1887 } |
|
1888 return result; |
|
1889 } |
|
1890 |
|
1891 // Ensure `LazyWrapper` is an instance of `baseLodash`. |
|
1892 LazyWrapper.prototype = baseCreate(baseLodash.prototype); |
|
1893 LazyWrapper.prototype.constructor = LazyWrapper; |
|
1894 |
|
1895 /*------------------------------------------------------------------------*/ |
|
1896 |
|
1897 /** |
|
1898 * Creates a hash object. |
|
1899 * |
|
1900 * @private |
|
1901 * @constructor |
|
1902 * @param {Array} [entries] The key-value pairs to cache. |
|
1903 */ |
|
1904 function Hash(entries) { |
|
1905 var index = -1, |
|
1906 length = entries == null ? 0 : entries.length; |
|
1907 |
|
1908 this.clear(); |
|
1909 while (++index < length) { |
|
1910 var entry = entries[index]; |
|
1911 this.set(entry[0], entry[1]); |
|
1912 } |
|
1913 } |
|
1914 |
|
1915 /** |
|
1916 * Removes all key-value entries from the hash. |
|
1917 * |
|
1918 * @private |
|
1919 * @name clear |
|
1920 * @memberOf Hash |
|
1921 */ |
|
1922 function hashClear() { |
|
1923 this.__data__ = nativeCreate ? nativeCreate(null) : {}; |
|
1924 this.size = 0; |
|
1925 } |
|
1926 |
|
1927 /** |
|
1928 * Removes `key` and its value from the hash. |
|
1929 * |
|
1930 * @private |
|
1931 * @name delete |
|
1932 * @memberOf Hash |
|
1933 * @param {Object} hash The hash to modify. |
|
1934 * @param {string} key The key of the value to remove. |
|
1935 * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
|
1936 */ |
|
1937 function hashDelete(key) { |
|
1938 var result = this.has(key) && delete this.__data__[key]; |
|
1939 this.size -= result ? 1 : 0; |
|
1940 return result; |
|
1941 } |
|
1942 |
|
1943 /** |
|
1944 * Gets the hash value for `key`. |
|
1945 * |
|
1946 * @private |
|
1947 * @name get |
|
1948 * @memberOf Hash |
|
1949 * @param {string} key The key of the value to get. |
|
1950 * @returns {*} Returns the entry value. |
|
1951 */ |
|
1952 function hashGet(key) { |
|
1953 var data = this.__data__; |
|
1954 if (nativeCreate) { |
|
1955 var result = data[key]; |
|
1956 return result === HASH_UNDEFINED ? undefined : result; |
|
1957 } |
|
1958 return hasOwnProperty.call(data, key) ? data[key] : undefined; |
|
1959 } |
|
1960 |
|
1961 /** |
|
1962 * Checks if a hash value for `key` exists. |
|
1963 * |
|
1964 * @private |
|
1965 * @name has |
|
1966 * @memberOf Hash |
|
1967 * @param {string} key The key of the entry to check. |
|
1968 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
|
1969 */ |
|
1970 function hashHas(key) { |
|
1971 var data = this.__data__; |
|
1972 return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); |
|
1973 } |
|
1974 |
|
1975 /** |
|
1976 * Sets the hash `key` to `value`. |
|
1977 * |
|
1978 * @private |
|
1979 * @name set |
|
1980 * @memberOf Hash |
|
1981 * @param {string} key The key of the value to set. |
|
1982 * @param {*} value The value to set. |
|
1983 * @returns {Object} Returns the hash instance. |
|
1984 */ |
|
1985 function hashSet(key, value) { |
|
1986 var data = this.__data__; |
|
1987 this.size += this.has(key) ? 0 : 1; |
|
1988 data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; |
|
1989 return this; |
|
1990 } |
|
1991 |
|
1992 // Add methods to `Hash`. |
|
1993 Hash.prototype.clear = hashClear; |
|
1994 Hash.prototype['delete'] = hashDelete; |
|
1995 Hash.prototype.get = hashGet; |
|
1996 Hash.prototype.has = hashHas; |
|
1997 Hash.prototype.set = hashSet; |
|
1998 |
|
1999 /*------------------------------------------------------------------------*/ |
|
2000 |
|
2001 /** |
|
2002 * Creates an list cache object. |
|
2003 * |
|
2004 * @private |
|
2005 * @constructor |
|
2006 * @param {Array} [entries] The key-value pairs to cache. |
|
2007 */ |
|
2008 function ListCache(entries) { |
|
2009 var index = -1, |
|
2010 length = entries == null ? 0 : entries.length; |
|
2011 |
|
2012 this.clear(); |
|
2013 while (++index < length) { |
|
2014 var entry = entries[index]; |
|
2015 this.set(entry[0], entry[1]); |
|
2016 } |
|
2017 } |
|
2018 |
|
2019 /** |
|
2020 * Removes all key-value entries from the list cache. |
|
2021 * |
|
2022 * @private |
|
2023 * @name clear |
|
2024 * @memberOf ListCache |
|
2025 */ |
|
2026 function listCacheClear() { |
|
2027 this.__data__ = []; |
|
2028 this.size = 0; |
|
2029 } |
|
2030 |
|
2031 /** |
|
2032 * Removes `key` and its value from the list cache. |
|
2033 * |
|
2034 * @private |
|
2035 * @name delete |
|
2036 * @memberOf ListCache |
|
2037 * @param {string} key The key of the value to remove. |
|
2038 * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
|
2039 */ |
|
2040 function listCacheDelete(key) { |
|
2041 var data = this.__data__, |
|
2042 index = assocIndexOf(data, key); |
|
2043 |
|
2044 if (index < 0) { |
|
2045 return false; |
|
2046 } |
|
2047 var lastIndex = data.length - 1; |
|
2048 if (index == lastIndex) { |
|
2049 data.pop(); |
|
2050 } else { |
|
2051 splice.call(data, index, 1); |
|
2052 } |
|
2053 --this.size; |
|
2054 return true; |
|
2055 } |
|
2056 |
|
2057 /** |
|
2058 * Gets the list cache value for `key`. |
|
2059 * |
|
2060 * @private |
|
2061 * @name get |
|
2062 * @memberOf ListCache |
|
2063 * @param {string} key The key of the value to get. |
|
2064 * @returns {*} Returns the entry value. |
|
2065 */ |
|
2066 function listCacheGet(key) { |
|
2067 var data = this.__data__, |
|
2068 index = assocIndexOf(data, key); |
|
2069 |
|
2070 return index < 0 ? undefined : data[index][1]; |
|
2071 } |
|
2072 |
|
2073 /** |
|
2074 * Checks if a list cache value for `key` exists. |
|
2075 * |
|
2076 * @private |
|
2077 * @name has |
|
2078 * @memberOf ListCache |
|
2079 * @param {string} key The key of the entry to check. |
|
2080 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
|
2081 */ |
|
2082 function listCacheHas(key) { |
|
2083 return assocIndexOf(this.__data__, key) > -1; |
|
2084 } |
|
2085 |
|
2086 /** |
|
2087 * Sets the list cache `key` to `value`. |
|
2088 * |
|
2089 * @private |
|
2090 * @name set |
|
2091 * @memberOf ListCache |
|
2092 * @param {string} key The key of the value to set. |
|
2093 * @param {*} value The value to set. |
|
2094 * @returns {Object} Returns the list cache instance. |
|
2095 */ |
|
2096 function listCacheSet(key, value) { |
|
2097 var data = this.__data__, |
|
2098 index = assocIndexOf(data, key); |
|
2099 |
|
2100 if (index < 0) { |
|
2101 ++this.size; |
|
2102 data.push([key, value]); |
|
2103 } else { |
|
2104 data[index][1] = value; |
|
2105 } |
|
2106 return this; |
|
2107 } |
|
2108 |
|
2109 // Add methods to `ListCache`. |
|
2110 ListCache.prototype.clear = listCacheClear; |
|
2111 ListCache.prototype['delete'] = listCacheDelete; |
|
2112 ListCache.prototype.get = listCacheGet; |
|
2113 ListCache.prototype.has = listCacheHas; |
|
2114 ListCache.prototype.set = listCacheSet; |
|
2115 |
|
2116 /*------------------------------------------------------------------------*/ |
|
2117 |
|
2118 /** |
|
2119 * Creates a map cache object to store key-value pairs. |
|
2120 * |
|
2121 * @private |
|
2122 * @constructor |
|
2123 * @param {Array} [entries] The key-value pairs to cache. |
|
2124 */ |
|
2125 function MapCache(entries) { |
|
2126 var index = -1, |
|
2127 length = entries == null ? 0 : entries.length; |
|
2128 |
|
2129 this.clear(); |
|
2130 while (++index < length) { |
|
2131 var entry = entries[index]; |
|
2132 this.set(entry[0], entry[1]); |
|
2133 } |
|
2134 } |
|
2135 |
|
2136 /** |
|
2137 * Removes all key-value entries from the map. |
|
2138 * |
|
2139 * @private |
|
2140 * @name clear |
|
2141 * @memberOf MapCache |
|
2142 */ |
|
2143 function mapCacheClear() { |
|
2144 this.size = 0; |
|
2145 this.__data__ = { |
|
2146 'hash': new Hash, |
|
2147 'map': new (Map || ListCache), |
|
2148 'string': new Hash |
|
2149 }; |
|
2150 } |
|
2151 |
|
2152 /** |
|
2153 * Removes `key` and its value from the map. |
|
2154 * |
|
2155 * @private |
|
2156 * @name delete |
|
2157 * @memberOf MapCache |
|
2158 * @param {string} key The key of the value to remove. |
|
2159 * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
|
2160 */ |
|
2161 function mapCacheDelete(key) { |
|
2162 var result = getMapData(this, key)['delete'](key); |
|
2163 this.size -= result ? 1 : 0; |
|
2164 return result; |
|
2165 } |
|
2166 |
|
2167 /** |
|
2168 * Gets the map value for `key`. |
|
2169 * |
|
2170 * @private |
|
2171 * @name get |
|
2172 * @memberOf MapCache |
|
2173 * @param {string} key The key of the value to get. |
|
2174 * @returns {*} Returns the entry value. |
|
2175 */ |
|
2176 function mapCacheGet(key) { |
|
2177 return getMapData(this, key).get(key); |
|
2178 } |
|
2179 |
|
2180 /** |
|
2181 * Checks if a map value for `key` exists. |
|
2182 * |
|
2183 * @private |
|
2184 * @name has |
|
2185 * @memberOf MapCache |
|
2186 * @param {string} key The key of the entry to check. |
|
2187 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
|
2188 */ |
|
2189 function mapCacheHas(key) { |
|
2190 return getMapData(this, key).has(key); |
|
2191 } |
|
2192 |
|
2193 /** |
|
2194 * Sets the map `key` to `value`. |
|
2195 * |
|
2196 * @private |
|
2197 * @name set |
|
2198 * @memberOf MapCache |
|
2199 * @param {string} key The key of the value to set. |
|
2200 * @param {*} value The value to set. |
|
2201 * @returns {Object} Returns the map cache instance. |
|
2202 */ |
|
2203 function mapCacheSet(key, value) { |
|
2204 var data = getMapData(this, key), |
|
2205 size = data.size; |
|
2206 |
|
2207 data.set(key, value); |
|
2208 this.size += data.size == size ? 0 : 1; |
|
2209 return this; |
|
2210 } |
|
2211 |
|
2212 // Add methods to `MapCache`. |
|
2213 MapCache.prototype.clear = mapCacheClear; |
|
2214 MapCache.prototype['delete'] = mapCacheDelete; |
|
2215 MapCache.prototype.get = mapCacheGet; |
|
2216 MapCache.prototype.has = mapCacheHas; |
|
2217 MapCache.prototype.set = mapCacheSet; |
|
2218 |
|
2219 /*------------------------------------------------------------------------*/ |
|
2220 |
|
2221 /** |
|
2222 * |
|
2223 * Creates an array cache object to store unique values. |
|
2224 * |
|
2225 * @private |
|
2226 * @constructor |
|
2227 * @param {Array} [values] The values to cache. |
|
2228 */ |
|
2229 function SetCache(values) { |
|
2230 var index = -1, |
|
2231 length = values == null ? 0 : values.length; |
|
2232 |
|
2233 this.__data__ = new MapCache; |
|
2234 while (++index < length) { |
|
2235 this.add(values[index]); |
|
2236 } |
|
2237 } |
|
2238 |
|
2239 /** |
|
2240 * Adds `value` to the array cache. |
|
2241 * |
|
2242 * @private |
|
2243 * @name add |
|
2244 * @memberOf SetCache |
|
2245 * @alias push |
|
2246 * @param {*} value The value to cache. |
|
2247 * @returns {Object} Returns the cache instance. |
|
2248 */ |
|
2249 function setCacheAdd(value) { |
|
2250 this.__data__.set(value, HASH_UNDEFINED); |
|
2251 return this; |
|
2252 } |
|
2253 |
|
2254 /** |
|
2255 * Checks if `value` is in the array cache. |
|
2256 * |
|
2257 * @private |
|
2258 * @name has |
|
2259 * @memberOf SetCache |
|
2260 * @param {*} value The value to search for. |
|
2261 * @returns {number} Returns `true` if `value` is found, else `false`. |
|
2262 */ |
|
2263 function setCacheHas(value) { |
|
2264 return this.__data__.has(value); |
|
2265 } |
|
2266 |
|
2267 // Add methods to `SetCache`. |
|
2268 SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; |
|
2269 SetCache.prototype.has = setCacheHas; |
|
2270 |
|
2271 /*------------------------------------------------------------------------*/ |
|
2272 |
|
2273 /** |
|
2274 * Creates a stack cache object to store key-value pairs. |
|
2275 * |
|
2276 * @private |
|
2277 * @constructor |
|
2278 * @param {Array} [entries] The key-value pairs to cache. |
|
2279 */ |
|
2280 function Stack(entries) { |
|
2281 var data = this.__data__ = new ListCache(entries); |
|
2282 this.size = data.size; |
|
2283 } |
|
2284 |
|
2285 /** |
|
2286 * Removes all key-value entries from the stack. |
|
2287 * |
|
2288 * @private |
|
2289 * @name clear |
|
2290 * @memberOf Stack |
|
2291 */ |
|
2292 function stackClear() { |
|
2293 this.__data__ = new ListCache; |
|
2294 this.size = 0; |
|
2295 } |
|
2296 |
|
2297 /** |
|
2298 * Removes `key` and its value from the stack. |
|
2299 * |
|
2300 * @private |
|
2301 * @name delete |
|
2302 * @memberOf Stack |
|
2303 * @param {string} key The key of the value to remove. |
|
2304 * @returns {boolean} Returns `true` if the entry was removed, else `false`. |
|
2305 */ |
|
2306 function stackDelete(key) { |
|
2307 var data = this.__data__, |
|
2308 result = data['delete'](key); |
|
2309 |
|
2310 this.size = data.size; |
|
2311 return result; |
|
2312 } |
|
2313 |
|
2314 /** |
|
2315 * Gets the stack value for `key`. |
|
2316 * |
|
2317 * @private |
|
2318 * @name get |
|
2319 * @memberOf Stack |
|
2320 * @param {string} key The key of the value to get. |
|
2321 * @returns {*} Returns the entry value. |
|
2322 */ |
|
2323 function stackGet(key) { |
|
2324 return this.__data__.get(key); |
|
2325 } |
|
2326 |
|
2327 /** |
|
2328 * Checks if a stack value for `key` exists. |
|
2329 * |
|
2330 * @private |
|
2331 * @name has |
|
2332 * @memberOf Stack |
|
2333 * @param {string} key The key of the entry to check. |
|
2334 * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. |
|
2335 */ |
|
2336 function stackHas(key) { |
|
2337 return this.__data__.has(key); |
|
2338 } |
|
2339 |
|
2340 /** |
|
2341 * Sets the stack `key` to `value`. |
|
2342 * |
|
2343 * @private |
|
2344 * @name set |
|
2345 * @memberOf Stack |
|
2346 * @param {string} key The key of the value to set. |
|
2347 * @param {*} value The value to set. |
|
2348 * @returns {Object} Returns the stack cache instance. |
|
2349 */ |
|
2350 function stackSet(key, value) { |
|
2351 var data = this.__data__; |
|
2352 if (data instanceof ListCache) { |
|
2353 var pairs = data.__data__; |
|
2354 if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { |
|
2355 pairs.push([key, value]); |
|
2356 this.size = ++data.size; |
|
2357 return this; |
|
2358 } |
|
2359 data = this.__data__ = new MapCache(pairs); |
|
2360 } |
|
2361 data.set(key, value); |
|
2362 this.size = data.size; |
|
2363 return this; |
|
2364 } |
|
2365 |
|
2366 // Add methods to `Stack`. |
|
2367 Stack.prototype.clear = stackClear; |
|
2368 Stack.prototype['delete'] = stackDelete; |
|
2369 Stack.prototype.get = stackGet; |
|
2370 Stack.prototype.has = stackHas; |
|
2371 Stack.prototype.set = stackSet; |
|
2372 |
|
2373 /*------------------------------------------------------------------------*/ |
|
2374 |
|
2375 /** |
|
2376 * Creates an array of the enumerable property names of the array-like `value`. |
|
2377 * |
|
2378 * @private |
|
2379 * @param {*} value The value to query. |
|
2380 * @param {boolean} inherited Specify returning inherited property names. |
|
2381 * @returns {Array} Returns the array of property names. |
|
2382 */ |
|
2383 function arrayLikeKeys(value, inherited) { |
|
2384 var isArr = isArray(value), |
|
2385 isArg = !isArr && isArguments(value), |
|
2386 isBuff = !isArr && !isArg && isBuffer(value), |
|
2387 isType = !isArr && !isArg && !isBuff && isTypedArray(value), |
|
2388 skipIndexes = isArr || isArg || isBuff || isType, |
|
2389 result = skipIndexes ? baseTimes(value.length, String) : [], |
|
2390 length = result.length; |
|
2391 |
|
2392 for (var key in value) { |
|
2393 if ((inherited || hasOwnProperty.call(value, key)) && |
|
2394 !(skipIndexes && ( |
|
2395 // Safari 9 has enumerable `arguments.length` in strict mode. |
|
2396 key == 'length' || |
|
2397 // Node.js 0.10 has enumerable non-index properties on buffers. |
|
2398 (isBuff && (key == 'offset' || key == 'parent')) || |
|
2399 // PhantomJS 2 has enumerable non-index properties on typed arrays. |
|
2400 (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || |
|
2401 // Skip index properties. |
|
2402 isIndex(key, length) |
|
2403 ))) { |
|
2404 result.push(key); |
|
2405 } |
|
2406 } |
|
2407 return result; |
|
2408 } |
|
2409 |
|
2410 /** |
|
2411 * A specialized version of `_.sample` for arrays. |
|
2412 * |
|
2413 * @private |
|
2414 * @param {Array} array The array to sample. |
|
2415 * @returns {*} Returns the random element. |
|
2416 */ |
|
2417 function arraySample(array) { |
|
2418 var length = array.length; |
|
2419 return length ? array[baseRandom(0, length - 1)] : undefined; |
|
2420 } |
|
2421 |
|
2422 /** |
|
2423 * A specialized version of `_.sampleSize` for arrays. |
|
2424 * |
|
2425 * @private |
|
2426 * @param {Array} array The array to sample. |
|
2427 * @param {number} n The number of elements to sample. |
|
2428 * @returns {Array} Returns the random elements. |
|
2429 */ |
|
2430 function arraySampleSize(array, n) { |
|
2431 return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); |
|
2432 } |
|
2433 |
|
2434 /** |
|
2435 * A specialized version of `_.shuffle` for arrays. |
|
2436 * |
|
2437 * @private |
|
2438 * @param {Array} array The array to shuffle. |
|
2439 * @returns {Array} Returns the new shuffled array. |
|
2440 */ |
|
2441 function arrayShuffle(array) { |
|
2442 return shuffleSelf(copyArray(array)); |
|
2443 } |
|
2444 |
|
2445 /** |
|
2446 * This function is like `assignValue` except that it doesn't assign |
|
2447 * `undefined` values. |
|
2448 * |
|
2449 * @private |
|
2450 * @param {Object} object The object to modify. |
|
2451 * @param {string} key The key of the property to assign. |
|
2452 * @param {*} value The value to assign. |
|
2453 */ |
|
2454 function assignMergeValue(object, key, value) { |
|
2455 if ((value !== undefined && !eq(object[key], value)) || |
|
2456 (value === undefined && !(key in object))) { |
|
2457 baseAssignValue(object, key, value); |
|
2458 } |
|
2459 } |
|
2460 |
|
2461 /** |
|
2462 * Assigns `value` to `key` of `object` if the existing value is not equivalent |
|
2463 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
2464 * for equality comparisons. |
|
2465 * |
|
2466 * @private |
|
2467 * @param {Object} object The object to modify. |
|
2468 * @param {string} key The key of the property to assign. |
|
2469 * @param {*} value The value to assign. |
|
2470 */ |
|
2471 function assignValue(object, key, value) { |
|
2472 var objValue = object[key]; |
|
2473 if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || |
|
2474 (value === undefined && !(key in object))) { |
|
2475 baseAssignValue(object, key, value); |
|
2476 } |
|
2477 } |
|
2478 |
|
2479 /** |
|
2480 * Gets the index at which the `key` is found in `array` of key-value pairs. |
|
2481 * |
|
2482 * @private |
|
2483 * @param {Array} array The array to inspect. |
|
2484 * @param {*} key The key to search for. |
|
2485 * @returns {number} Returns the index of the matched value, else `-1`. |
|
2486 */ |
|
2487 function assocIndexOf(array, key) { |
|
2488 var length = array.length; |
|
2489 while (length--) { |
|
2490 if (eq(array[length][0], key)) { |
|
2491 return length; |
|
2492 } |
|
2493 } |
|
2494 return -1; |
|
2495 } |
|
2496 |
|
2497 /** |
|
2498 * Aggregates elements of `collection` on `accumulator` with keys transformed |
|
2499 * by `iteratee` and values set by `setter`. |
|
2500 * |
|
2501 * @private |
|
2502 * @param {Array|Object} collection The collection to iterate over. |
|
2503 * @param {Function} setter The function to set `accumulator` values. |
|
2504 * @param {Function} iteratee The iteratee to transform keys. |
|
2505 * @param {Object} accumulator The initial aggregated object. |
|
2506 * @returns {Function} Returns `accumulator`. |
|
2507 */ |
|
2508 function baseAggregator(collection, setter, iteratee, accumulator) { |
|
2509 baseEach(collection, function(value, key, collection) { |
|
2510 setter(accumulator, value, iteratee(value), collection); |
|
2511 }); |
|
2512 return accumulator; |
|
2513 } |
|
2514 |
|
2515 /** |
|
2516 * The base implementation of `_.assign` without support for multiple sources |
|
2517 * or `customizer` functions. |
|
2518 * |
|
2519 * @private |
|
2520 * @param {Object} object The destination object. |
|
2521 * @param {Object} source The source object. |
|
2522 * @returns {Object} Returns `object`. |
|
2523 */ |
|
2524 function baseAssign(object, source) { |
|
2525 return object && copyObject(source, keys(source), object); |
|
2526 } |
|
2527 |
|
2528 /** |
|
2529 * The base implementation of `_.assignIn` without support for multiple sources |
|
2530 * or `customizer` functions. |
|
2531 * |
|
2532 * @private |
|
2533 * @param {Object} object The destination object. |
|
2534 * @param {Object} source The source object. |
|
2535 * @returns {Object} Returns `object`. |
|
2536 */ |
|
2537 function baseAssignIn(object, source) { |
|
2538 return object && copyObject(source, keysIn(source), object); |
|
2539 } |
|
2540 |
|
2541 /** |
|
2542 * The base implementation of `assignValue` and `assignMergeValue` without |
|
2543 * value checks. |
|
2544 * |
|
2545 * @private |
|
2546 * @param {Object} object The object to modify. |
|
2547 * @param {string} key The key of the property to assign. |
|
2548 * @param {*} value The value to assign. |
|
2549 */ |
|
2550 function baseAssignValue(object, key, value) { |
|
2551 if (key == '__proto__' && defineProperty) { |
|
2552 defineProperty(object, key, { |
|
2553 'configurable': true, |
|
2554 'enumerable': true, |
|
2555 'value': value, |
|
2556 'writable': true |
|
2557 }); |
|
2558 } else { |
|
2559 object[key] = value; |
|
2560 } |
|
2561 } |
|
2562 |
|
2563 /** |
|
2564 * The base implementation of `_.at` without support for individual paths. |
|
2565 * |
|
2566 * @private |
|
2567 * @param {Object} object The object to iterate over. |
|
2568 * @param {string[]} paths The property paths to pick. |
|
2569 * @returns {Array} Returns the picked elements. |
|
2570 */ |
|
2571 function baseAt(object, paths) { |
|
2572 var index = -1, |
|
2573 length = paths.length, |
|
2574 result = Array(length), |
|
2575 skip = object == null; |
|
2576 |
|
2577 while (++index < length) { |
|
2578 result[index] = skip ? undefined : get(object, paths[index]); |
|
2579 } |
|
2580 return result; |
|
2581 } |
|
2582 |
|
2583 /** |
|
2584 * The base implementation of `_.clamp` which doesn't coerce arguments. |
|
2585 * |
|
2586 * @private |
|
2587 * @param {number} number The number to clamp. |
|
2588 * @param {number} [lower] The lower bound. |
|
2589 * @param {number} upper The upper bound. |
|
2590 * @returns {number} Returns the clamped number. |
|
2591 */ |
|
2592 function baseClamp(number, lower, upper) { |
|
2593 if (number === number) { |
|
2594 if (upper !== undefined) { |
|
2595 number = number <= upper ? number : upper; |
|
2596 } |
|
2597 if (lower !== undefined) { |
|
2598 number = number >= lower ? number : lower; |
|
2599 } |
|
2600 } |
|
2601 return number; |
|
2602 } |
|
2603 |
|
2604 /** |
|
2605 * The base implementation of `_.clone` and `_.cloneDeep` which tracks |
|
2606 * traversed objects. |
|
2607 * |
|
2608 * @private |
|
2609 * @param {*} value The value to clone. |
|
2610 * @param {boolean} bitmask The bitmask flags. |
|
2611 * 1 - Deep clone |
|
2612 * 2 - Flatten inherited properties |
|
2613 * 4 - Clone symbols |
|
2614 * @param {Function} [customizer] The function to customize cloning. |
|
2615 * @param {string} [key] The key of `value`. |
|
2616 * @param {Object} [object] The parent object of `value`. |
|
2617 * @param {Object} [stack] Tracks traversed objects and their clone counterparts. |
|
2618 * @returns {*} Returns the cloned value. |
|
2619 */ |
|
2620 function baseClone(value, bitmask, customizer, key, object, stack) { |
|
2621 var result, |
|
2622 isDeep = bitmask & CLONE_DEEP_FLAG, |
|
2623 isFlat = bitmask & CLONE_FLAT_FLAG, |
|
2624 isFull = bitmask & CLONE_SYMBOLS_FLAG; |
|
2625 |
|
2626 if (customizer) { |
|
2627 result = object ? customizer(value, key, object, stack) : customizer(value); |
|
2628 } |
|
2629 if (result !== undefined) { |
|
2630 return result; |
|
2631 } |
|
2632 if (!isObject(value)) { |
|
2633 return value; |
|
2634 } |
|
2635 var isArr = isArray(value); |
|
2636 if (isArr) { |
|
2637 result = initCloneArray(value); |
|
2638 if (!isDeep) { |
|
2639 return copyArray(value, result); |
|
2640 } |
|
2641 } else { |
|
2642 var tag = getTag(value), |
|
2643 isFunc = tag == funcTag || tag == genTag; |
|
2644 |
|
2645 if (isBuffer(value)) { |
|
2646 return cloneBuffer(value, isDeep); |
|
2647 } |
|
2648 if (tag == objectTag || tag == argsTag || (isFunc && !object)) { |
|
2649 result = (isFlat || isFunc) ? {} : initCloneObject(value); |
|
2650 if (!isDeep) { |
|
2651 return isFlat |
|
2652 ? copySymbolsIn(value, baseAssignIn(result, value)) |
|
2653 : copySymbols(value, baseAssign(result, value)); |
|
2654 } |
|
2655 } else { |
|
2656 if (!cloneableTags[tag]) { |
|
2657 return object ? value : {}; |
|
2658 } |
|
2659 result = initCloneByTag(value, tag, isDeep); |
|
2660 } |
|
2661 } |
|
2662 // Check for circular references and return its corresponding clone. |
|
2663 stack || (stack = new Stack); |
|
2664 var stacked = stack.get(value); |
|
2665 if (stacked) { |
|
2666 return stacked; |
|
2667 } |
|
2668 stack.set(value, result); |
|
2669 |
|
2670 if (isSet(value)) { |
|
2671 value.forEach(function(subValue) { |
|
2672 result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); |
|
2673 }); |
|
2674 |
|
2675 return result; |
|
2676 } |
|
2677 |
|
2678 if (isMap(value)) { |
|
2679 value.forEach(function(subValue, key) { |
|
2680 result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
|
2681 }); |
|
2682 |
|
2683 return result; |
|
2684 } |
|
2685 |
|
2686 var keysFunc = isFull |
|
2687 ? (isFlat ? getAllKeysIn : getAllKeys) |
|
2688 : (isFlat ? keysIn : keys); |
|
2689 |
|
2690 var props = isArr ? undefined : keysFunc(value); |
|
2691 arrayEach(props || value, function(subValue, key) { |
|
2692 if (props) { |
|
2693 key = subValue; |
|
2694 subValue = value[key]; |
|
2695 } |
|
2696 // Recursively populate clone (susceptible to call stack limits). |
|
2697 assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); |
|
2698 }); |
|
2699 return result; |
|
2700 } |
|
2701 |
|
2702 /** |
|
2703 * The base implementation of `_.conforms` which doesn't clone `source`. |
|
2704 * |
|
2705 * @private |
|
2706 * @param {Object} source The object of property predicates to conform to. |
|
2707 * @returns {Function} Returns the new spec function. |
|
2708 */ |
|
2709 function baseConforms(source) { |
|
2710 var props = keys(source); |
|
2711 return function(object) { |
|
2712 return baseConformsTo(object, source, props); |
|
2713 }; |
|
2714 } |
|
2715 |
|
2716 /** |
|
2717 * The base implementation of `_.conformsTo` which accepts `props` to check. |
|
2718 * |
|
2719 * @private |
|
2720 * @param {Object} object The object to inspect. |
|
2721 * @param {Object} source The object of property predicates to conform to. |
|
2722 * @returns {boolean} Returns `true` if `object` conforms, else `false`. |
|
2723 */ |
|
2724 function baseConformsTo(object, source, props) { |
|
2725 var length = props.length; |
|
2726 if (object == null) { |
|
2727 return !length; |
|
2728 } |
|
2729 object = Object(object); |
|
2730 while (length--) { |
|
2731 var key = props[length], |
|
2732 predicate = source[key], |
|
2733 value = object[key]; |
|
2734 |
|
2735 if ((value === undefined && !(key in object)) || !predicate(value)) { |
|
2736 return false; |
|
2737 } |
|
2738 } |
|
2739 return true; |
|
2740 } |
|
2741 |
|
2742 /** |
|
2743 * The base implementation of `_.delay` and `_.defer` which accepts `args` |
|
2744 * to provide to `func`. |
|
2745 * |
|
2746 * @private |
|
2747 * @param {Function} func The function to delay. |
|
2748 * @param {number} wait The number of milliseconds to delay invocation. |
|
2749 * @param {Array} args The arguments to provide to `func`. |
|
2750 * @returns {number|Object} Returns the timer id or timeout object. |
|
2751 */ |
|
2752 function baseDelay(func, wait, args) { |
|
2753 if (typeof func != 'function') { |
|
2754 throw new TypeError(FUNC_ERROR_TEXT); |
|
2755 } |
|
2756 return setTimeout(function() { func.apply(undefined, args); }, wait); |
|
2757 } |
|
2758 |
|
2759 /** |
|
2760 * The base implementation of methods like `_.difference` without support |
|
2761 * for excluding multiple arrays or iteratee shorthands. |
|
2762 * |
|
2763 * @private |
|
2764 * @param {Array} array The array to inspect. |
|
2765 * @param {Array} values The values to exclude. |
|
2766 * @param {Function} [iteratee] The iteratee invoked per element. |
|
2767 * @param {Function} [comparator] The comparator invoked per element. |
|
2768 * @returns {Array} Returns the new array of filtered values. |
|
2769 */ |
|
2770 function baseDifference(array, values, iteratee, comparator) { |
|
2771 var index = -1, |
|
2772 includes = arrayIncludes, |
|
2773 isCommon = true, |
|
2774 length = array.length, |
|
2775 result = [], |
|
2776 valuesLength = values.length; |
|
2777 |
|
2778 if (!length) { |
|
2779 return result; |
|
2780 } |
|
2781 if (iteratee) { |
|
2782 values = arrayMap(values, baseUnary(iteratee)); |
|
2783 } |
|
2784 if (comparator) { |
|
2785 includes = arrayIncludesWith; |
|
2786 isCommon = false; |
|
2787 } |
|
2788 else if (values.length >= LARGE_ARRAY_SIZE) { |
|
2789 includes = cacheHas; |
|
2790 isCommon = false; |
|
2791 values = new SetCache(values); |
|
2792 } |
|
2793 outer: |
|
2794 while (++index < length) { |
|
2795 var value = array[index], |
|
2796 computed = iteratee == null ? value : iteratee(value); |
|
2797 |
|
2798 value = (comparator || value !== 0) ? value : 0; |
|
2799 if (isCommon && computed === computed) { |
|
2800 var valuesIndex = valuesLength; |
|
2801 while (valuesIndex--) { |
|
2802 if (values[valuesIndex] === computed) { |
|
2803 continue outer; |
|
2804 } |
|
2805 } |
|
2806 result.push(value); |
|
2807 } |
|
2808 else if (!includes(values, computed, comparator)) { |
|
2809 result.push(value); |
|
2810 } |
|
2811 } |
|
2812 return result; |
|
2813 } |
|
2814 |
|
2815 /** |
|
2816 * The base implementation of `_.forEach` without support for iteratee shorthands. |
|
2817 * |
|
2818 * @private |
|
2819 * @param {Array|Object} collection The collection to iterate over. |
|
2820 * @param {Function} iteratee The function invoked per iteration. |
|
2821 * @returns {Array|Object} Returns `collection`. |
|
2822 */ |
|
2823 var baseEach = createBaseEach(baseForOwn); |
|
2824 |
|
2825 /** |
|
2826 * The base implementation of `_.forEachRight` without support for iteratee shorthands. |
|
2827 * |
|
2828 * @private |
|
2829 * @param {Array|Object} collection The collection to iterate over. |
|
2830 * @param {Function} iteratee The function invoked per iteration. |
|
2831 * @returns {Array|Object} Returns `collection`. |
|
2832 */ |
|
2833 var baseEachRight = createBaseEach(baseForOwnRight, true); |
|
2834 |
|
2835 /** |
|
2836 * The base implementation of `_.every` without support for iteratee shorthands. |
|
2837 * |
|
2838 * @private |
|
2839 * @param {Array|Object} collection The collection to iterate over. |
|
2840 * @param {Function} predicate The function invoked per iteration. |
|
2841 * @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
2842 * else `false` |
|
2843 */ |
|
2844 function baseEvery(collection, predicate) { |
|
2845 var result = true; |
|
2846 baseEach(collection, function(value, index, collection) { |
|
2847 result = !!predicate(value, index, collection); |
|
2848 return result; |
|
2849 }); |
|
2850 return result; |
|
2851 } |
|
2852 |
|
2853 /** |
|
2854 * The base implementation of methods like `_.max` and `_.min` which accepts a |
|
2855 * `comparator` to determine the extremum value. |
|
2856 * |
|
2857 * @private |
|
2858 * @param {Array} array The array to iterate over. |
|
2859 * @param {Function} iteratee The iteratee invoked per iteration. |
|
2860 * @param {Function} comparator The comparator used to compare values. |
|
2861 * @returns {*} Returns the extremum value. |
|
2862 */ |
|
2863 function baseExtremum(array, iteratee, comparator) { |
|
2864 var index = -1, |
|
2865 length = array.length; |
|
2866 |
|
2867 while (++index < length) { |
|
2868 var value = array[index], |
|
2869 current = iteratee(value); |
|
2870 |
|
2871 if (current != null && (computed === undefined |
|
2872 ? (current === current && !isSymbol(current)) |
|
2873 : comparator(current, computed) |
|
2874 )) { |
|
2875 var computed = current, |
|
2876 result = value; |
|
2877 } |
|
2878 } |
|
2879 return result; |
|
2880 } |
|
2881 |
|
2882 /** |
|
2883 * The base implementation of `_.fill` without an iteratee call guard. |
|
2884 * |
|
2885 * @private |
|
2886 * @param {Array} array The array to fill. |
|
2887 * @param {*} value The value to fill `array` with. |
|
2888 * @param {number} [start=0] The start position. |
|
2889 * @param {number} [end=array.length] The end position. |
|
2890 * @returns {Array} Returns `array`. |
|
2891 */ |
|
2892 function baseFill(array, value, start, end) { |
|
2893 var length = array.length; |
|
2894 |
|
2895 start = toInteger(start); |
|
2896 if (start < 0) { |
|
2897 start = -start > length ? 0 : (length + start); |
|
2898 } |
|
2899 end = (end === undefined || end > length) ? length : toInteger(end); |
|
2900 if (end < 0) { |
|
2901 end += length; |
|
2902 } |
|
2903 end = start > end ? 0 : toLength(end); |
|
2904 while (start < end) { |
|
2905 array[start++] = value; |
|
2906 } |
|
2907 return array; |
|
2908 } |
|
2909 |
|
2910 /** |
|
2911 * The base implementation of `_.filter` without support for iteratee shorthands. |
|
2912 * |
|
2913 * @private |
|
2914 * @param {Array|Object} collection The collection to iterate over. |
|
2915 * @param {Function} predicate The function invoked per iteration. |
|
2916 * @returns {Array} Returns the new filtered array. |
|
2917 */ |
|
2918 function baseFilter(collection, predicate) { |
|
2919 var result = []; |
|
2920 baseEach(collection, function(value, index, collection) { |
|
2921 if (predicate(value, index, collection)) { |
|
2922 result.push(value); |
|
2923 } |
|
2924 }); |
|
2925 return result; |
|
2926 } |
|
2927 |
|
2928 /** |
|
2929 * The base implementation of `_.flatten` with support for restricting flattening. |
|
2930 * |
|
2931 * @private |
|
2932 * @param {Array} array The array to flatten. |
|
2933 * @param {number} depth The maximum recursion depth. |
|
2934 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. |
|
2935 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. |
|
2936 * @param {Array} [result=[]] The initial result value. |
|
2937 * @returns {Array} Returns the new flattened array. |
|
2938 */ |
|
2939 function baseFlatten(array, depth, predicate, isStrict, result) { |
|
2940 var index = -1, |
|
2941 length = array.length; |
|
2942 |
|
2943 predicate || (predicate = isFlattenable); |
|
2944 result || (result = []); |
|
2945 |
|
2946 while (++index < length) { |
|
2947 var value = array[index]; |
|
2948 if (depth > 0 && predicate(value)) { |
|
2949 if (depth > 1) { |
|
2950 // Recursively flatten arrays (susceptible to call stack limits). |
|
2951 baseFlatten(value, depth - 1, predicate, isStrict, result); |
|
2952 } else { |
|
2953 arrayPush(result, value); |
|
2954 } |
|
2955 } else if (!isStrict) { |
|
2956 result[result.length] = value; |
|
2957 } |
|
2958 } |
|
2959 return result; |
|
2960 } |
|
2961 |
|
2962 /** |
|
2963 * The base implementation of `baseForOwn` which iterates over `object` |
|
2964 * properties returned by `keysFunc` and invokes `iteratee` for each property. |
|
2965 * Iteratee functions may exit iteration early by explicitly returning `false`. |
|
2966 * |
|
2967 * @private |
|
2968 * @param {Object} object The object to iterate over. |
|
2969 * @param {Function} iteratee The function invoked per iteration. |
|
2970 * @param {Function} keysFunc The function to get the keys of `object`. |
|
2971 * @returns {Object} Returns `object`. |
|
2972 */ |
|
2973 var baseFor = createBaseFor(); |
|
2974 |
|
2975 /** |
|
2976 * This function is like `baseFor` except that it iterates over properties |
|
2977 * in the opposite order. |
|
2978 * |
|
2979 * @private |
|
2980 * @param {Object} object The object to iterate over. |
|
2981 * @param {Function} iteratee The function invoked per iteration. |
|
2982 * @param {Function} keysFunc The function to get the keys of `object`. |
|
2983 * @returns {Object} Returns `object`. |
|
2984 */ |
|
2985 var baseForRight = createBaseFor(true); |
|
2986 |
|
2987 /** |
|
2988 * The base implementation of `_.forOwn` without support for iteratee shorthands. |
|
2989 * |
|
2990 * @private |
|
2991 * @param {Object} object The object to iterate over. |
|
2992 * @param {Function} iteratee The function invoked per iteration. |
|
2993 * @returns {Object} Returns `object`. |
|
2994 */ |
|
2995 function baseForOwn(object, iteratee) { |
|
2996 return object && baseFor(object, iteratee, keys); |
|
2997 } |
|
2998 |
|
2999 /** |
|
3000 * The base implementation of `_.forOwnRight` without support for iteratee shorthands. |
|
3001 * |
|
3002 * @private |
|
3003 * @param {Object} object The object to iterate over. |
|
3004 * @param {Function} iteratee The function invoked per iteration. |
|
3005 * @returns {Object} Returns `object`. |
|
3006 */ |
|
3007 function baseForOwnRight(object, iteratee) { |
|
3008 return object && baseForRight(object, iteratee, keys); |
|
3009 } |
|
3010 |
|
3011 /** |
|
3012 * The base implementation of `_.functions` which creates an array of |
|
3013 * `object` function property names filtered from `props`. |
|
3014 * |
|
3015 * @private |
|
3016 * @param {Object} object The object to inspect. |
|
3017 * @param {Array} props The property names to filter. |
|
3018 * @returns {Array} Returns the function names. |
|
3019 */ |
|
3020 function baseFunctions(object, props) { |
|
3021 return arrayFilter(props, function(key) { |
|
3022 return isFunction(object[key]); |
|
3023 }); |
|
3024 } |
|
3025 |
|
3026 /** |
|
3027 * The base implementation of `_.get` without support for default values. |
|
3028 * |
|
3029 * @private |
|
3030 * @param {Object} object The object to query. |
|
3031 * @param {Array|string} path The path of the property to get. |
|
3032 * @returns {*} Returns the resolved value. |
|
3033 */ |
|
3034 function baseGet(object, path) { |
|
3035 path = castPath(path, object); |
|
3036 |
|
3037 var index = 0, |
|
3038 length = path.length; |
|
3039 |
|
3040 while (object != null && index < length) { |
|
3041 object = object[toKey(path[index++])]; |
|
3042 } |
|
3043 return (index && index == length) ? object : undefined; |
|
3044 } |
|
3045 |
|
3046 /** |
|
3047 * The base implementation of `getAllKeys` and `getAllKeysIn` which uses |
|
3048 * `keysFunc` and `symbolsFunc` to get the enumerable property names and |
|
3049 * symbols of `object`. |
|
3050 * |
|
3051 * @private |
|
3052 * @param {Object} object The object to query. |
|
3053 * @param {Function} keysFunc The function to get the keys of `object`. |
|
3054 * @param {Function} symbolsFunc The function to get the symbols of `object`. |
|
3055 * @returns {Array} Returns the array of property names and symbols. |
|
3056 */ |
|
3057 function baseGetAllKeys(object, keysFunc, symbolsFunc) { |
|
3058 var result = keysFunc(object); |
|
3059 return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); |
|
3060 } |
|
3061 |
|
3062 /** |
|
3063 * The base implementation of `getTag` without fallbacks for buggy environments. |
|
3064 * |
|
3065 * @private |
|
3066 * @param {*} value The value to query. |
|
3067 * @returns {string} Returns the `toStringTag`. |
|
3068 */ |
|
3069 function baseGetTag(value) { |
|
3070 if (value == null) { |
|
3071 return value === undefined ? undefinedTag : nullTag; |
|
3072 } |
|
3073 return (symToStringTag && symToStringTag in Object(value)) |
|
3074 ? getRawTag(value) |
|
3075 : objectToString(value); |
|
3076 } |
|
3077 |
|
3078 /** |
|
3079 * The base implementation of `_.gt` which doesn't coerce arguments. |
|
3080 * |
|
3081 * @private |
|
3082 * @param {*} value The value to compare. |
|
3083 * @param {*} other The other value to compare. |
|
3084 * @returns {boolean} Returns `true` if `value` is greater than `other`, |
|
3085 * else `false`. |
|
3086 */ |
|
3087 function baseGt(value, other) { |
|
3088 return value > other; |
|
3089 } |
|
3090 |
|
3091 /** |
|
3092 * The base implementation of `_.has` without support for deep paths. |
|
3093 * |
|
3094 * @private |
|
3095 * @param {Object} [object] The object to query. |
|
3096 * @param {Array|string} key The key to check. |
|
3097 * @returns {boolean} Returns `true` if `key` exists, else `false`. |
|
3098 */ |
|
3099 function baseHas(object, key) { |
|
3100 return object != null && hasOwnProperty.call(object, key); |
|
3101 } |
|
3102 |
|
3103 /** |
|
3104 * The base implementation of `_.hasIn` without support for deep paths. |
|
3105 * |
|
3106 * @private |
|
3107 * @param {Object} [object] The object to query. |
|
3108 * @param {Array|string} key The key to check. |
|
3109 * @returns {boolean} Returns `true` if `key` exists, else `false`. |
|
3110 */ |
|
3111 function baseHasIn(object, key) { |
|
3112 return object != null && key in Object(object); |
|
3113 } |
|
3114 |
|
3115 /** |
|
3116 * The base implementation of `_.inRange` which doesn't coerce arguments. |
|
3117 * |
|
3118 * @private |
|
3119 * @param {number} number The number to check. |
|
3120 * @param {number} start The start of the range. |
|
3121 * @param {number} end The end of the range. |
|
3122 * @returns {boolean} Returns `true` if `number` is in the range, else `false`. |
|
3123 */ |
|
3124 function baseInRange(number, start, end) { |
|
3125 return number >= nativeMin(start, end) && number < nativeMax(start, end); |
|
3126 } |
|
3127 |
|
3128 /** |
|
3129 * The base implementation of methods like `_.intersection`, without support |
|
3130 * for iteratee shorthands, that accepts an array of arrays to inspect. |
|
3131 * |
|
3132 * @private |
|
3133 * @param {Array} arrays The arrays to inspect. |
|
3134 * @param {Function} [iteratee] The iteratee invoked per element. |
|
3135 * @param {Function} [comparator] The comparator invoked per element. |
|
3136 * @returns {Array} Returns the new array of shared values. |
|
3137 */ |
|
3138 function baseIntersection(arrays, iteratee, comparator) { |
|
3139 var includes = comparator ? arrayIncludesWith : arrayIncludes, |
|
3140 length = arrays[0].length, |
|
3141 othLength = arrays.length, |
|
3142 othIndex = othLength, |
|
3143 caches = Array(othLength), |
|
3144 maxLength = Infinity, |
|
3145 result = []; |
|
3146 |
|
3147 while (othIndex--) { |
|
3148 var array = arrays[othIndex]; |
|
3149 if (othIndex && iteratee) { |
|
3150 array = arrayMap(array, baseUnary(iteratee)); |
|
3151 } |
|
3152 maxLength = nativeMin(array.length, maxLength); |
|
3153 caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) |
|
3154 ? new SetCache(othIndex && array) |
|
3155 : undefined; |
|
3156 } |
|
3157 array = arrays[0]; |
|
3158 |
|
3159 var index = -1, |
|
3160 seen = caches[0]; |
|
3161 |
|
3162 outer: |
|
3163 while (++index < length && result.length < maxLength) { |
|
3164 var value = array[index], |
|
3165 computed = iteratee ? iteratee(value) : value; |
|
3166 |
|
3167 value = (comparator || value !== 0) ? value : 0; |
|
3168 if (!(seen |
|
3169 ? cacheHas(seen, computed) |
|
3170 : includes(result, computed, comparator) |
|
3171 )) { |
|
3172 othIndex = othLength; |
|
3173 while (--othIndex) { |
|
3174 var cache = caches[othIndex]; |
|
3175 if (!(cache |
|
3176 ? cacheHas(cache, computed) |
|
3177 : includes(arrays[othIndex], computed, comparator)) |
|
3178 ) { |
|
3179 continue outer; |
|
3180 } |
|
3181 } |
|
3182 if (seen) { |
|
3183 seen.push(computed); |
|
3184 } |
|
3185 result.push(value); |
|
3186 } |
|
3187 } |
|
3188 return result; |
|
3189 } |
|
3190 |
|
3191 /** |
|
3192 * The base implementation of `_.invert` and `_.invertBy` which inverts |
|
3193 * `object` with values transformed by `iteratee` and set by `setter`. |
|
3194 * |
|
3195 * @private |
|
3196 * @param {Object} object The object to iterate over. |
|
3197 * @param {Function} setter The function to set `accumulator` values. |
|
3198 * @param {Function} iteratee The iteratee to transform values. |
|
3199 * @param {Object} accumulator The initial inverted object. |
|
3200 * @returns {Function} Returns `accumulator`. |
|
3201 */ |
|
3202 function baseInverter(object, setter, iteratee, accumulator) { |
|
3203 baseForOwn(object, function(value, key, object) { |
|
3204 setter(accumulator, iteratee(value), key, object); |
|
3205 }); |
|
3206 return accumulator; |
|
3207 } |
|
3208 |
|
3209 /** |
|
3210 * The base implementation of `_.invoke` without support for individual |
|
3211 * method arguments. |
|
3212 * |
|
3213 * @private |
|
3214 * @param {Object} object The object to query. |
|
3215 * @param {Array|string} path The path of the method to invoke. |
|
3216 * @param {Array} args The arguments to invoke the method with. |
|
3217 * @returns {*} Returns the result of the invoked method. |
|
3218 */ |
|
3219 function baseInvoke(object, path, args) { |
|
3220 path = castPath(path, object); |
|
3221 object = parent(object, path); |
|
3222 var func = object == null ? object : object[toKey(last(path))]; |
|
3223 return func == null ? undefined : apply(func, object, args); |
|
3224 } |
|
3225 |
|
3226 /** |
|
3227 * The base implementation of `_.isArguments`. |
|
3228 * |
|
3229 * @private |
|
3230 * @param {*} value The value to check. |
|
3231 * @returns {boolean} Returns `true` if `value` is an `arguments` object, |
|
3232 */ |
|
3233 function baseIsArguments(value) { |
|
3234 return isObjectLike(value) && baseGetTag(value) == argsTag; |
|
3235 } |
|
3236 |
|
3237 /** |
|
3238 * The base implementation of `_.isArrayBuffer` without Node.js optimizations. |
|
3239 * |
|
3240 * @private |
|
3241 * @param {*} value The value to check. |
|
3242 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. |
|
3243 */ |
|
3244 function baseIsArrayBuffer(value) { |
|
3245 return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; |
|
3246 } |
|
3247 |
|
3248 /** |
|
3249 * The base implementation of `_.isDate` without Node.js optimizations. |
|
3250 * |
|
3251 * @private |
|
3252 * @param {*} value The value to check. |
|
3253 * @returns {boolean} Returns `true` if `value` is a date object, else `false`. |
|
3254 */ |
|
3255 function baseIsDate(value) { |
|
3256 return isObjectLike(value) && baseGetTag(value) == dateTag; |
|
3257 } |
|
3258 |
|
3259 /** |
|
3260 * The base implementation of `_.isEqual` which supports partial comparisons |
|
3261 * and tracks traversed objects. |
|
3262 * |
|
3263 * @private |
|
3264 * @param {*} value The value to compare. |
|
3265 * @param {*} other The other value to compare. |
|
3266 * @param {boolean} bitmask The bitmask flags. |
|
3267 * 1 - Unordered comparison |
|
3268 * 2 - Partial comparison |
|
3269 * @param {Function} [customizer] The function to customize comparisons. |
|
3270 * @param {Object} [stack] Tracks traversed `value` and `other` objects. |
|
3271 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
|
3272 */ |
|
3273 function baseIsEqual(value, other, bitmask, customizer, stack) { |
|
3274 if (value === other) { |
|
3275 return true; |
|
3276 } |
|
3277 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { |
|
3278 return value !== value && other !== other; |
|
3279 } |
|
3280 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); |
|
3281 } |
|
3282 |
|
3283 /** |
|
3284 * A specialized version of `baseIsEqual` for arrays and objects which performs |
|
3285 * deep comparisons and tracks traversed objects enabling objects with circular |
|
3286 * references to be compared. |
|
3287 * |
|
3288 * @private |
|
3289 * @param {Object} object The object to compare. |
|
3290 * @param {Object} other The other object to compare. |
|
3291 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
|
3292 * @param {Function} customizer The function to customize comparisons. |
|
3293 * @param {Function} equalFunc The function to determine equivalents of values. |
|
3294 * @param {Object} [stack] Tracks traversed `object` and `other` objects. |
|
3295 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
3296 */ |
|
3297 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { |
|
3298 var objIsArr = isArray(object), |
|
3299 othIsArr = isArray(other), |
|
3300 objTag = objIsArr ? arrayTag : getTag(object), |
|
3301 othTag = othIsArr ? arrayTag : getTag(other); |
|
3302 |
|
3303 objTag = objTag == argsTag ? objectTag : objTag; |
|
3304 othTag = othTag == argsTag ? objectTag : othTag; |
|
3305 |
|
3306 var objIsObj = objTag == objectTag, |
|
3307 othIsObj = othTag == objectTag, |
|
3308 isSameTag = objTag == othTag; |
|
3309 |
|
3310 if (isSameTag && isBuffer(object)) { |
|
3311 if (!isBuffer(other)) { |
|
3312 return false; |
|
3313 } |
|
3314 objIsArr = true; |
|
3315 objIsObj = false; |
|
3316 } |
|
3317 if (isSameTag && !objIsObj) { |
|
3318 stack || (stack = new Stack); |
|
3319 return (objIsArr || isTypedArray(object)) |
|
3320 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) |
|
3321 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); |
|
3322 } |
|
3323 if (!(bitmask & COMPARE_PARTIAL_FLAG)) { |
|
3324 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), |
|
3325 othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); |
|
3326 |
|
3327 if (objIsWrapped || othIsWrapped) { |
|
3328 var objUnwrapped = objIsWrapped ? object.value() : object, |
|
3329 othUnwrapped = othIsWrapped ? other.value() : other; |
|
3330 |
|
3331 stack || (stack = new Stack); |
|
3332 return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); |
|
3333 } |
|
3334 } |
|
3335 if (!isSameTag) { |
|
3336 return false; |
|
3337 } |
|
3338 stack || (stack = new Stack); |
|
3339 return equalObjects(object, other, bitmask, customizer, equalFunc, stack); |
|
3340 } |
|
3341 |
|
3342 /** |
|
3343 * The base implementation of `_.isMap` without Node.js optimizations. |
|
3344 * |
|
3345 * @private |
|
3346 * @param {*} value The value to check. |
|
3347 * @returns {boolean} Returns `true` if `value` is a map, else `false`. |
|
3348 */ |
|
3349 function baseIsMap(value) { |
|
3350 return isObjectLike(value) && getTag(value) == mapTag; |
|
3351 } |
|
3352 |
|
3353 /** |
|
3354 * The base implementation of `_.isMatch` without support for iteratee shorthands. |
|
3355 * |
|
3356 * @private |
|
3357 * @param {Object} object The object to inspect. |
|
3358 * @param {Object} source The object of property values to match. |
|
3359 * @param {Array} matchData The property names, values, and compare flags to match. |
|
3360 * @param {Function} [customizer] The function to customize comparisons. |
|
3361 * @returns {boolean} Returns `true` if `object` is a match, else `false`. |
|
3362 */ |
|
3363 function baseIsMatch(object, source, matchData, customizer) { |
|
3364 var index = matchData.length, |
|
3365 length = index, |
|
3366 noCustomizer = !customizer; |
|
3367 |
|
3368 if (object == null) { |
|
3369 return !length; |
|
3370 } |
|
3371 object = Object(object); |
|
3372 while (index--) { |
|
3373 var data = matchData[index]; |
|
3374 if ((noCustomizer && data[2]) |
|
3375 ? data[1] !== object[data[0]] |
|
3376 : !(data[0] in object) |
|
3377 ) { |
|
3378 return false; |
|
3379 } |
|
3380 } |
|
3381 while (++index < length) { |
|
3382 data = matchData[index]; |
|
3383 var key = data[0], |
|
3384 objValue = object[key], |
|
3385 srcValue = data[1]; |
|
3386 |
|
3387 if (noCustomizer && data[2]) { |
|
3388 if (objValue === undefined && !(key in object)) { |
|
3389 return false; |
|
3390 } |
|
3391 } else { |
|
3392 var stack = new Stack; |
|
3393 if (customizer) { |
|
3394 var result = customizer(objValue, srcValue, key, object, source, stack); |
|
3395 } |
|
3396 if (!(result === undefined |
|
3397 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) |
|
3398 : result |
|
3399 )) { |
|
3400 return false; |
|
3401 } |
|
3402 } |
|
3403 } |
|
3404 return true; |
|
3405 } |
|
3406 |
|
3407 /** |
|
3408 * The base implementation of `_.isNative` without bad shim checks. |
|
3409 * |
|
3410 * @private |
|
3411 * @param {*} value The value to check. |
|
3412 * @returns {boolean} Returns `true` if `value` is a native function, |
|
3413 * else `false`. |
|
3414 */ |
|
3415 function baseIsNative(value) { |
|
3416 if (!isObject(value) || isMasked(value)) { |
|
3417 return false; |
|
3418 } |
|
3419 var pattern = isFunction(value) ? reIsNative : reIsHostCtor; |
|
3420 return pattern.test(toSource(value)); |
|
3421 } |
|
3422 |
|
3423 /** |
|
3424 * The base implementation of `_.isRegExp` without Node.js optimizations. |
|
3425 * |
|
3426 * @private |
|
3427 * @param {*} value The value to check. |
|
3428 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. |
|
3429 */ |
|
3430 function baseIsRegExp(value) { |
|
3431 return isObjectLike(value) && baseGetTag(value) == regexpTag; |
|
3432 } |
|
3433 |
|
3434 /** |
|
3435 * The base implementation of `_.isSet` without Node.js optimizations. |
|
3436 * |
|
3437 * @private |
|
3438 * @param {*} value The value to check. |
|
3439 * @returns {boolean} Returns `true` if `value` is a set, else `false`. |
|
3440 */ |
|
3441 function baseIsSet(value) { |
|
3442 return isObjectLike(value) && getTag(value) == setTag; |
|
3443 } |
|
3444 |
|
3445 /** |
|
3446 * The base implementation of `_.isTypedArray` without Node.js optimizations. |
|
3447 * |
|
3448 * @private |
|
3449 * @param {*} value The value to check. |
|
3450 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. |
|
3451 */ |
|
3452 function baseIsTypedArray(value) { |
|
3453 return isObjectLike(value) && |
|
3454 isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; |
|
3455 } |
|
3456 |
|
3457 /** |
|
3458 * The base implementation of `_.iteratee`. |
|
3459 * |
|
3460 * @private |
|
3461 * @param {*} [value=_.identity] The value to convert to an iteratee. |
|
3462 * @returns {Function} Returns the iteratee. |
|
3463 */ |
|
3464 function baseIteratee(value) { |
|
3465 // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. |
|
3466 // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. |
|
3467 if (typeof value == 'function') { |
|
3468 return value; |
|
3469 } |
|
3470 if (value == null) { |
|
3471 return identity; |
|
3472 } |
|
3473 if (typeof value == 'object') { |
|
3474 return isArray(value) |
|
3475 ? baseMatchesProperty(value[0], value[1]) |
|
3476 : baseMatches(value); |
|
3477 } |
|
3478 return property(value); |
|
3479 } |
|
3480 |
|
3481 /** |
|
3482 * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. |
|
3483 * |
|
3484 * @private |
|
3485 * @param {Object} object The object to query. |
|
3486 * @returns {Array} Returns the array of property names. |
|
3487 */ |
|
3488 function baseKeys(object) { |
|
3489 if (!isPrototype(object)) { |
|
3490 return nativeKeys(object); |
|
3491 } |
|
3492 var result = []; |
|
3493 for (var key in Object(object)) { |
|
3494 if (hasOwnProperty.call(object, key) && key != 'constructor') { |
|
3495 result.push(key); |
|
3496 } |
|
3497 } |
|
3498 return result; |
|
3499 } |
|
3500 |
|
3501 /** |
|
3502 * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. |
|
3503 * |
|
3504 * @private |
|
3505 * @param {Object} object The object to query. |
|
3506 * @returns {Array} Returns the array of property names. |
|
3507 */ |
|
3508 function baseKeysIn(object) { |
|
3509 if (!isObject(object)) { |
|
3510 return nativeKeysIn(object); |
|
3511 } |
|
3512 var isProto = isPrototype(object), |
|
3513 result = []; |
|
3514 |
|
3515 for (var key in object) { |
|
3516 if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { |
|
3517 result.push(key); |
|
3518 } |
|
3519 } |
|
3520 return result; |
|
3521 } |
|
3522 |
|
3523 /** |
|
3524 * The base implementation of `_.lt` which doesn't coerce arguments. |
|
3525 * |
|
3526 * @private |
|
3527 * @param {*} value The value to compare. |
|
3528 * @param {*} other The other value to compare. |
|
3529 * @returns {boolean} Returns `true` if `value` is less than `other`, |
|
3530 * else `false`. |
|
3531 */ |
|
3532 function baseLt(value, other) { |
|
3533 return value < other; |
|
3534 } |
|
3535 |
|
3536 /** |
|
3537 * The base implementation of `_.map` without support for iteratee shorthands. |
|
3538 * |
|
3539 * @private |
|
3540 * @param {Array|Object} collection The collection to iterate over. |
|
3541 * @param {Function} iteratee The function invoked per iteration. |
|
3542 * @returns {Array} Returns the new mapped array. |
|
3543 */ |
|
3544 function baseMap(collection, iteratee) { |
|
3545 var index = -1, |
|
3546 result = isArrayLike(collection) ? Array(collection.length) : []; |
|
3547 |
|
3548 baseEach(collection, function(value, key, collection) { |
|
3549 result[++index] = iteratee(value, key, collection); |
|
3550 }); |
|
3551 return result; |
|
3552 } |
|
3553 |
|
3554 /** |
|
3555 * The base implementation of `_.matches` which doesn't clone `source`. |
|
3556 * |
|
3557 * @private |
|
3558 * @param {Object} source The object of property values to match. |
|
3559 * @returns {Function} Returns the new spec function. |
|
3560 */ |
|
3561 function baseMatches(source) { |
|
3562 var matchData = getMatchData(source); |
|
3563 if (matchData.length == 1 && matchData[0][2]) { |
|
3564 return matchesStrictComparable(matchData[0][0], matchData[0][1]); |
|
3565 } |
|
3566 return function(object) { |
|
3567 return object === source || baseIsMatch(object, source, matchData); |
|
3568 }; |
|
3569 } |
|
3570 |
|
3571 /** |
|
3572 * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. |
|
3573 * |
|
3574 * @private |
|
3575 * @param {string} path The path of the property to get. |
|
3576 * @param {*} srcValue The value to match. |
|
3577 * @returns {Function} Returns the new spec function. |
|
3578 */ |
|
3579 function baseMatchesProperty(path, srcValue) { |
|
3580 if (isKey(path) && isStrictComparable(srcValue)) { |
|
3581 return matchesStrictComparable(toKey(path), srcValue); |
|
3582 } |
|
3583 return function(object) { |
|
3584 var objValue = get(object, path); |
|
3585 return (objValue === undefined && objValue === srcValue) |
|
3586 ? hasIn(object, path) |
|
3587 : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); |
|
3588 }; |
|
3589 } |
|
3590 |
|
3591 /** |
|
3592 * The base implementation of `_.merge` without support for multiple sources. |
|
3593 * |
|
3594 * @private |
|
3595 * @param {Object} object The destination object. |
|
3596 * @param {Object} source The source object. |
|
3597 * @param {number} srcIndex The index of `source`. |
|
3598 * @param {Function} [customizer] The function to customize merged values. |
|
3599 * @param {Object} [stack] Tracks traversed source values and their merged |
|
3600 * counterparts. |
|
3601 */ |
|
3602 function baseMerge(object, source, srcIndex, customizer, stack) { |
|
3603 if (object === source) { |
|
3604 return; |
|
3605 } |
|
3606 baseFor(source, function(srcValue, key) { |
|
3607 if (isObject(srcValue)) { |
|
3608 stack || (stack = new Stack); |
|
3609 baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); |
|
3610 } |
|
3611 else { |
|
3612 var newValue = customizer |
|
3613 ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) |
|
3614 : undefined; |
|
3615 |
|
3616 if (newValue === undefined) { |
|
3617 newValue = srcValue; |
|
3618 } |
|
3619 assignMergeValue(object, key, newValue); |
|
3620 } |
|
3621 }, keysIn); |
|
3622 } |
|
3623 |
|
3624 /** |
|
3625 * A specialized version of `baseMerge` for arrays and objects which performs |
|
3626 * deep merges and tracks traversed objects enabling objects with circular |
|
3627 * references to be merged. |
|
3628 * |
|
3629 * @private |
|
3630 * @param {Object} object The destination object. |
|
3631 * @param {Object} source The source object. |
|
3632 * @param {string} key The key of the value to merge. |
|
3633 * @param {number} srcIndex The index of `source`. |
|
3634 * @param {Function} mergeFunc The function to merge values. |
|
3635 * @param {Function} [customizer] The function to customize assigned values. |
|
3636 * @param {Object} [stack] Tracks traversed source values and their merged |
|
3637 * counterparts. |
|
3638 */ |
|
3639 function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { |
|
3640 var objValue = safeGet(object, key), |
|
3641 srcValue = safeGet(source, key), |
|
3642 stacked = stack.get(srcValue); |
|
3643 |
|
3644 if (stacked) { |
|
3645 assignMergeValue(object, key, stacked); |
|
3646 return; |
|
3647 } |
|
3648 var newValue = customizer |
|
3649 ? customizer(objValue, srcValue, (key + ''), object, source, stack) |
|
3650 : undefined; |
|
3651 |
|
3652 var isCommon = newValue === undefined; |
|
3653 |
|
3654 if (isCommon) { |
|
3655 var isArr = isArray(srcValue), |
|
3656 isBuff = !isArr && isBuffer(srcValue), |
|
3657 isTyped = !isArr && !isBuff && isTypedArray(srcValue); |
|
3658 |
|
3659 newValue = srcValue; |
|
3660 if (isArr || isBuff || isTyped) { |
|
3661 if (isArray(objValue)) { |
|
3662 newValue = objValue; |
|
3663 } |
|
3664 else if (isArrayLikeObject(objValue)) { |
|
3665 newValue = copyArray(objValue); |
|
3666 } |
|
3667 else if (isBuff) { |
|
3668 isCommon = false; |
|
3669 newValue = cloneBuffer(srcValue, true); |
|
3670 } |
|
3671 else if (isTyped) { |
|
3672 isCommon = false; |
|
3673 newValue = cloneTypedArray(srcValue, true); |
|
3674 } |
|
3675 else { |
|
3676 newValue = []; |
|
3677 } |
|
3678 } |
|
3679 else if (isPlainObject(srcValue) || isArguments(srcValue)) { |
|
3680 newValue = objValue; |
|
3681 if (isArguments(objValue)) { |
|
3682 newValue = toPlainObject(objValue); |
|
3683 } |
|
3684 else if (!isObject(objValue) || isFunction(objValue)) { |
|
3685 newValue = initCloneObject(srcValue); |
|
3686 } |
|
3687 } |
|
3688 else { |
|
3689 isCommon = false; |
|
3690 } |
|
3691 } |
|
3692 if (isCommon) { |
|
3693 // Recursively merge objects and arrays (susceptible to call stack limits). |
|
3694 stack.set(srcValue, newValue); |
|
3695 mergeFunc(newValue, srcValue, srcIndex, customizer, stack); |
|
3696 stack['delete'](srcValue); |
|
3697 } |
|
3698 assignMergeValue(object, key, newValue); |
|
3699 } |
|
3700 |
|
3701 /** |
|
3702 * The base implementation of `_.nth` which doesn't coerce arguments. |
|
3703 * |
|
3704 * @private |
|
3705 * @param {Array} array The array to query. |
|
3706 * @param {number} n The index of the element to return. |
|
3707 * @returns {*} Returns the nth element of `array`. |
|
3708 */ |
|
3709 function baseNth(array, n) { |
|
3710 var length = array.length; |
|
3711 if (!length) { |
|
3712 return; |
|
3713 } |
|
3714 n += n < 0 ? length : 0; |
|
3715 return isIndex(n, length) ? array[n] : undefined; |
|
3716 } |
|
3717 |
|
3718 /** |
|
3719 * The base implementation of `_.orderBy` without param guards. |
|
3720 * |
|
3721 * @private |
|
3722 * @param {Array|Object} collection The collection to iterate over. |
|
3723 * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. |
|
3724 * @param {string[]} orders The sort orders of `iteratees`. |
|
3725 * @returns {Array} Returns the new sorted array. |
|
3726 */ |
|
3727 function baseOrderBy(collection, iteratees, orders) { |
|
3728 var index = -1; |
|
3729 iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee())); |
|
3730 |
|
3731 var result = baseMap(collection, function(value, key, collection) { |
|
3732 var criteria = arrayMap(iteratees, function(iteratee) { |
|
3733 return iteratee(value); |
|
3734 }); |
|
3735 return { 'criteria': criteria, 'index': ++index, 'value': value }; |
|
3736 }); |
|
3737 |
|
3738 return baseSortBy(result, function(object, other) { |
|
3739 return compareMultiple(object, other, orders); |
|
3740 }); |
|
3741 } |
|
3742 |
|
3743 /** |
|
3744 * The base implementation of `_.pick` without support for individual |
|
3745 * property identifiers. |
|
3746 * |
|
3747 * @private |
|
3748 * @param {Object} object The source object. |
|
3749 * @param {string[]} paths The property paths to pick. |
|
3750 * @returns {Object} Returns the new object. |
|
3751 */ |
|
3752 function basePick(object, paths) { |
|
3753 return basePickBy(object, paths, function(value, path) { |
|
3754 return hasIn(object, path); |
|
3755 }); |
|
3756 } |
|
3757 |
|
3758 /** |
|
3759 * The base implementation of `_.pickBy` without support for iteratee shorthands. |
|
3760 * |
|
3761 * @private |
|
3762 * @param {Object} object The source object. |
|
3763 * @param {string[]} paths The property paths to pick. |
|
3764 * @param {Function} predicate The function invoked per property. |
|
3765 * @returns {Object} Returns the new object. |
|
3766 */ |
|
3767 function basePickBy(object, paths, predicate) { |
|
3768 var index = -1, |
|
3769 length = paths.length, |
|
3770 result = {}; |
|
3771 |
|
3772 while (++index < length) { |
|
3773 var path = paths[index], |
|
3774 value = baseGet(object, path); |
|
3775 |
|
3776 if (predicate(value, path)) { |
|
3777 baseSet(result, castPath(path, object), value); |
|
3778 } |
|
3779 } |
|
3780 return result; |
|
3781 } |
|
3782 |
|
3783 /** |
|
3784 * A specialized version of `baseProperty` which supports deep paths. |
|
3785 * |
|
3786 * @private |
|
3787 * @param {Array|string} path The path of the property to get. |
|
3788 * @returns {Function} Returns the new accessor function. |
|
3789 */ |
|
3790 function basePropertyDeep(path) { |
|
3791 return function(object) { |
|
3792 return baseGet(object, path); |
|
3793 }; |
|
3794 } |
|
3795 |
|
3796 /** |
|
3797 * The base implementation of `_.pullAllBy` without support for iteratee |
|
3798 * shorthands. |
|
3799 * |
|
3800 * @private |
|
3801 * @param {Array} array The array to modify. |
|
3802 * @param {Array} values The values to remove. |
|
3803 * @param {Function} [iteratee] The iteratee invoked per element. |
|
3804 * @param {Function} [comparator] The comparator invoked per element. |
|
3805 * @returns {Array} Returns `array`. |
|
3806 */ |
|
3807 function basePullAll(array, values, iteratee, comparator) { |
|
3808 var indexOf = comparator ? baseIndexOfWith : baseIndexOf, |
|
3809 index = -1, |
|
3810 length = values.length, |
|
3811 seen = array; |
|
3812 |
|
3813 if (array === values) { |
|
3814 values = copyArray(values); |
|
3815 } |
|
3816 if (iteratee) { |
|
3817 seen = arrayMap(array, baseUnary(iteratee)); |
|
3818 } |
|
3819 while (++index < length) { |
|
3820 var fromIndex = 0, |
|
3821 value = values[index], |
|
3822 computed = iteratee ? iteratee(value) : value; |
|
3823 |
|
3824 while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { |
|
3825 if (seen !== array) { |
|
3826 splice.call(seen, fromIndex, 1); |
|
3827 } |
|
3828 splice.call(array, fromIndex, 1); |
|
3829 } |
|
3830 } |
|
3831 return array; |
|
3832 } |
|
3833 |
|
3834 /** |
|
3835 * The base implementation of `_.pullAt` without support for individual |
|
3836 * indexes or capturing the removed elements. |
|
3837 * |
|
3838 * @private |
|
3839 * @param {Array} array The array to modify. |
|
3840 * @param {number[]} indexes The indexes of elements to remove. |
|
3841 * @returns {Array} Returns `array`. |
|
3842 */ |
|
3843 function basePullAt(array, indexes) { |
|
3844 var length = array ? indexes.length : 0, |
|
3845 lastIndex = length - 1; |
|
3846 |
|
3847 while (length--) { |
|
3848 var index = indexes[length]; |
|
3849 if (length == lastIndex || index !== previous) { |
|
3850 var previous = index; |
|
3851 if (isIndex(index)) { |
|
3852 splice.call(array, index, 1); |
|
3853 } else { |
|
3854 baseUnset(array, index); |
|
3855 } |
|
3856 } |
|
3857 } |
|
3858 return array; |
|
3859 } |
|
3860 |
|
3861 /** |
|
3862 * The base implementation of `_.random` without support for returning |
|
3863 * floating-point numbers. |
|
3864 * |
|
3865 * @private |
|
3866 * @param {number} lower The lower bound. |
|
3867 * @param {number} upper The upper bound. |
|
3868 * @returns {number} Returns the random number. |
|
3869 */ |
|
3870 function baseRandom(lower, upper) { |
|
3871 return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); |
|
3872 } |
|
3873 |
|
3874 /** |
|
3875 * The base implementation of `_.range` and `_.rangeRight` which doesn't |
|
3876 * coerce arguments. |
|
3877 * |
|
3878 * @private |
|
3879 * @param {number} start The start of the range. |
|
3880 * @param {number} end The end of the range. |
|
3881 * @param {number} step The value to increment or decrement by. |
|
3882 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
3883 * @returns {Array} Returns the range of numbers. |
|
3884 */ |
|
3885 function baseRange(start, end, step, fromRight) { |
|
3886 var index = -1, |
|
3887 length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), |
|
3888 result = Array(length); |
|
3889 |
|
3890 while (length--) { |
|
3891 result[fromRight ? length : ++index] = start; |
|
3892 start += step; |
|
3893 } |
|
3894 return result; |
|
3895 } |
|
3896 |
|
3897 /** |
|
3898 * The base implementation of `_.repeat` which doesn't coerce arguments. |
|
3899 * |
|
3900 * @private |
|
3901 * @param {string} string The string to repeat. |
|
3902 * @param {number} n The number of times to repeat the string. |
|
3903 * @returns {string} Returns the repeated string. |
|
3904 */ |
|
3905 function baseRepeat(string, n) { |
|
3906 var result = ''; |
|
3907 if (!string || n < 1 || n > MAX_SAFE_INTEGER) { |
|
3908 return result; |
|
3909 } |
|
3910 // Leverage the exponentiation by squaring algorithm for a faster repeat. |
|
3911 // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. |
|
3912 do { |
|
3913 if (n % 2) { |
|
3914 result += string; |
|
3915 } |
|
3916 n = nativeFloor(n / 2); |
|
3917 if (n) { |
|
3918 string += string; |
|
3919 } |
|
3920 } while (n); |
|
3921 |
|
3922 return result; |
|
3923 } |
|
3924 |
|
3925 /** |
|
3926 * The base implementation of `_.rest` which doesn't validate or coerce arguments. |
|
3927 * |
|
3928 * @private |
|
3929 * @param {Function} func The function to apply a rest parameter to. |
|
3930 * @param {number} [start=func.length-1] The start position of the rest parameter. |
|
3931 * @returns {Function} Returns the new function. |
|
3932 */ |
|
3933 function baseRest(func, start) { |
|
3934 return setToString(overRest(func, start, identity), func + ''); |
|
3935 } |
|
3936 |
|
3937 /** |
|
3938 * The base implementation of `_.sample`. |
|
3939 * |
|
3940 * @private |
|
3941 * @param {Array|Object} collection The collection to sample. |
|
3942 * @returns {*} Returns the random element. |
|
3943 */ |
|
3944 function baseSample(collection) { |
|
3945 return arraySample(values(collection)); |
|
3946 } |
|
3947 |
|
3948 /** |
|
3949 * The base implementation of `_.sampleSize` without param guards. |
|
3950 * |
|
3951 * @private |
|
3952 * @param {Array|Object} collection The collection to sample. |
|
3953 * @param {number} n The number of elements to sample. |
|
3954 * @returns {Array} Returns the random elements. |
|
3955 */ |
|
3956 function baseSampleSize(collection, n) { |
|
3957 var array = values(collection); |
|
3958 return shuffleSelf(array, baseClamp(n, 0, array.length)); |
|
3959 } |
|
3960 |
|
3961 /** |
|
3962 * The base implementation of `_.set`. |
|
3963 * |
|
3964 * @private |
|
3965 * @param {Object} object The object to modify. |
|
3966 * @param {Array|string} path The path of the property to set. |
|
3967 * @param {*} value The value to set. |
|
3968 * @param {Function} [customizer] The function to customize path creation. |
|
3969 * @returns {Object} Returns `object`. |
|
3970 */ |
|
3971 function baseSet(object, path, value, customizer) { |
|
3972 if (!isObject(object)) { |
|
3973 return object; |
|
3974 } |
|
3975 path = castPath(path, object); |
|
3976 |
|
3977 var index = -1, |
|
3978 length = path.length, |
|
3979 lastIndex = length - 1, |
|
3980 nested = object; |
|
3981 |
|
3982 while (nested != null && ++index < length) { |
|
3983 var key = toKey(path[index]), |
|
3984 newValue = value; |
|
3985 |
|
3986 if (index != lastIndex) { |
|
3987 var objValue = nested[key]; |
|
3988 newValue = customizer ? customizer(objValue, key, nested) : undefined; |
|
3989 if (newValue === undefined) { |
|
3990 newValue = isObject(objValue) |
|
3991 ? objValue |
|
3992 : (isIndex(path[index + 1]) ? [] : {}); |
|
3993 } |
|
3994 } |
|
3995 assignValue(nested, key, newValue); |
|
3996 nested = nested[key]; |
|
3997 } |
|
3998 return object; |
|
3999 } |
|
4000 |
|
4001 /** |
|
4002 * The base implementation of `setData` without support for hot loop shorting. |
|
4003 * |
|
4004 * @private |
|
4005 * @param {Function} func The function to associate metadata with. |
|
4006 * @param {*} data The metadata. |
|
4007 * @returns {Function} Returns `func`. |
|
4008 */ |
|
4009 var baseSetData = !metaMap ? identity : function(func, data) { |
|
4010 metaMap.set(func, data); |
|
4011 return func; |
|
4012 }; |
|
4013 |
|
4014 /** |
|
4015 * The base implementation of `setToString` without support for hot loop shorting. |
|
4016 * |
|
4017 * @private |
|
4018 * @param {Function} func The function to modify. |
|
4019 * @param {Function} string The `toString` result. |
|
4020 * @returns {Function} Returns `func`. |
|
4021 */ |
|
4022 var baseSetToString = !defineProperty ? identity : function(func, string) { |
|
4023 return defineProperty(func, 'toString', { |
|
4024 'configurable': true, |
|
4025 'enumerable': false, |
|
4026 'value': constant(string), |
|
4027 'writable': true |
|
4028 }); |
|
4029 }; |
|
4030 |
|
4031 /** |
|
4032 * The base implementation of `_.shuffle`. |
|
4033 * |
|
4034 * @private |
|
4035 * @param {Array|Object} collection The collection to shuffle. |
|
4036 * @returns {Array} Returns the new shuffled array. |
|
4037 */ |
|
4038 function baseShuffle(collection) { |
|
4039 return shuffleSelf(values(collection)); |
|
4040 } |
|
4041 |
|
4042 /** |
|
4043 * The base implementation of `_.slice` without an iteratee call guard. |
|
4044 * |
|
4045 * @private |
|
4046 * @param {Array} array The array to slice. |
|
4047 * @param {number} [start=0] The start position. |
|
4048 * @param {number} [end=array.length] The end position. |
|
4049 * @returns {Array} Returns the slice of `array`. |
|
4050 */ |
|
4051 function baseSlice(array, start, end) { |
|
4052 var index = -1, |
|
4053 length = array.length; |
|
4054 |
|
4055 if (start < 0) { |
|
4056 start = -start > length ? 0 : (length + start); |
|
4057 } |
|
4058 end = end > length ? length : end; |
|
4059 if (end < 0) { |
|
4060 end += length; |
|
4061 } |
|
4062 length = start > end ? 0 : ((end - start) >>> 0); |
|
4063 start >>>= 0; |
|
4064 |
|
4065 var result = Array(length); |
|
4066 while (++index < length) { |
|
4067 result[index] = array[index + start]; |
|
4068 } |
|
4069 return result; |
|
4070 } |
|
4071 |
|
4072 /** |
|
4073 * The base implementation of `_.some` without support for iteratee shorthands. |
|
4074 * |
|
4075 * @private |
|
4076 * @param {Array|Object} collection The collection to iterate over. |
|
4077 * @param {Function} predicate The function invoked per iteration. |
|
4078 * @returns {boolean} Returns `true` if any element passes the predicate check, |
|
4079 * else `false`. |
|
4080 */ |
|
4081 function baseSome(collection, predicate) { |
|
4082 var result; |
|
4083 |
|
4084 baseEach(collection, function(value, index, collection) { |
|
4085 result = predicate(value, index, collection); |
|
4086 return !result; |
|
4087 }); |
|
4088 return !!result; |
|
4089 } |
|
4090 |
|
4091 /** |
|
4092 * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which |
|
4093 * performs a binary search of `array` to determine the index at which `value` |
|
4094 * should be inserted into `array` in order to maintain its sort order. |
|
4095 * |
|
4096 * @private |
|
4097 * @param {Array} array The sorted array to inspect. |
|
4098 * @param {*} value The value to evaluate. |
|
4099 * @param {boolean} [retHighest] Specify returning the highest qualified index. |
|
4100 * @returns {number} Returns the index at which `value` should be inserted |
|
4101 * into `array`. |
|
4102 */ |
|
4103 function baseSortedIndex(array, value, retHighest) { |
|
4104 var low = 0, |
|
4105 high = array == null ? low : array.length; |
|
4106 |
|
4107 if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { |
|
4108 while (low < high) { |
|
4109 var mid = (low + high) >>> 1, |
|
4110 computed = array[mid]; |
|
4111 |
|
4112 if (computed !== null && !isSymbol(computed) && |
|
4113 (retHighest ? (computed <= value) : (computed < value))) { |
|
4114 low = mid + 1; |
|
4115 } else { |
|
4116 high = mid; |
|
4117 } |
|
4118 } |
|
4119 return high; |
|
4120 } |
|
4121 return baseSortedIndexBy(array, value, identity, retHighest); |
|
4122 } |
|
4123 |
|
4124 /** |
|
4125 * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` |
|
4126 * which invokes `iteratee` for `value` and each element of `array` to compute |
|
4127 * their sort ranking. The iteratee is invoked with one argument; (value). |
|
4128 * |
|
4129 * @private |
|
4130 * @param {Array} array The sorted array to inspect. |
|
4131 * @param {*} value The value to evaluate. |
|
4132 * @param {Function} iteratee The iteratee invoked per element. |
|
4133 * @param {boolean} [retHighest] Specify returning the highest qualified index. |
|
4134 * @returns {number} Returns the index at which `value` should be inserted |
|
4135 * into `array`. |
|
4136 */ |
|
4137 function baseSortedIndexBy(array, value, iteratee, retHighest) { |
|
4138 value = iteratee(value); |
|
4139 |
|
4140 var low = 0, |
|
4141 high = array == null ? 0 : array.length, |
|
4142 valIsNaN = value !== value, |
|
4143 valIsNull = value === null, |
|
4144 valIsSymbol = isSymbol(value), |
|
4145 valIsUndefined = value === undefined; |
|
4146 |
|
4147 while (low < high) { |
|
4148 var mid = nativeFloor((low + high) / 2), |
|
4149 computed = iteratee(array[mid]), |
|
4150 othIsDefined = computed !== undefined, |
|
4151 othIsNull = computed === null, |
|
4152 othIsReflexive = computed === computed, |
|
4153 othIsSymbol = isSymbol(computed); |
|
4154 |
|
4155 if (valIsNaN) { |
|
4156 var setLow = retHighest || othIsReflexive; |
|
4157 } else if (valIsUndefined) { |
|
4158 setLow = othIsReflexive && (retHighest || othIsDefined); |
|
4159 } else if (valIsNull) { |
|
4160 setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); |
|
4161 } else if (valIsSymbol) { |
|
4162 setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); |
|
4163 } else if (othIsNull || othIsSymbol) { |
|
4164 setLow = false; |
|
4165 } else { |
|
4166 setLow = retHighest ? (computed <= value) : (computed < value); |
|
4167 } |
|
4168 if (setLow) { |
|
4169 low = mid + 1; |
|
4170 } else { |
|
4171 high = mid; |
|
4172 } |
|
4173 } |
|
4174 return nativeMin(high, MAX_ARRAY_INDEX); |
|
4175 } |
|
4176 |
|
4177 /** |
|
4178 * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without |
|
4179 * support for iteratee shorthands. |
|
4180 * |
|
4181 * @private |
|
4182 * @param {Array} array The array to inspect. |
|
4183 * @param {Function} [iteratee] The iteratee invoked per element. |
|
4184 * @returns {Array} Returns the new duplicate free array. |
|
4185 */ |
|
4186 function baseSortedUniq(array, iteratee) { |
|
4187 var index = -1, |
|
4188 length = array.length, |
|
4189 resIndex = 0, |
|
4190 result = []; |
|
4191 |
|
4192 while (++index < length) { |
|
4193 var value = array[index], |
|
4194 computed = iteratee ? iteratee(value) : value; |
|
4195 |
|
4196 if (!index || !eq(computed, seen)) { |
|
4197 var seen = computed; |
|
4198 result[resIndex++] = value === 0 ? 0 : value; |
|
4199 } |
|
4200 } |
|
4201 return result; |
|
4202 } |
|
4203 |
|
4204 /** |
|
4205 * The base implementation of `_.toNumber` which doesn't ensure correct |
|
4206 * conversions of binary, hexadecimal, or octal string values. |
|
4207 * |
|
4208 * @private |
|
4209 * @param {*} value The value to process. |
|
4210 * @returns {number} Returns the number. |
|
4211 */ |
|
4212 function baseToNumber(value) { |
|
4213 if (typeof value == 'number') { |
|
4214 return value; |
|
4215 } |
|
4216 if (isSymbol(value)) { |
|
4217 return NAN; |
|
4218 } |
|
4219 return +value; |
|
4220 } |
|
4221 |
|
4222 /** |
|
4223 * The base implementation of `_.toString` which doesn't convert nullish |
|
4224 * values to empty strings. |
|
4225 * |
|
4226 * @private |
|
4227 * @param {*} value The value to process. |
|
4228 * @returns {string} Returns the string. |
|
4229 */ |
|
4230 function baseToString(value) { |
|
4231 // Exit early for strings to avoid a performance hit in some environments. |
|
4232 if (typeof value == 'string') { |
|
4233 return value; |
|
4234 } |
|
4235 if (isArray(value)) { |
|
4236 // Recursively convert values (susceptible to call stack limits). |
|
4237 return arrayMap(value, baseToString) + ''; |
|
4238 } |
|
4239 if (isSymbol(value)) { |
|
4240 return symbolToString ? symbolToString.call(value) : ''; |
|
4241 } |
|
4242 var result = (value + ''); |
|
4243 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; |
|
4244 } |
|
4245 |
|
4246 /** |
|
4247 * The base implementation of `_.uniqBy` without support for iteratee shorthands. |
|
4248 * |
|
4249 * @private |
|
4250 * @param {Array} array The array to inspect. |
|
4251 * @param {Function} [iteratee] The iteratee invoked per element. |
|
4252 * @param {Function} [comparator] The comparator invoked per element. |
|
4253 * @returns {Array} Returns the new duplicate free array. |
|
4254 */ |
|
4255 function baseUniq(array, iteratee, comparator) { |
|
4256 var index = -1, |
|
4257 includes = arrayIncludes, |
|
4258 length = array.length, |
|
4259 isCommon = true, |
|
4260 result = [], |
|
4261 seen = result; |
|
4262 |
|
4263 if (comparator) { |
|
4264 isCommon = false; |
|
4265 includes = arrayIncludesWith; |
|
4266 } |
|
4267 else if (length >= LARGE_ARRAY_SIZE) { |
|
4268 var set = iteratee ? null : createSet(array); |
|
4269 if (set) { |
|
4270 return setToArray(set); |
|
4271 } |
|
4272 isCommon = false; |
|
4273 includes = cacheHas; |
|
4274 seen = new SetCache; |
|
4275 } |
|
4276 else { |
|
4277 seen = iteratee ? [] : result; |
|
4278 } |
|
4279 outer: |
|
4280 while (++index < length) { |
|
4281 var value = array[index], |
|
4282 computed = iteratee ? iteratee(value) : value; |
|
4283 |
|
4284 value = (comparator || value !== 0) ? value : 0; |
|
4285 if (isCommon && computed === computed) { |
|
4286 var seenIndex = seen.length; |
|
4287 while (seenIndex--) { |
|
4288 if (seen[seenIndex] === computed) { |
|
4289 continue outer; |
|
4290 } |
|
4291 } |
|
4292 if (iteratee) { |
|
4293 seen.push(computed); |
|
4294 } |
|
4295 result.push(value); |
|
4296 } |
|
4297 else if (!includes(seen, computed, comparator)) { |
|
4298 if (seen !== result) { |
|
4299 seen.push(computed); |
|
4300 } |
|
4301 result.push(value); |
|
4302 } |
|
4303 } |
|
4304 return result; |
|
4305 } |
|
4306 |
|
4307 /** |
|
4308 * The base implementation of `_.unset`. |
|
4309 * |
|
4310 * @private |
|
4311 * @param {Object} object The object to modify. |
|
4312 * @param {Array|string} path The property path to unset. |
|
4313 * @returns {boolean} Returns `true` if the property is deleted, else `false`. |
|
4314 */ |
|
4315 function baseUnset(object, path) { |
|
4316 path = castPath(path, object); |
|
4317 object = parent(object, path); |
|
4318 return object == null || delete object[toKey(last(path))]; |
|
4319 } |
|
4320 |
|
4321 /** |
|
4322 * The base implementation of `_.update`. |
|
4323 * |
|
4324 * @private |
|
4325 * @param {Object} object The object to modify. |
|
4326 * @param {Array|string} path The path of the property to update. |
|
4327 * @param {Function} updater The function to produce the updated value. |
|
4328 * @param {Function} [customizer] The function to customize path creation. |
|
4329 * @returns {Object} Returns `object`. |
|
4330 */ |
|
4331 function baseUpdate(object, path, updater, customizer) { |
|
4332 return baseSet(object, path, updater(baseGet(object, path)), customizer); |
|
4333 } |
|
4334 |
|
4335 /** |
|
4336 * The base implementation of methods like `_.dropWhile` and `_.takeWhile` |
|
4337 * without support for iteratee shorthands. |
|
4338 * |
|
4339 * @private |
|
4340 * @param {Array} array The array to query. |
|
4341 * @param {Function} predicate The function invoked per iteration. |
|
4342 * @param {boolean} [isDrop] Specify dropping elements instead of taking them. |
|
4343 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
4344 * @returns {Array} Returns the slice of `array`. |
|
4345 */ |
|
4346 function baseWhile(array, predicate, isDrop, fromRight) { |
|
4347 var length = array.length, |
|
4348 index = fromRight ? length : -1; |
|
4349 |
|
4350 while ((fromRight ? index-- : ++index < length) && |
|
4351 predicate(array[index], index, array)) {} |
|
4352 |
|
4353 return isDrop |
|
4354 ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) |
|
4355 : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); |
|
4356 } |
|
4357 |
|
4358 /** |
|
4359 * The base implementation of `wrapperValue` which returns the result of |
|
4360 * performing a sequence of actions on the unwrapped `value`, where each |
|
4361 * successive action is supplied the return value of the previous. |
|
4362 * |
|
4363 * @private |
|
4364 * @param {*} value The unwrapped value. |
|
4365 * @param {Array} actions Actions to perform to resolve the unwrapped value. |
|
4366 * @returns {*} Returns the resolved value. |
|
4367 */ |
|
4368 function baseWrapperValue(value, actions) { |
|
4369 var result = value; |
|
4370 if (result instanceof LazyWrapper) { |
|
4371 result = result.value(); |
|
4372 } |
|
4373 return arrayReduce(actions, function(result, action) { |
|
4374 return action.func.apply(action.thisArg, arrayPush([result], action.args)); |
|
4375 }, result); |
|
4376 } |
|
4377 |
|
4378 /** |
|
4379 * The base implementation of methods like `_.xor`, without support for |
|
4380 * iteratee shorthands, that accepts an array of arrays to inspect. |
|
4381 * |
|
4382 * @private |
|
4383 * @param {Array} arrays The arrays to inspect. |
|
4384 * @param {Function} [iteratee] The iteratee invoked per element. |
|
4385 * @param {Function} [comparator] The comparator invoked per element. |
|
4386 * @returns {Array} Returns the new array of values. |
|
4387 */ |
|
4388 function baseXor(arrays, iteratee, comparator) { |
|
4389 var length = arrays.length; |
|
4390 if (length < 2) { |
|
4391 return length ? baseUniq(arrays[0]) : []; |
|
4392 } |
|
4393 var index = -1, |
|
4394 result = Array(length); |
|
4395 |
|
4396 while (++index < length) { |
|
4397 var array = arrays[index], |
|
4398 othIndex = -1; |
|
4399 |
|
4400 while (++othIndex < length) { |
|
4401 if (othIndex != index) { |
|
4402 result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); |
|
4403 } |
|
4404 } |
|
4405 } |
|
4406 return baseUniq(baseFlatten(result, 1), iteratee, comparator); |
|
4407 } |
|
4408 |
|
4409 /** |
|
4410 * This base implementation of `_.zipObject` which assigns values using `assignFunc`. |
|
4411 * |
|
4412 * @private |
|
4413 * @param {Array} props The property identifiers. |
|
4414 * @param {Array} values The property values. |
|
4415 * @param {Function} assignFunc The function to assign values. |
|
4416 * @returns {Object} Returns the new object. |
|
4417 */ |
|
4418 function baseZipObject(props, values, assignFunc) { |
|
4419 var index = -1, |
|
4420 length = props.length, |
|
4421 valsLength = values.length, |
|
4422 result = {}; |
|
4423 |
|
4424 while (++index < length) { |
|
4425 var value = index < valsLength ? values[index] : undefined; |
|
4426 assignFunc(result, props[index], value); |
|
4427 } |
|
4428 return result; |
|
4429 } |
|
4430 |
|
4431 /** |
|
4432 * Casts `value` to an empty array if it's not an array like object. |
|
4433 * |
|
4434 * @private |
|
4435 * @param {*} value The value to inspect. |
|
4436 * @returns {Array|Object} Returns the cast array-like object. |
|
4437 */ |
|
4438 function castArrayLikeObject(value) { |
|
4439 return isArrayLikeObject(value) ? value : []; |
|
4440 } |
|
4441 |
|
4442 /** |
|
4443 * Casts `value` to `identity` if it's not a function. |
|
4444 * |
|
4445 * @private |
|
4446 * @param {*} value The value to inspect. |
|
4447 * @returns {Function} Returns cast function. |
|
4448 */ |
|
4449 function castFunction(value) { |
|
4450 return typeof value == 'function' ? value : identity; |
|
4451 } |
|
4452 |
|
4453 /** |
|
4454 * Casts `value` to a path array if it's not one. |
|
4455 * |
|
4456 * @private |
|
4457 * @param {*} value The value to inspect. |
|
4458 * @param {Object} [object] The object to query keys on. |
|
4459 * @returns {Array} Returns the cast property path array. |
|
4460 */ |
|
4461 function castPath(value, object) { |
|
4462 if (isArray(value)) { |
|
4463 return value; |
|
4464 } |
|
4465 return isKey(value, object) ? [value] : stringToPath(toString(value)); |
|
4466 } |
|
4467 |
|
4468 /** |
|
4469 * A `baseRest` alias which can be replaced with `identity` by module |
|
4470 * replacement plugins. |
|
4471 * |
|
4472 * @private |
|
4473 * @type {Function} |
|
4474 * @param {Function} func The function to apply a rest parameter to. |
|
4475 * @returns {Function} Returns the new function. |
|
4476 */ |
|
4477 var castRest = baseRest; |
|
4478 |
|
4479 /** |
|
4480 * Casts `array` to a slice if it's needed. |
|
4481 * |
|
4482 * @private |
|
4483 * @param {Array} array The array to inspect. |
|
4484 * @param {number} start The start position. |
|
4485 * @param {number} [end=array.length] The end position. |
|
4486 * @returns {Array} Returns the cast slice. |
|
4487 */ |
|
4488 function castSlice(array, start, end) { |
|
4489 var length = array.length; |
|
4490 end = end === undefined ? length : end; |
|
4491 return (!start && end >= length) ? array : baseSlice(array, start, end); |
|
4492 } |
|
4493 |
|
4494 /** |
|
4495 * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). |
|
4496 * |
|
4497 * @private |
|
4498 * @param {number|Object} id The timer id or timeout object of the timer to clear. |
|
4499 */ |
|
4500 var clearTimeout = ctxClearTimeout || function(id) { |
|
4501 return root.clearTimeout(id); |
|
4502 }; |
|
4503 |
|
4504 /** |
|
4505 * Creates a clone of `buffer`. |
|
4506 * |
|
4507 * @private |
|
4508 * @param {Buffer} buffer The buffer to clone. |
|
4509 * @param {boolean} [isDeep] Specify a deep clone. |
|
4510 * @returns {Buffer} Returns the cloned buffer. |
|
4511 */ |
|
4512 function cloneBuffer(buffer, isDeep) { |
|
4513 if (isDeep) { |
|
4514 return buffer.slice(); |
|
4515 } |
|
4516 var length = buffer.length, |
|
4517 result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); |
|
4518 |
|
4519 buffer.copy(result); |
|
4520 return result; |
|
4521 } |
|
4522 |
|
4523 /** |
|
4524 * Creates a clone of `arrayBuffer`. |
|
4525 * |
|
4526 * @private |
|
4527 * @param {ArrayBuffer} arrayBuffer The array buffer to clone. |
|
4528 * @returns {ArrayBuffer} Returns the cloned array buffer. |
|
4529 */ |
|
4530 function cloneArrayBuffer(arrayBuffer) { |
|
4531 var result = new arrayBuffer.constructor(arrayBuffer.byteLength); |
|
4532 new Uint8Array(result).set(new Uint8Array(arrayBuffer)); |
|
4533 return result; |
|
4534 } |
|
4535 |
|
4536 /** |
|
4537 * Creates a clone of `dataView`. |
|
4538 * |
|
4539 * @private |
|
4540 * @param {Object} dataView The data view to clone. |
|
4541 * @param {boolean} [isDeep] Specify a deep clone. |
|
4542 * @returns {Object} Returns the cloned data view. |
|
4543 */ |
|
4544 function cloneDataView(dataView, isDeep) { |
|
4545 var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; |
|
4546 return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); |
|
4547 } |
|
4548 |
|
4549 /** |
|
4550 * Creates a clone of `regexp`. |
|
4551 * |
|
4552 * @private |
|
4553 * @param {Object} regexp The regexp to clone. |
|
4554 * @returns {Object} Returns the cloned regexp. |
|
4555 */ |
|
4556 function cloneRegExp(regexp) { |
|
4557 var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); |
|
4558 result.lastIndex = regexp.lastIndex; |
|
4559 return result; |
|
4560 } |
|
4561 |
|
4562 /** |
|
4563 * Creates a clone of the `symbol` object. |
|
4564 * |
|
4565 * @private |
|
4566 * @param {Object} symbol The symbol object to clone. |
|
4567 * @returns {Object} Returns the cloned symbol object. |
|
4568 */ |
|
4569 function cloneSymbol(symbol) { |
|
4570 return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; |
|
4571 } |
|
4572 |
|
4573 /** |
|
4574 * Creates a clone of `typedArray`. |
|
4575 * |
|
4576 * @private |
|
4577 * @param {Object} typedArray The typed array to clone. |
|
4578 * @param {boolean} [isDeep] Specify a deep clone. |
|
4579 * @returns {Object} Returns the cloned typed array. |
|
4580 */ |
|
4581 function cloneTypedArray(typedArray, isDeep) { |
|
4582 var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; |
|
4583 return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); |
|
4584 } |
|
4585 |
|
4586 /** |
|
4587 * Compares values to sort them in ascending order. |
|
4588 * |
|
4589 * @private |
|
4590 * @param {*} value The value to compare. |
|
4591 * @param {*} other The other value to compare. |
|
4592 * @returns {number} Returns the sort order indicator for `value`. |
|
4593 */ |
|
4594 function compareAscending(value, other) { |
|
4595 if (value !== other) { |
|
4596 var valIsDefined = value !== undefined, |
|
4597 valIsNull = value === null, |
|
4598 valIsReflexive = value === value, |
|
4599 valIsSymbol = isSymbol(value); |
|
4600 |
|
4601 var othIsDefined = other !== undefined, |
|
4602 othIsNull = other === null, |
|
4603 othIsReflexive = other === other, |
|
4604 othIsSymbol = isSymbol(other); |
|
4605 |
|
4606 if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || |
|
4607 (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || |
|
4608 (valIsNull && othIsDefined && othIsReflexive) || |
|
4609 (!valIsDefined && othIsReflexive) || |
|
4610 !valIsReflexive) { |
|
4611 return 1; |
|
4612 } |
|
4613 if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || |
|
4614 (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || |
|
4615 (othIsNull && valIsDefined && valIsReflexive) || |
|
4616 (!othIsDefined && valIsReflexive) || |
|
4617 !othIsReflexive) { |
|
4618 return -1; |
|
4619 } |
|
4620 } |
|
4621 return 0; |
|
4622 } |
|
4623 |
|
4624 /** |
|
4625 * Used by `_.orderBy` to compare multiple properties of a value to another |
|
4626 * and stable sort them. |
|
4627 * |
|
4628 * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, |
|
4629 * specify an order of "desc" for descending or "asc" for ascending sort order |
|
4630 * of corresponding values. |
|
4631 * |
|
4632 * @private |
|
4633 * @param {Object} object The object to compare. |
|
4634 * @param {Object} other The other object to compare. |
|
4635 * @param {boolean[]|string[]} orders The order to sort by for each property. |
|
4636 * @returns {number} Returns the sort order indicator for `object`. |
|
4637 */ |
|
4638 function compareMultiple(object, other, orders) { |
|
4639 var index = -1, |
|
4640 objCriteria = object.criteria, |
|
4641 othCriteria = other.criteria, |
|
4642 length = objCriteria.length, |
|
4643 ordersLength = orders.length; |
|
4644 |
|
4645 while (++index < length) { |
|
4646 var result = compareAscending(objCriteria[index], othCriteria[index]); |
|
4647 if (result) { |
|
4648 if (index >= ordersLength) { |
|
4649 return result; |
|
4650 } |
|
4651 var order = orders[index]; |
|
4652 return result * (order == 'desc' ? -1 : 1); |
|
4653 } |
|
4654 } |
|
4655 // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications |
|
4656 // that causes it, under certain circumstances, to provide the same value for |
|
4657 // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 |
|
4658 // for more details. |
|
4659 // |
|
4660 // This also ensures a stable sort in V8 and other engines. |
|
4661 // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. |
|
4662 return object.index - other.index; |
|
4663 } |
|
4664 |
|
4665 /** |
|
4666 * Creates an array that is the composition of partially applied arguments, |
|
4667 * placeholders, and provided arguments into a single array of arguments. |
|
4668 * |
|
4669 * @private |
|
4670 * @param {Array} args The provided arguments. |
|
4671 * @param {Array} partials The arguments to prepend to those provided. |
|
4672 * @param {Array} holders The `partials` placeholder indexes. |
|
4673 * @params {boolean} [isCurried] Specify composing for a curried function. |
|
4674 * @returns {Array} Returns the new array of composed arguments. |
|
4675 */ |
|
4676 function composeArgs(args, partials, holders, isCurried) { |
|
4677 var argsIndex = -1, |
|
4678 argsLength = args.length, |
|
4679 holdersLength = holders.length, |
|
4680 leftIndex = -1, |
|
4681 leftLength = partials.length, |
|
4682 rangeLength = nativeMax(argsLength - holdersLength, 0), |
|
4683 result = Array(leftLength + rangeLength), |
|
4684 isUncurried = !isCurried; |
|
4685 |
|
4686 while (++leftIndex < leftLength) { |
|
4687 result[leftIndex] = partials[leftIndex]; |
|
4688 } |
|
4689 while (++argsIndex < holdersLength) { |
|
4690 if (isUncurried || argsIndex < argsLength) { |
|
4691 result[holders[argsIndex]] = args[argsIndex]; |
|
4692 } |
|
4693 } |
|
4694 while (rangeLength--) { |
|
4695 result[leftIndex++] = args[argsIndex++]; |
|
4696 } |
|
4697 return result; |
|
4698 } |
|
4699 |
|
4700 /** |
|
4701 * This function is like `composeArgs` except that the arguments composition |
|
4702 * is tailored for `_.partialRight`. |
|
4703 * |
|
4704 * @private |
|
4705 * @param {Array} args The provided arguments. |
|
4706 * @param {Array} partials The arguments to append to those provided. |
|
4707 * @param {Array} holders The `partials` placeholder indexes. |
|
4708 * @params {boolean} [isCurried] Specify composing for a curried function. |
|
4709 * @returns {Array} Returns the new array of composed arguments. |
|
4710 */ |
|
4711 function composeArgsRight(args, partials, holders, isCurried) { |
|
4712 var argsIndex = -1, |
|
4713 argsLength = args.length, |
|
4714 holdersIndex = -1, |
|
4715 holdersLength = holders.length, |
|
4716 rightIndex = -1, |
|
4717 rightLength = partials.length, |
|
4718 rangeLength = nativeMax(argsLength - holdersLength, 0), |
|
4719 result = Array(rangeLength + rightLength), |
|
4720 isUncurried = !isCurried; |
|
4721 |
|
4722 while (++argsIndex < rangeLength) { |
|
4723 result[argsIndex] = args[argsIndex]; |
|
4724 } |
|
4725 var offset = argsIndex; |
|
4726 while (++rightIndex < rightLength) { |
|
4727 result[offset + rightIndex] = partials[rightIndex]; |
|
4728 } |
|
4729 while (++holdersIndex < holdersLength) { |
|
4730 if (isUncurried || argsIndex < argsLength) { |
|
4731 result[offset + holders[holdersIndex]] = args[argsIndex++]; |
|
4732 } |
|
4733 } |
|
4734 return result; |
|
4735 } |
|
4736 |
|
4737 /** |
|
4738 * Copies the values of `source` to `array`. |
|
4739 * |
|
4740 * @private |
|
4741 * @param {Array} source The array to copy values from. |
|
4742 * @param {Array} [array=[]] The array to copy values to. |
|
4743 * @returns {Array} Returns `array`. |
|
4744 */ |
|
4745 function copyArray(source, array) { |
|
4746 var index = -1, |
|
4747 length = source.length; |
|
4748 |
|
4749 array || (array = Array(length)); |
|
4750 while (++index < length) { |
|
4751 array[index] = source[index]; |
|
4752 } |
|
4753 return array; |
|
4754 } |
|
4755 |
|
4756 /** |
|
4757 * Copies properties of `source` to `object`. |
|
4758 * |
|
4759 * @private |
|
4760 * @param {Object} source The object to copy properties from. |
|
4761 * @param {Array} props The property identifiers to copy. |
|
4762 * @param {Object} [object={}] The object to copy properties to. |
|
4763 * @param {Function} [customizer] The function to customize copied values. |
|
4764 * @returns {Object} Returns `object`. |
|
4765 */ |
|
4766 function copyObject(source, props, object, customizer) { |
|
4767 var isNew = !object; |
|
4768 object || (object = {}); |
|
4769 |
|
4770 var index = -1, |
|
4771 length = props.length; |
|
4772 |
|
4773 while (++index < length) { |
|
4774 var key = props[index]; |
|
4775 |
|
4776 var newValue = customizer |
|
4777 ? customizer(object[key], source[key], key, object, source) |
|
4778 : undefined; |
|
4779 |
|
4780 if (newValue === undefined) { |
|
4781 newValue = source[key]; |
|
4782 } |
|
4783 if (isNew) { |
|
4784 baseAssignValue(object, key, newValue); |
|
4785 } else { |
|
4786 assignValue(object, key, newValue); |
|
4787 } |
|
4788 } |
|
4789 return object; |
|
4790 } |
|
4791 |
|
4792 /** |
|
4793 * Copies own symbols of `source` to `object`. |
|
4794 * |
|
4795 * @private |
|
4796 * @param {Object} source The object to copy symbols from. |
|
4797 * @param {Object} [object={}] The object to copy symbols to. |
|
4798 * @returns {Object} Returns `object`. |
|
4799 */ |
|
4800 function copySymbols(source, object) { |
|
4801 return copyObject(source, getSymbols(source), object); |
|
4802 } |
|
4803 |
|
4804 /** |
|
4805 * Copies own and inherited symbols of `source` to `object`. |
|
4806 * |
|
4807 * @private |
|
4808 * @param {Object} source The object to copy symbols from. |
|
4809 * @param {Object} [object={}] The object to copy symbols to. |
|
4810 * @returns {Object} Returns `object`. |
|
4811 */ |
|
4812 function copySymbolsIn(source, object) { |
|
4813 return copyObject(source, getSymbolsIn(source), object); |
|
4814 } |
|
4815 |
|
4816 /** |
|
4817 * Creates a function like `_.groupBy`. |
|
4818 * |
|
4819 * @private |
|
4820 * @param {Function} setter The function to set accumulator values. |
|
4821 * @param {Function} [initializer] The accumulator object initializer. |
|
4822 * @returns {Function} Returns the new aggregator function. |
|
4823 */ |
|
4824 function createAggregator(setter, initializer) { |
|
4825 return function(collection, iteratee) { |
|
4826 var func = isArray(collection) ? arrayAggregator : baseAggregator, |
|
4827 accumulator = initializer ? initializer() : {}; |
|
4828 |
|
4829 return func(collection, setter, getIteratee(iteratee, 2), accumulator); |
|
4830 }; |
|
4831 } |
|
4832 |
|
4833 /** |
|
4834 * Creates a function like `_.assign`. |
|
4835 * |
|
4836 * @private |
|
4837 * @param {Function} assigner The function to assign values. |
|
4838 * @returns {Function} Returns the new assigner function. |
|
4839 */ |
|
4840 function createAssigner(assigner) { |
|
4841 return baseRest(function(object, sources) { |
|
4842 var index = -1, |
|
4843 length = sources.length, |
|
4844 customizer = length > 1 ? sources[length - 1] : undefined, |
|
4845 guard = length > 2 ? sources[2] : undefined; |
|
4846 |
|
4847 customizer = (assigner.length > 3 && typeof customizer == 'function') |
|
4848 ? (length--, customizer) |
|
4849 : undefined; |
|
4850 |
|
4851 if (guard && isIterateeCall(sources[0], sources[1], guard)) { |
|
4852 customizer = length < 3 ? undefined : customizer; |
|
4853 length = 1; |
|
4854 } |
|
4855 object = Object(object); |
|
4856 while (++index < length) { |
|
4857 var source = sources[index]; |
|
4858 if (source) { |
|
4859 assigner(object, source, index, customizer); |
|
4860 } |
|
4861 } |
|
4862 return object; |
|
4863 }); |
|
4864 } |
|
4865 |
|
4866 /** |
|
4867 * Creates a `baseEach` or `baseEachRight` function. |
|
4868 * |
|
4869 * @private |
|
4870 * @param {Function} eachFunc The function to iterate over a collection. |
|
4871 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
4872 * @returns {Function} Returns the new base function. |
|
4873 */ |
|
4874 function createBaseEach(eachFunc, fromRight) { |
|
4875 return function(collection, iteratee) { |
|
4876 if (collection == null) { |
|
4877 return collection; |
|
4878 } |
|
4879 if (!isArrayLike(collection)) { |
|
4880 return eachFunc(collection, iteratee); |
|
4881 } |
|
4882 var length = collection.length, |
|
4883 index = fromRight ? length : -1, |
|
4884 iterable = Object(collection); |
|
4885 |
|
4886 while ((fromRight ? index-- : ++index < length)) { |
|
4887 if (iteratee(iterable[index], index, iterable) === false) { |
|
4888 break; |
|
4889 } |
|
4890 } |
|
4891 return collection; |
|
4892 }; |
|
4893 } |
|
4894 |
|
4895 /** |
|
4896 * Creates a base function for methods like `_.forIn` and `_.forOwn`. |
|
4897 * |
|
4898 * @private |
|
4899 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
4900 * @returns {Function} Returns the new base function. |
|
4901 */ |
|
4902 function createBaseFor(fromRight) { |
|
4903 return function(object, iteratee, keysFunc) { |
|
4904 var index = -1, |
|
4905 iterable = Object(object), |
|
4906 props = keysFunc(object), |
|
4907 length = props.length; |
|
4908 |
|
4909 while (length--) { |
|
4910 var key = props[fromRight ? length : ++index]; |
|
4911 if (iteratee(iterable[key], key, iterable) === false) { |
|
4912 break; |
|
4913 } |
|
4914 } |
|
4915 return object; |
|
4916 }; |
|
4917 } |
|
4918 |
|
4919 /** |
|
4920 * Creates a function that wraps `func` to invoke it with the optional `this` |
|
4921 * binding of `thisArg`. |
|
4922 * |
|
4923 * @private |
|
4924 * @param {Function} func The function to wrap. |
|
4925 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
4926 * @param {*} [thisArg] The `this` binding of `func`. |
|
4927 * @returns {Function} Returns the new wrapped function. |
|
4928 */ |
|
4929 function createBind(func, bitmask, thisArg) { |
|
4930 var isBind = bitmask & WRAP_BIND_FLAG, |
|
4931 Ctor = createCtor(func); |
|
4932 |
|
4933 function wrapper() { |
|
4934 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; |
|
4935 return fn.apply(isBind ? thisArg : this, arguments); |
|
4936 } |
|
4937 return wrapper; |
|
4938 } |
|
4939 |
|
4940 /** |
|
4941 * Creates a function like `_.lowerFirst`. |
|
4942 * |
|
4943 * @private |
|
4944 * @param {string} methodName The name of the `String` case method to use. |
|
4945 * @returns {Function} Returns the new case function. |
|
4946 */ |
|
4947 function createCaseFirst(methodName) { |
|
4948 return function(string) { |
|
4949 string = toString(string); |
|
4950 |
|
4951 var strSymbols = hasUnicode(string) |
|
4952 ? stringToArray(string) |
|
4953 : undefined; |
|
4954 |
|
4955 var chr = strSymbols |
|
4956 ? strSymbols[0] |
|
4957 : string.charAt(0); |
|
4958 |
|
4959 var trailing = strSymbols |
|
4960 ? castSlice(strSymbols, 1).join('') |
|
4961 : string.slice(1); |
|
4962 |
|
4963 return chr[methodName]() + trailing; |
|
4964 }; |
|
4965 } |
|
4966 |
|
4967 /** |
|
4968 * Creates a function like `_.camelCase`. |
|
4969 * |
|
4970 * @private |
|
4971 * @param {Function} callback The function to combine each word. |
|
4972 * @returns {Function} Returns the new compounder function. |
|
4973 */ |
|
4974 function createCompounder(callback) { |
|
4975 return function(string) { |
|
4976 return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); |
|
4977 }; |
|
4978 } |
|
4979 |
|
4980 /** |
|
4981 * Creates a function that produces an instance of `Ctor` regardless of |
|
4982 * whether it was invoked as part of a `new` expression or by `call` or `apply`. |
|
4983 * |
|
4984 * @private |
|
4985 * @param {Function} Ctor The constructor to wrap. |
|
4986 * @returns {Function} Returns the new wrapped function. |
|
4987 */ |
|
4988 function createCtor(Ctor) { |
|
4989 return function() { |
|
4990 // Use a `switch` statement to work with class constructors. See |
|
4991 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist |
|
4992 // for more details. |
|
4993 var args = arguments; |
|
4994 switch (args.length) { |
|
4995 case 0: return new Ctor; |
|
4996 case 1: return new Ctor(args[0]); |
|
4997 case 2: return new Ctor(args[0], args[1]); |
|
4998 case 3: return new Ctor(args[0], args[1], args[2]); |
|
4999 case 4: return new Ctor(args[0], args[1], args[2], args[3]); |
|
5000 case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); |
|
5001 case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); |
|
5002 case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); |
|
5003 } |
|
5004 var thisBinding = baseCreate(Ctor.prototype), |
|
5005 result = Ctor.apply(thisBinding, args); |
|
5006 |
|
5007 // Mimic the constructor's `return` behavior. |
|
5008 // See https://es5.github.io/#x13.2.2 for more details. |
|
5009 return isObject(result) ? result : thisBinding; |
|
5010 }; |
|
5011 } |
|
5012 |
|
5013 /** |
|
5014 * Creates a function that wraps `func` to enable currying. |
|
5015 * |
|
5016 * @private |
|
5017 * @param {Function} func The function to wrap. |
|
5018 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
5019 * @param {number} arity The arity of `func`. |
|
5020 * @returns {Function} Returns the new wrapped function. |
|
5021 */ |
|
5022 function createCurry(func, bitmask, arity) { |
|
5023 var Ctor = createCtor(func); |
|
5024 |
|
5025 function wrapper() { |
|
5026 var length = arguments.length, |
|
5027 args = Array(length), |
|
5028 index = length, |
|
5029 placeholder = getHolder(wrapper); |
|
5030 |
|
5031 while (index--) { |
|
5032 args[index] = arguments[index]; |
|
5033 } |
|
5034 var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) |
|
5035 ? [] |
|
5036 : replaceHolders(args, placeholder); |
|
5037 |
|
5038 length -= holders.length; |
|
5039 if (length < arity) { |
|
5040 return createRecurry( |
|
5041 func, bitmask, createHybrid, wrapper.placeholder, undefined, |
|
5042 args, holders, undefined, undefined, arity - length); |
|
5043 } |
|
5044 var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; |
|
5045 return apply(fn, this, args); |
|
5046 } |
|
5047 return wrapper; |
|
5048 } |
|
5049 |
|
5050 /** |
|
5051 * Creates a `_.find` or `_.findLast` function. |
|
5052 * |
|
5053 * @private |
|
5054 * @param {Function} findIndexFunc The function to find the collection index. |
|
5055 * @returns {Function} Returns the new find function. |
|
5056 */ |
|
5057 function createFind(findIndexFunc) { |
|
5058 return function(collection, predicate, fromIndex) { |
|
5059 var iterable = Object(collection); |
|
5060 if (!isArrayLike(collection)) { |
|
5061 var iteratee = getIteratee(predicate, 3); |
|
5062 collection = keys(collection); |
|
5063 predicate = function(key) { return iteratee(iterable[key], key, iterable); }; |
|
5064 } |
|
5065 var index = findIndexFunc(collection, predicate, fromIndex); |
|
5066 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; |
|
5067 }; |
|
5068 } |
|
5069 |
|
5070 /** |
|
5071 * Creates a `_.flow` or `_.flowRight` function. |
|
5072 * |
|
5073 * @private |
|
5074 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
5075 * @returns {Function} Returns the new flow function. |
|
5076 */ |
|
5077 function createFlow(fromRight) { |
|
5078 return flatRest(function(funcs) { |
|
5079 var length = funcs.length, |
|
5080 index = length, |
|
5081 prereq = LodashWrapper.prototype.thru; |
|
5082 |
|
5083 if (fromRight) { |
|
5084 funcs.reverse(); |
|
5085 } |
|
5086 while (index--) { |
|
5087 var func = funcs[index]; |
|
5088 if (typeof func != 'function') { |
|
5089 throw new TypeError(FUNC_ERROR_TEXT); |
|
5090 } |
|
5091 if (prereq && !wrapper && getFuncName(func) == 'wrapper') { |
|
5092 var wrapper = new LodashWrapper([], true); |
|
5093 } |
|
5094 } |
|
5095 index = wrapper ? index : length; |
|
5096 while (++index < length) { |
|
5097 func = funcs[index]; |
|
5098 |
|
5099 var funcName = getFuncName(func), |
|
5100 data = funcName == 'wrapper' ? getData(func) : undefined; |
|
5101 |
|
5102 if (data && isLaziable(data[0]) && |
|
5103 data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && |
|
5104 !data[4].length && data[9] == 1 |
|
5105 ) { |
|
5106 wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); |
|
5107 } else { |
|
5108 wrapper = (func.length == 1 && isLaziable(func)) |
|
5109 ? wrapper[funcName]() |
|
5110 : wrapper.thru(func); |
|
5111 } |
|
5112 } |
|
5113 return function() { |
|
5114 var args = arguments, |
|
5115 value = args[0]; |
|
5116 |
|
5117 if (wrapper && args.length == 1 && isArray(value)) { |
|
5118 return wrapper.plant(value).value(); |
|
5119 } |
|
5120 var index = 0, |
|
5121 result = length ? funcs[index].apply(this, args) : value; |
|
5122 |
|
5123 while (++index < length) { |
|
5124 result = funcs[index].call(this, result); |
|
5125 } |
|
5126 return result; |
|
5127 }; |
|
5128 }); |
|
5129 } |
|
5130 |
|
5131 /** |
|
5132 * Creates a function that wraps `func` to invoke it with optional `this` |
|
5133 * binding of `thisArg`, partial application, and currying. |
|
5134 * |
|
5135 * @private |
|
5136 * @param {Function|string} func The function or method name to wrap. |
|
5137 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
5138 * @param {*} [thisArg] The `this` binding of `func`. |
|
5139 * @param {Array} [partials] The arguments to prepend to those provided to |
|
5140 * the new function. |
|
5141 * @param {Array} [holders] The `partials` placeholder indexes. |
|
5142 * @param {Array} [partialsRight] The arguments to append to those provided |
|
5143 * to the new function. |
|
5144 * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. |
|
5145 * @param {Array} [argPos] The argument positions of the new function. |
|
5146 * @param {number} [ary] The arity cap of `func`. |
|
5147 * @param {number} [arity] The arity of `func`. |
|
5148 * @returns {Function} Returns the new wrapped function. |
|
5149 */ |
|
5150 function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { |
|
5151 var isAry = bitmask & WRAP_ARY_FLAG, |
|
5152 isBind = bitmask & WRAP_BIND_FLAG, |
|
5153 isBindKey = bitmask & WRAP_BIND_KEY_FLAG, |
|
5154 isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), |
|
5155 isFlip = bitmask & WRAP_FLIP_FLAG, |
|
5156 Ctor = isBindKey ? undefined : createCtor(func); |
|
5157 |
|
5158 function wrapper() { |
|
5159 var length = arguments.length, |
|
5160 args = Array(length), |
|
5161 index = length; |
|
5162 |
|
5163 while (index--) { |
|
5164 args[index] = arguments[index]; |
|
5165 } |
|
5166 if (isCurried) { |
|
5167 var placeholder = getHolder(wrapper), |
|
5168 holdersCount = countHolders(args, placeholder); |
|
5169 } |
|
5170 if (partials) { |
|
5171 args = composeArgs(args, partials, holders, isCurried); |
|
5172 } |
|
5173 if (partialsRight) { |
|
5174 args = composeArgsRight(args, partialsRight, holdersRight, isCurried); |
|
5175 } |
|
5176 length -= holdersCount; |
|
5177 if (isCurried && length < arity) { |
|
5178 var newHolders = replaceHolders(args, placeholder); |
|
5179 return createRecurry( |
|
5180 func, bitmask, createHybrid, wrapper.placeholder, thisArg, |
|
5181 args, newHolders, argPos, ary, arity - length |
|
5182 ); |
|
5183 } |
|
5184 var thisBinding = isBind ? thisArg : this, |
|
5185 fn = isBindKey ? thisBinding[func] : func; |
|
5186 |
|
5187 length = args.length; |
|
5188 if (argPos) { |
|
5189 args = reorder(args, argPos); |
|
5190 } else if (isFlip && length > 1) { |
|
5191 args.reverse(); |
|
5192 } |
|
5193 if (isAry && ary < length) { |
|
5194 args.length = ary; |
|
5195 } |
|
5196 if (this && this !== root && this instanceof wrapper) { |
|
5197 fn = Ctor || createCtor(fn); |
|
5198 } |
|
5199 return fn.apply(thisBinding, args); |
|
5200 } |
|
5201 return wrapper; |
|
5202 } |
|
5203 |
|
5204 /** |
|
5205 * Creates a function like `_.invertBy`. |
|
5206 * |
|
5207 * @private |
|
5208 * @param {Function} setter The function to set accumulator values. |
|
5209 * @param {Function} toIteratee The function to resolve iteratees. |
|
5210 * @returns {Function} Returns the new inverter function. |
|
5211 */ |
|
5212 function createInverter(setter, toIteratee) { |
|
5213 return function(object, iteratee) { |
|
5214 return baseInverter(object, setter, toIteratee(iteratee), {}); |
|
5215 }; |
|
5216 } |
|
5217 |
|
5218 /** |
|
5219 * Creates a function that performs a mathematical operation on two values. |
|
5220 * |
|
5221 * @private |
|
5222 * @param {Function} operator The function to perform the operation. |
|
5223 * @param {number} [defaultValue] The value used for `undefined` arguments. |
|
5224 * @returns {Function} Returns the new mathematical operation function. |
|
5225 */ |
|
5226 function createMathOperation(operator, defaultValue) { |
|
5227 return function(value, other) { |
|
5228 var result; |
|
5229 if (value === undefined && other === undefined) { |
|
5230 return defaultValue; |
|
5231 } |
|
5232 if (value !== undefined) { |
|
5233 result = value; |
|
5234 } |
|
5235 if (other !== undefined) { |
|
5236 if (result === undefined) { |
|
5237 return other; |
|
5238 } |
|
5239 if (typeof value == 'string' || typeof other == 'string') { |
|
5240 value = baseToString(value); |
|
5241 other = baseToString(other); |
|
5242 } else { |
|
5243 value = baseToNumber(value); |
|
5244 other = baseToNumber(other); |
|
5245 } |
|
5246 result = operator(value, other); |
|
5247 } |
|
5248 return result; |
|
5249 }; |
|
5250 } |
|
5251 |
|
5252 /** |
|
5253 * Creates a function like `_.over`. |
|
5254 * |
|
5255 * @private |
|
5256 * @param {Function} arrayFunc The function to iterate over iteratees. |
|
5257 * @returns {Function} Returns the new over function. |
|
5258 */ |
|
5259 function createOver(arrayFunc) { |
|
5260 return flatRest(function(iteratees) { |
|
5261 iteratees = arrayMap(iteratees, baseUnary(getIteratee())); |
|
5262 return baseRest(function(args) { |
|
5263 var thisArg = this; |
|
5264 return arrayFunc(iteratees, function(iteratee) { |
|
5265 return apply(iteratee, thisArg, args); |
|
5266 }); |
|
5267 }); |
|
5268 }); |
|
5269 } |
|
5270 |
|
5271 /** |
|
5272 * Creates the padding for `string` based on `length`. The `chars` string |
|
5273 * is truncated if the number of characters exceeds `length`. |
|
5274 * |
|
5275 * @private |
|
5276 * @param {number} length The padding length. |
|
5277 * @param {string} [chars=' '] The string used as padding. |
|
5278 * @returns {string} Returns the padding for `string`. |
|
5279 */ |
|
5280 function createPadding(length, chars) { |
|
5281 chars = chars === undefined ? ' ' : baseToString(chars); |
|
5282 |
|
5283 var charsLength = chars.length; |
|
5284 if (charsLength < 2) { |
|
5285 return charsLength ? baseRepeat(chars, length) : chars; |
|
5286 } |
|
5287 var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); |
|
5288 return hasUnicode(chars) |
|
5289 ? castSlice(stringToArray(result), 0, length).join('') |
|
5290 : result.slice(0, length); |
|
5291 } |
|
5292 |
|
5293 /** |
|
5294 * Creates a function that wraps `func` to invoke it with the `this` binding |
|
5295 * of `thisArg` and `partials` prepended to the arguments it receives. |
|
5296 * |
|
5297 * @private |
|
5298 * @param {Function} func The function to wrap. |
|
5299 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
5300 * @param {*} thisArg The `this` binding of `func`. |
|
5301 * @param {Array} partials The arguments to prepend to those provided to |
|
5302 * the new function. |
|
5303 * @returns {Function} Returns the new wrapped function. |
|
5304 */ |
|
5305 function createPartial(func, bitmask, thisArg, partials) { |
|
5306 var isBind = bitmask & WRAP_BIND_FLAG, |
|
5307 Ctor = createCtor(func); |
|
5308 |
|
5309 function wrapper() { |
|
5310 var argsIndex = -1, |
|
5311 argsLength = arguments.length, |
|
5312 leftIndex = -1, |
|
5313 leftLength = partials.length, |
|
5314 args = Array(leftLength + argsLength), |
|
5315 fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; |
|
5316 |
|
5317 while (++leftIndex < leftLength) { |
|
5318 args[leftIndex] = partials[leftIndex]; |
|
5319 } |
|
5320 while (argsLength--) { |
|
5321 args[leftIndex++] = arguments[++argsIndex]; |
|
5322 } |
|
5323 return apply(fn, isBind ? thisArg : this, args); |
|
5324 } |
|
5325 return wrapper; |
|
5326 } |
|
5327 |
|
5328 /** |
|
5329 * Creates a `_.range` or `_.rangeRight` function. |
|
5330 * |
|
5331 * @private |
|
5332 * @param {boolean} [fromRight] Specify iterating from right to left. |
|
5333 * @returns {Function} Returns the new range function. |
|
5334 */ |
|
5335 function createRange(fromRight) { |
|
5336 return function(start, end, step) { |
|
5337 if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { |
|
5338 end = step = undefined; |
|
5339 } |
|
5340 // Ensure the sign of `-0` is preserved. |
|
5341 start = toFinite(start); |
|
5342 if (end === undefined) { |
|
5343 end = start; |
|
5344 start = 0; |
|
5345 } else { |
|
5346 end = toFinite(end); |
|
5347 } |
|
5348 step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); |
|
5349 return baseRange(start, end, step, fromRight); |
|
5350 }; |
|
5351 } |
|
5352 |
|
5353 /** |
|
5354 * Creates a function that performs a relational operation on two values. |
|
5355 * |
|
5356 * @private |
|
5357 * @param {Function} operator The function to perform the operation. |
|
5358 * @returns {Function} Returns the new relational operation function. |
|
5359 */ |
|
5360 function createRelationalOperation(operator) { |
|
5361 return function(value, other) { |
|
5362 if (!(typeof value == 'string' && typeof other == 'string')) { |
|
5363 value = toNumber(value); |
|
5364 other = toNumber(other); |
|
5365 } |
|
5366 return operator(value, other); |
|
5367 }; |
|
5368 } |
|
5369 |
|
5370 /** |
|
5371 * Creates a function that wraps `func` to continue currying. |
|
5372 * |
|
5373 * @private |
|
5374 * @param {Function} func The function to wrap. |
|
5375 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
5376 * @param {Function} wrapFunc The function to create the `func` wrapper. |
|
5377 * @param {*} placeholder The placeholder value. |
|
5378 * @param {*} [thisArg] The `this` binding of `func`. |
|
5379 * @param {Array} [partials] The arguments to prepend to those provided to |
|
5380 * the new function. |
|
5381 * @param {Array} [holders] The `partials` placeholder indexes. |
|
5382 * @param {Array} [argPos] The argument positions of the new function. |
|
5383 * @param {number} [ary] The arity cap of `func`. |
|
5384 * @param {number} [arity] The arity of `func`. |
|
5385 * @returns {Function} Returns the new wrapped function. |
|
5386 */ |
|
5387 function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { |
|
5388 var isCurry = bitmask & WRAP_CURRY_FLAG, |
|
5389 newHolders = isCurry ? holders : undefined, |
|
5390 newHoldersRight = isCurry ? undefined : holders, |
|
5391 newPartials = isCurry ? partials : undefined, |
|
5392 newPartialsRight = isCurry ? undefined : partials; |
|
5393 |
|
5394 bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); |
|
5395 bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); |
|
5396 |
|
5397 if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { |
|
5398 bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); |
|
5399 } |
|
5400 var newData = [ |
|
5401 func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, |
|
5402 newHoldersRight, argPos, ary, arity |
|
5403 ]; |
|
5404 |
|
5405 var result = wrapFunc.apply(undefined, newData); |
|
5406 if (isLaziable(func)) { |
|
5407 setData(result, newData); |
|
5408 } |
|
5409 result.placeholder = placeholder; |
|
5410 return setWrapToString(result, func, bitmask); |
|
5411 } |
|
5412 |
|
5413 /** |
|
5414 * Creates a function like `_.round`. |
|
5415 * |
|
5416 * @private |
|
5417 * @param {string} methodName The name of the `Math` method to use when rounding. |
|
5418 * @returns {Function} Returns the new round function. |
|
5419 */ |
|
5420 function createRound(methodName) { |
|
5421 var func = Math[methodName]; |
|
5422 return function(number, precision) { |
|
5423 number = toNumber(number); |
|
5424 precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); |
|
5425 if (precision) { |
|
5426 // Shift with exponential notation to avoid floating-point issues. |
|
5427 // See [MDN](https://mdn.io/round#Examples) for more details. |
|
5428 var pair = (toString(number) + 'e').split('e'), |
|
5429 value = func(pair[0] + 'e' + (+pair[1] + precision)); |
|
5430 |
|
5431 pair = (toString(value) + 'e').split('e'); |
|
5432 return +(pair[0] + 'e' + (+pair[1] - precision)); |
|
5433 } |
|
5434 return func(number); |
|
5435 }; |
|
5436 } |
|
5437 |
|
5438 /** |
|
5439 * Creates a set object of `values`. |
|
5440 * |
|
5441 * @private |
|
5442 * @param {Array} values The values to add to the set. |
|
5443 * @returns {Object} Returns the new set. |
|
5444 */ |
|
5445 var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { |
|
5446 return new Set(values); |
|
5447 }; |
|
5448 |
|
5449 /** |
|
5450 * Creates a `_.toPairs` or `_.toPairsIn` function. |
|
5451 * |
|
5452 * @private |
|
5453 * @param {Function} keysFunc The function to get the keys of a given object. |
|
5454 * @returns {Function} Returns the new pairs function. |
|
5455 */ |
|
5456 function createToPairs(keysFunc) { |
|
5457 return function(object) { |
|
5458 var tag = getTag(object); |
|
5459 if (tag == mapTag) { |
|
5460 return mapToArray(object); |
|
5461 } |
|
5462 if (tag == setTag) { |
|
5463 return setToPairs(object); |
|
5464 } |
|
5465 return baseToPairs(object, keysFunc(object)); |
|
5466 }; |
|
5467 } |
|
5468 |
|
5469 /** |
|
5470 * Creates a function that either curries or invokes `func` with optional |
|
5471 * `this` binding and partially applied arguments. |
|
5472 * |
|
5473 * @private |
|
5474 * @param {Function|string} func The function or method name to wrap. |
|
5475 * @param {number} bitmask The bitmask flags. |
|
5476 * 1 - `_.bind` |
|
5477 * 2 - `_.bindKey` |
|
5478 * 4 - `_.curry` or `_.curryRight` of a bound function |
|
5479 * 8 - `_.curry` |
|
5480 * 16 - `_.curryRight` |
|
5481 * 32 - `_.partial` |
|
5482 * 64 - `_.partialRight` |
|
5483 * 128 - `_.rearg` |
|
5484 * 256 - `_.ary` |
|
5485 * 512 - `_.flip` |
|
5486 * @param {*} [thisArg] The `this` binding of `func`. |
|
5487 * @param {Array} [partials] The arguments to be partially applied. |
|
5488 * @param {Array} [holders] The `partials` placeholder indexes. |
|
5489 * @param {Array} [argPos] The argument positions of the new function. |
|
5490 * @param {number} [ary] The arity cap of `func`. |
|
5491 * @param {number} [arity] The arity of `func`. |
|
5492 * @returns {Function} Returns the new wrapped function. |
|
5493 */ |
|
5494 function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { |
|
5495 var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; |
|
5496 if (!isBindKey && typeof func != 'function') { |
|
5497 throw new TypeError(FUNC_ERROR_TEXT); |
|
5498 } |
|
5499 var length = partials ? partials.length : 0; |
|
5500 if (!length) { |
|
5501 bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); |
|
5502 partials = holders = undefined; |
|
5503 } |
|
5504 ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); |
|
5505 arity = arity === undefined ? arity : toInteger(arity); |
|
5506 length -= holders ? holders.length : 0; |
|
5507 |
|
5508 if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { |
|
5509 var partialsRight = partials, |
|
5510 holdersRight = holders; |
|
5511 |
|
5512 partials = holders = undefined; |
|
5513 } |
|
5514 var data = isBindKey ? undefined : getData(func); |
|
5515 |
|
5516 var newData = [ |
|
5517 func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, |
|
5518 argPos, ary, arity |
|
5519 ]; |
|
5520 |
|
5521 if (data) { |
|
5522 mergeData(newData, data); |
|
5523 } |
|
5524 func = newData[0]; |
|
5525 bitmask = newData[1]; |
|
5526 thisArg = newData[2]; |
|
5527 partials = newData[3]; |
|
5528 holders = newData[4]; |
|
5529 arity = newData[9] = newData[9] === undefined |
|
5530 ? (isBindKey ? 0 : func.length) |
|
5531 : nativeMax(newData[9] - length, 0); |
|
5532 |
|
5533 if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { |
|
5534 bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); |
|
5535 } |
|
5536 if (!bitmask || bitmask == WRAP_BIND_FLAG) { |
|
5537 var result = createBind(func, bitmask, thisArg); |
|
5538 } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { |
|
5539 result = createCurry(func, bitmask, arity); |
|
5540 } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { |
|
5541 result = createPartial(func, bitmask, thisArg, partials); |
|
5542 } else { |
|
5543 result = createHybrid.apply(undefined, newData); |
|
5544 } |
|
5545 var setter = data ? baseSetData : setData; |
|
5546 return setWrapToString(setter(result, newData), func, bitmask); |
|
5547 } |
|
5548 |
|
5549 /** |
|
5550 * Used by `_.defaults` to customize its `_.assignIn` use to assign properties |
|
5551 * of source objects to the destination object for all destination properties |
|
5552 * that resolve to `undefined`. |
|
5553 * |
|
5554 * @private |
|
5555 * @param {*} objValue The destination value. |
|
5556 * @param {*} srcValue The source value. |
|
5557 * @param {string} key The key of the property to assign. |
|
5558 * @param {Object} object The parent object of `objValue`. |
|
5559 * @returns {*} Returns the value to assign. |
|
5560 */ |
|
5561 function customDefaultsAssignIn(objValue, srcValue, key, object) { |
|
5562 if (objValue === undefined || |
|
5563 (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { |
|
5564 return srcValue; |
|
5565 } |
|
5566 return objValue; |
|
5567 } |
|
5568 |
|
5569 /** |
|
5570 * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source |
|
5571 * objects into destination objects that are passed thru. |
|
5572 * |
|
5573 * @private |
|
5574 * @param {*} objValue The destination value. |
|
5575 * @param {*} srcValue The source value. |
|
5576 * @param {string} key The key of the property to merge. |
|
5577 * @param {Object} object The parent object of `objValue`. |
|
5578 * @param {Object} source The parent object of `srcValue`. |
|
5579 * @param {Object} [stack] Tracks traversed source values and their merged |
|
5580 * counterparts. |
|
5581 * @returns {*} Returns the value to assign. |
|
5582 */ |
|
5583 function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { |
|
5584 if (isObject(objValue) && isObject(srcValue)) { |
|
5585 // Recursively merge objects and arrays (susceptible to call stack limits). |
|
5586 stack.set(srcValue, objValue); |
|
5587 baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); |
|
5588 stack['delete'](srcValue); |
|
5589 } |
|
5590 return objValue; |
|
5591 } |
|
5592 |
|
5593 /** |
|
5594 * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain |
|
5595 * objects. |
|
5596 * |
|
5597 * @private |
|
5598 * @param {*} value The value to inspect. |
|
5599 * @param {string} key The key of the property to inspect. |
|
5600 * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. |
|
5601 */ |
|
5602 function customOmitClone(value) { |
|
5603 return isPlainObject(value) ? undefined : value; |
|
5604 } |
|
5605 |
|
5606 /** |
|
5607 * A specialized version of `baseIsEqualDeep` for arrays with support for |
|
5608 * partial deep comparisons. |
|
5609 * |
|
5610 * @private |
|
5611 * @param {Array} array The array to compare. |
|
5612 * @param {Array} other The other array to compare. |
|
5613 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
|
5614 * @param {Function} customizer The function to customize comparisons. |
|
5615 * @param {Function} equalFunc The function to determine equivalents of values. |
|
5616 * @param {Object} stack Tracks traversed `array` and `other` objects. |
|
5617 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. |
|
5618 */ |
|
5619 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { |
|
5620 var isPartial = bitmask & COMPARE_PARTIAL_FLAG, |
|
5621 arrLength = array.length, |
|
5622 othLength = other.length; |
|
5623 |
|
5624 if (arrLength != othLength && !(isPartial && othLength > arrLength)) { |
|
5625 return false; |
|
5626 } |
|
5627 // Assume cyclic values are equal. |
|
5628 var stacked = stack.get(array); |
|
5629 if (stacked && stack.get(other)) { |
|
5630 return stacked == other; |
|
5631 } |
|
5632 var index = -1, |
|
5633 result = true, |
|
5634 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; |
|
5635 |
|
5636 stack.set(array, other); |
|
5637 stack.set(other, array); |
|
5638 |
|
5639 // Ignore non-index properties. |
|
5640 while (++index < arrLength) { |
|
5641 var arrValue = array[index], |
|
5642 othValue = other[index]; |
|
5643 |
|
5644 if (customizer) { |
|
5645 var compared = isPartial |
|
5646 ? customizer(othValue, arrValue, index, other, array, stack) |
|
5647 : customizer(arrValue, othValue, index, array, other, stack); |
|
5648 } |
|
5649 if (compared !== undefined) { |
|
5650 if (compared) { |
|
5651 continue; |
|
5652 } |
|
5653 result = false; |
|
5654 break; |
|
5655 } |
|
5656 // Recursively compare arrays (susceptible to call stack limits). |
|
5657 if (seen) { |
|
5658 if (!arraySome(other, function(othValue, othIndex) { |
|
5659 if (!cacheHas(seen, othIndex) && |
|
5660 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { |
|
5661 return seen.push(othIndex); |
|
5662 } |
|
5663 })) { |
|
5664 result = false; |
|
5665 break; |
|
5666 } |
|
5667 } else if (!( |
|
5668 arrValue === othValue || |
|
5669 equalFunc(arrValue, othValue, bitmask, customizer, stack) |
|
5670 )) { |
|
5671 result = false; |
|
5672 break; |
|
5673 } |
|
5674 } |
|
5675 stack['delete'](array); |
|
5676 stack['delete'](other); |
|
5677 return result; |
|
5678 } |
|
5679 |
|
5680 /** |
|
5681 * A specialized version of `baseIsEqualDeep` for comparing objects of |
|
5682 * the same `toStringTag`. |
|
5683 * |
|
5684 * **Note:** This function only supports comparing values with tags of |
|
5685 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. |
|
5686 * |
|
5687 * @private |
|
5688 * @param {Object} object The object to compare. |
|
5689 * @param {Object} other The other object to compare. |
|
5690 * @param {string} tag The `toStringTag` of the objects to compare. |
|
5691 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
|
5692 * @param {Function} customizer The function to customize comparisons. |
|
5693 * @param {Function} equalFunc The function to determine equivalents of values. |
|
5694 * @param {Object} stack Tracks traversed `object` and `other` objects. |
|
5695 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
5696 */ |
|
5697 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { |
|
5698 switch (tag) { |
|
5699 case dataViewTag: |
|
5700 if ((object.byteLength != other.byteLength) || |
|
5701 (object.byteOffset != other.byteOffset)) { |
|
5702 return false; |
|
5703 } |
|
5704 object = object.buffer; |
|
5705 other = other.buffer; |
|
5706 |
|
5707 case arrayBufferTag: |
|
5708 if ((object.byteLength != other.byteLength) || |
|
5709 !equalFunc(new Uint8Array(object), new Uint8Array(other))) { |
|
5710 return false; |
|
5711 } |
|
5712 return true; |
|
5713 |
|
5714 case boolTag: |
|
5715 case dateTag: |
|
5716 case numberTag: |
|
5717 // Coerce booleans to `1` or `0` and dates to milliseconds. |
|
5718 // Invalid dates are coerced to `NaN`. |
|
5719 return eq(+object, +other); |
|
5720 |
|
5721 case errorTag: |
|
5722 return object.name == other.name && object.message == other.message; |
|
5723 |
|
5724 case regexpTag: |
|
5725 case stringTag: |
|
5726 // Coerce regexes to strings and treat strings, primitives and objects, |
|
5727 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring |
|
5728 // for more details. |
|
5729 return object == (other + ''); |
|
5730 |
|
5731 case mapTag: |
|
5732 var convert = mapToArray; |
|
5733 |
|
5734 case setTag: |
|
5735 var isPartial = bitmask & COMPARE_PARTIAL_FLAG; |
|
5736 convert || (convert = setToArray); |
|
5737 |
|
5738 if (object.size != other.size && !isPartial) { |
|
5739 return false; |
|
5740 } |
|
5741 // Assume cyclic values are equal. |
|
5742 var stacked = stack.get(object); |
|
5743 if (stacked) { |
|
5744 return stacked == other; |
|
5745 } |
|
5746 bitmask |= COMPARE_UNORDERED_FLAG; |
|
5747 |
|
5748 // Recursively compare objects (susceptible to call stack limits). |
|
5749 stack.set(object, other); |
|
5750 var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); |
|
5751 stack['delete'](object); |
|
5752 return result; |
|
5753 |
|
5754 case symbolTag: |
|
5755 if (symbolValueOf) { |
|
5756 return symbolValueOf.call(object) == symbolValueOf.call(other); |
|
5757 } |
|
5758 } |
|
5759 return false; |
|
5760 } |
|
5761 |
|
5762 /** |
|
5763 * A specialized version of `baseIsEqualDeep` for objects with support for |
|
5764 * partial deep comparisons. |
|
5765 * |
|
5766 * @private |
|
5767 * @param {Object} object The object to compare. |
|
5768 * @param {Object} other The other object to compare. |
|
5769 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. |
|
5770 * @param {Function} customizer The function to customize comparisons. |
|
5771 * @param {Function} equalFunc The function to determine equivalents of values. |
|
5772 * @param {Object} stack Tracks traversed `object` and `other` objects. |
|
5773 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. |
|
5774 */ |
|
5775 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { |
|
5776 var isPartial = bitmask & COMPARE_PARTIAL_FLAG, |
|
5777 objProps = getAllKeys(object), |
|
5778 objLength = objProps.length, |
|
5779 othProps = getAllKeys(other), |
|
5780 othLength = othProps.length; |
|
5781 |
|
5782 if (objLength != othLength && !isPartial) { |
|
5783 return false; |
|
5784 } |
|
5785 var index = objLength; |
|
5786 while (index--) { |
|
5787 var key = objProps[index]; |
|
5788 if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { |
|
5789 return false; |
|
5790 } |
|
5791 } |
|
5792 // Assume cyclic values are equal. |
|
5793 var stacked = stack.get(object); |
|
5794 if (stacked && stack.get(other)) { |
|
5795 return stacked == other; |
|
5796 } |
|
5797 var result = true; |
|
5798 stack.set(object, other); |
|
5799 stack.set(other, object); |
|
5800 |
|
5801 var skipCtor = isPartial; |
|
5802 while (++index < objLength) { |
|
5803 key = objProps[index]; |
|
5804 var objValue = object[key], |
|
5805 othValue = other[key]; |
|
5806 |
|
5807 if (customizer) { |
|
5808 var compared = isPartial |
|
5809 ? customizer(othValue, objValue, key, other, object, stack) |
|
5810 : customizer(objValue, othValue, key, object, other, stack); |
|
5811 } |
|
5812 // Recursively compare objects (susceptible to call stack limits). |
|
5813 if (!(compared === undefined |
|
5814 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) |
|
5815 : compared |
|
5816 )) { |
|
5817 result = false; |
|
5818 break; |
|
5819 } |
|
5820 skipCtor || (skipCtor = key == 'constructor'); |
|
5821 } |
|
5822 if (result && !skipCtor) { |
|
5823 var objCtor = object.constructor, |
|
5824 othCtor = other.constructor; |
|
5825 |
|
5826 // Non `Object` object instances with different constructors are not equal. |
|
5827 if (objCtor != othCtor && |
|
5828 ('constructor' in object && 'constructor' in other) && |
|
5829 !(typeof objCtor == 'function' && objCtor instanceof objCtor && |
|
5830 typeof othCtor == 'function' && othCtor instanceof othCtor)) { |
|
5831 result = false; |
|
5832 } |
|
5833 } |
|
5834 stack['delete'](object); |
|
5835 stack['delete'](other); |
|
5836 return result; |
|
5837 } |
|
5838 |
|
5839 /** |
|
5840 * A specialized version of `baseRest` which flattens the rest array. |
|
5841 * |
|
5842 * @private |
|
5843 * @param {Function} func The function to apply a rest parameter to. |
|
5844 * @returns {Function} Returns the new function. |
|
5845 */ |
|
5846 function flatRest(func) { |
|
5847 return setToString(overRest(func, undefined, flatten), func + ''); |
|
5848 } |
|
5849 |
|
5850 /** |
|
5851 * Creates an array of own enumerable property names and symbols of `object`. |
|
5852 * |
|
5853 * @private |
|
5854 * @param {Object} object The object to query. |
|
5855 * @returns {Array} Returns the array of property names and symbols. |
|
5856 */ |
|
5857 function getAllKeys(object) { |
|
5858 return baseGetAllKeys(object, keys, getSymbols); |
|
5859 } |
|
5860 |
|
5861 /** |
|
5862 * Creates an array of own and inherited enumerable property names and |
|
5863 * symbols of `object`. |
|
5864 * |
|
5865 * @private |
|
5866 * @param {Object} object The object to query. |
|
5867 * @returns {Array} Returns the array of property names and symbols. |
|
5868 */ |
|
5869 function getAllKeysIn(object) { |
|
5870 return baseGetAllKeys(object, keysIn, getSymbolsIn); |
|
5871 } |
|
5872 |
|
5873 /** |
|
5874 * Gets metadata for `func`. |
|
5875 * |
|
5876 * @private |
|
5877 * @param {Function} func The function to query. |
|
5878 * @returns {*} Returns the metadata for `func`. |
|
5879 */ |
|
5880 var getData = !metaMap ? noop : function(func) { |
|
5881 return metaMap.get(func); |
|
5882 }; |
|
5883 |
|
5884 /** |
|
5885 * Gets the name of `func`. |
|
5886 * |
|
5887 * @private |
|
5888 * @param {Function} func The function to query. |
|
5889 * @returns {string} Returns the function name. |
|
5890 */ |
|
5891 function getFuncName(func) { |
|
5892 var result = (func.name + ''), |
|
5893 array = realNames[result], |
|
5894 length = hasOwnProperty.call(realNames, result) ? array.length : 0; |
|
5895 |
|
5896 while (length--) { |
|
5897 var data = array[length], |
|
5898 otherFunc = data.func; |
|
5899 if (otherFunc == null || otherFunc == func) { |
|
5900 return data.name; |
|
5901 } |
|
5902 } |
|
5903 return result; |
|
5904 } |
|
5905 |
|
5906 /** |
|
5907 * Gets the argument placeholder value for `func`. |
|
5908 * |
|
5909 * @private |
|
5910 * @param {Function} func The function to inspect. |
|
5911 * @returns {*} Returns the placeholder value. |
|
5912 */ |
|
5913 function getHolder(func) { |
|
5914 var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; |
|
5915 return object.placeholder; |
|
5916 } |
|
5917 |
|
5918 /** |
|
5919 * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, |
|
5920 * this function returns the custom method, otherwise it returns `baseIteratee`. |
|
5921 * If arguments are provided, the chosen function is invoked with them and |
|
5922 * its result is returned. |
|
5923 * |
|
5924 * @private |
|
5925 * @param {*} [value] The value to convert to an iteratee. |
|
5926 * @param {number} [arity] The arity of the created iteratee. |
|
5927 * @returns {Function} Returns the chosen function or its result. |
|
5928 */ |
|
5929 function getIteratee() { |
|
5930 var result = lodash.iteratee || iteratee; |
|
5931 result = result === iteratee ? baseIteratee : result; |
|
5932 return arguments.length ? result(arguments[0], arguments[1]) : result; |
|
5933 } |
|
5934 |
|
5935 /** |
|
5936 * Gets the data for `map`. |
|
5937 * |
|
5938 * @private |
|
5939 * @param {Object} map The map to query. |
|
5940 * @param {string} key The reference key. |
|
5941 * @returns {*} Returns the map data. |
|
5942 */ |
|
5943 function getMapData(map, key) { |
|
5944 var data = map.__data__; |
|
5945 return isKeyable(key) |
|
5946 ? data[typeof key == 'string' ? 'string' : 'hash'] |
|
5947 : data.map; |
|
5948 } |
|
5949 |
|
5950 /** |
|
5951 * Gets the property names, values, and compare flags of `object`. |
|
5952 * |
|
5953 * @private |
|
5954 * @param {Object} object The object to query. |
|
5955 * @returns {Array} Returns the match data of `object`. |
|
5956 */ |
|
5957 function getMatchData(object) { |
|
5958 var result = keys(object), |
|
5959 length = result.length; |
|
5960 |
|
5961 while (length--) { |
|
5962 var key = result[length], |
|
5963 value = object[key]; |
|
5964 |
|
5965 result[length] = [key, value, isStrictComparable(value)]; |
|
5966 } |
|
5967 return result; |
|
5968 } |
|
5969 |
|
5970 /** |
|
5971 * Gets the native function at `key` of `object`. |
|
5972 * |
|
5973 * @private |
|
5974 * @param {Object} object The object to query. |
|
5975 * @param {string} key The key of the method to get. |
|
5976 * @returns {*} Returns the function if it's native, else `undefined`. |
|
5977 */ |
|
5978 function getNative(object, key) { |
|
5979 var value = getValue(object, key); |
|
5980 return baseIsNative(value) ? value : undefined; |
|
5981 } |
|
5982 |
|
5983 /** |
|
5984 * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. |
|
5985 * |
|
5986 * @private |
|
5987 * @param {*} value The value to query. |
|
5988 * @returns {string} Returns the raw `toStringTag`. |
|
5989 */ |
|
5990 function getRawTag(value) { |
|
5991 var isOwn = hasOwnProperty.call(value, symToStringTag), |
|
5992 tag = value[symToStringTag]; |
|
5993 |
|
5994 try { |
|
5995 value[symToStringTag] = undefined; |
|
5996 var unmasked = true; |
|
5997 } catch (e) {} |
|
5998 |
|
5999 var result = nativeObjectToString.call(value); |
|
6000 if (unmasked) { |
|
6001 if (isOwn) { |
|
6002 value[symToStringTag] = tag; |
|
6003 } else { |
|
6004 delete value[symToStringTag]; |
|
6005 } |
|
6006 } |
|
6007 return result; |
|
6008 } |
|
6009 |
|
6010 /** |
|
6011 * Creates an array of the own enumerable symbols of `object`. |
|
6012 * |
|
6013 * @private |
|
6014 * @param {Object} object The object to query. |
|
6015 * @returns {Array} Returns the array of symbols. |
|
6016 */ |
|
6017 var getSymbols = !nativeGetSymbols ? stubArray : function(object) { |
|
6018 if (object == null) { |
|
6019 return []; |
|
6020 } |
|
6021 object = Object(object); |
|
6022 return arrayFilter(nativeGetSymbols(object), function(symbol) { |
|
6023 return propertyIsEnumerable.call(object, symbol); |
|
6024 }); |
|
6025 }; |
|
6026 |
|
6027 /** |
|
6028 * Creates an array of the own and inherited enumerable symbols of `object`. |
|
6029 * |
|
6030 * @private |
|
6031 * @param {Object} object The object to query. |
|
6032 * @returns {Array} Returns the array of symbols. |
|
6033 */ |
|
6034 var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { |
|
6035 var result = []; |
|
6036 while (object) { |
|
6037 arrayPush(result, getSymbols(object)); |
|
6038 object = getPrototype(object); |
|
6039 } |
|
6040 return result; |
|
6041 }; |
|
6042 |
|
6043 /** |
|
6044 * Gets the `toStringTag` of `value`. |
|
6045 * |
|
6046 * @private |
|
6047 * @param {*} value The value to query. |
|
6048 * @returns {string} Returns the `toStringTag`. |
|
6049 */ |
|
6050 var getTag = baseGetTag; |
|
6051 |
|
6052 // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. |
|
6053 if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || |
|
6054 (Map && getTag(new Map) != mapTag) || |
|
6055 (Promise && getTag(Promise.resolve()) != promiseTag) || |
|
6056 (Set && getTag(new Set) != setTag) || |
|
6057 (WeakMap && getTag(new WeakMap) != weakMapTag)) { |
|
6058 getTag = function(value) { |
|
6059 var result = baseGetTag(value), |
|
6060 Ctor = result == objectTag ? value.constructor : undefined, |
|
6061 ctorString = Ctor ? toSource(Ctor) : ''; |
|
6062 |
|
6063 if (ctorString) { |
|
6064 switch (ctorString) { |
|
6065 case dataViewCtorString: return dataViewTag; |
|
6066 case mapCtorString: return mapTag; |
|
6067 case promiseCtorString: return promiseTag; |
|
6068 case setCtorString: return setTag; |
|
6069 case weakMapCtorString: return weakMapTag; |
|
6070 } |
|
6071 } |
|
6072 return result; |
|
6073 }; |
|
6074 } |
|
6075 |
|
6076 /** |
|
6077 * Gets the view, applying any `transforms` to the `start` and `end` positions. |
|
6078 * |
|
6079 * @private |
|
6080 * @param {number} start The start of the view. |
|
6081 * @param {number} end The end of the view. |
|
6082 * @param {Array} transforms The transformations to apply to the view. |
|
6083 * @returns {Object} Returns an object containing the `start` and `end` |
|
6084 * positions of the view. |
|
6085 */ |
|
6086 function getView(start, end, transforms) { |
|
6087 var index = -1, |
|
6088 length = transforms.length; |
|
6089 |
|
6090 while (++index < length) { |
|
6091 var data = transforms[index], |
|
6092 size = data.size; |
|
6093 |
|
6094 switch (data.type) { |
|
6095 case 'drop': start += size; break; |
|
6096 case 'dropRight': end -= size; break; |
|
6097 case 'take': end = nativeMin(end, start + size); break; |
|
6098 case 'takeRight': start = nativeMax(start, end - size); break; |
|
6099 } |
|
6100 } |
|
6101 return { 'start': start, 'end': end }; |
|
6102 } |
|
6103 |
|
6104 /** |
|
6105 * Extracts wrapper details from the `source` body comment. |
|
6106 * |
|
6107 * @private |
|
6108 * @param {string} source The source to inspect. |
|
6109 * @returns {Array} Returns the wrapper details. |
|
6110 */ |
|
6111 function getWrapDetails(source) { |
|
6112 var match = source.match(reWrapDetails); |
|
6113 return match ? match[1].split(reSplitDetails) : []; |
|
6114 } |
|
6115 |
|
6116 /** |
|
6117 * Checks if `path` exists on `object`. |
|
6118 * |
|
6119 * @private |
|
6120 * @param {Object} object The object to query. |
|
6121 * @param {Array|string} path The path to check. |
|
6122 * @param {Function} hasFunc The function to check properties. |
|
6123 * @returns {boolean} Returns `true` if `path` exists, else `false`. |
|
6124 */ |
|
6125 function hasPath(object, path, hasFunc) { |
|
6126 path = castPath(path, object); |
|
6127 |
|
6128 var index = -1, |
|
6129 length = path.length, |
|
6130 result = false; |
|
6131 |
|
6132 while (++index < length) { |
|
6133 var key = toKey(path[index]); |
|
6134 if (!(result = object != null && hasFunc(object, key))) { |
|
6135 break; |
|
6136 } |
|
6137 object = object[key]; |
|
6138 } |
|
6139 if (result || ++index != length) { |
|
6140 return result; |
|
6141 } |
|
6142 length = object == null ? 0 : object.length; |
|
6143 return !!length && isLength(length) && isIndex(key, length) && |
|
6144 (isArray(object) || isArguments(object)); |
|
6145 } |
|
6146 |
|
6147 /** |
|
6148 * Initializes an array clone. |
|
6149 * |
|
6150 * @private |
|
6151 * @param {Array} array The array to clone. |
|
6152 * @returns {Array} Returns the initialized clone. |
|
6153 */ |
|
6154 function initCloneArray(array) { |
|
6155 var length = array.length, |
|
6156 result = new array.constructor(length); |
|
6157 |
|
6158 // Add properties assigned by `RegExp#exec`. |
|
6159 if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { |
|
6160 result.index = array.index; |
|
6161 result.input = array.input; |
|
6162 } |
|
6163 return result; |
|
6164 } |
|
6165 |
|
6166 /** |
|
6167 * Initializes an object clone. |
|
6168 * |
|
6169 * @private |
|
6170 * @param {Object} object The object to clone. |
|
6171 * @returns {Object} Returns the initialized clone. |
|
6172 */ |
|
6173 function initCloneObject(object) { |
|
6174 return (typeof object.constructor == 'function' && !isPrototype(object)) |
|
6175 ? baseCreate(getPrototype(object)) |
|
6176 : {}; |
|
6177 } |
|
6178 |
|
6179 /** |
|
6180 * Initializes an object clone based on its `toStringTag`. |
|
6181 * |
|
6182 * **Note:** This function only supports cloning values with tags of |
|
6183 * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. |
|
6184 * |
|
6185 * @private |
|
6186 * @param {Object} object The object to clone. |
|
6187 * @param {string} tag The `toStringTag` of the object to clone. |
|
6188 * @param {boolean} [isDeep] Specify a deep clone. |
|
6189 * @returns {Object} Returns the initialized clone. |
|
6190 */ |
|
6191 function initCloneByTag(object, tag, isDeep) { |
|
6192 var Ctor = object.constructor; |
|
6193 switch (tag) { |
|
6194 case arrayBufferTag: |
|
6195 return cloneArrayBuffer(object); |
|
6196 |
|
6197 case boolTag: |
|
6198 case dateTag: |
|
6199 return new Ctor(+object); |
|
6200 |
|
6201 case dataViewTag: |
|
6202 return cloneDataView(object, isDeep); |
|
6203 |
|
6204 case float32Tag: case float64Tag: |
|
6205 case int8Tag: case int16Tag: case int32Tag: |
|
6206 case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: |
|
6207 return cloneTypedArray(object, isDeep); |
|
6208 |
|
6209 case mapTag: |
|
6210 return new Ctor; |
|
6211 |
|
6212 case numberTag: |
|
6213 case stringTag: |
|
6214 return new Ctor(object); |
|
6215 |
|
6216 case regexpTag: |
|
6217 return cloneRegExp(object); |
|
6218 |
|
6219 case setTag: |
|
6220 return new Ctor; |
|
6221 |
|
6222 case symbolTag: |
|
6223 return cloneSymbol(object); |
|
6224 } |
|
6225 } |
|
6226 |
|
6227 /** |
|
6228 * Inserts wrapper `details` in a comment at the top of the `source` body. |
|
6229 * |
|
6230 * @private |
|
6231 * @param {string} source The source to modify. |
|
6232 * @returns {Array} details The details to insert. |
|
6233 * @returns {string} Returns the modified source. |
|
6234 */ |
|
6235 function insertWrapDetails(source, details) { |
|
6236 var length = details.length; |
|
6237 if (!length) { |
|
6238 return source; |
|
6239 } |
|
6240 var lastIndex = length - 1; |
|
6241 details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; |
|
6242 details = details.join(length > 2 ? ', ' : ' '); |
|
6243 return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); |
|
6244 } |
|
6245 |
|
6246 /** |
|
6247 * Checks if `value` is a flattenable `arguments` object or array. |
|
6248 * |
|
6249 * @private |
|
6250 * @param {*} value The value to check. |
|
6251 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. |
|
6252 */ |
|
6253 function isFlattenable(value) { |
|
6254 return isArray(value) || isArguments(value) || |
|
6255 !!(spreadableSymbol && value && value[spreadableSymbol]); |
|
6256 } |
|
6257 |
|
6258 /** |
|
6259 * Checks if `value` is a valid array-like index. |
|
6260 * |
|
6261 * @private |
|
6262 * @param {*} value The value to check. |
|
6263 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. |
|
6264 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. |
|
6265 */ |
|
6266 function isIndex(value, length) { |
|
6267 var type = typeof value; |
|
6268 length = length == null ? MAX_SAFE_INTEGER : length; |
|
6269 |
|
6270 return !!length && |
|
6271 (type == 'number' || |
|
6272 (type != 'symbol' && reIsUint.test(value))) && |
|
6273 (value > -1 && value % 1 == 0 && value < length); |
|
6274 } |
|
6275 |
|
6276 /** |
|
6277 * Checks if the given arguments are from an iteratee call. |
|
6278 * |
|
6279 * @private |
|
6280 * @param {*} value The potential iteratee value argument. |
|
6281 * @param {*} index The potential iteratee index or key argument. |
|
6282 * @param {*} object The potential iteratee object argument. |
|
6283 * @returns {boolean} Returns `true` if the arguments are from an iteratee call, |
|
6284 * else `false`. |
|
6285 */ |
|
6286 function isIterateeCall(value, index, object) { |
|
6287 if (!isObject(object)) { |
|
6288 return false; |
|
6289 } |
|
6290 var type = typeof index; |
|
6291 if (type == 'number' |
|
6292 ? (isArrayLike(object) && isIndex(index, object.length)) |
|
6293 : (type == 'string' && index in object) |
|
6294 ) { |
|
6295 return eq(object[index], value); |
|
6296 } |
|
6297 return false; |
|
6298 } |
|
6299 |
|
6300 /** |
|
6301 * Checks if `value` is a property name and not a property path. |
|
6302 * |
|
6303 * @private |
|
6304 * @param {*} value The value to check. |
|
6305 * @param {Object} [object] The object to query keys on. |
|
6306 * @returns {boolean} Returns `true` if `value` is a property name, else `false`. |
|
6307 */ |
|
6308 function isKey(value, object) { |
|
6309 if (isArray(value)) { |
|
6310 return false; |
|
6311 } |
|
6312 var type = typeof value; |
|
6313 if (type == 'number' || type == 'symbol' || type == 'boolean' || |
|
6314 value == null || isSymbol(value)) { |
|
6315 return true; |
|
6316 } |
|
6317 return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || |
|
6318 (object != null && value in Object(object)); |
|
6319 } |
|
6320 |
|
6321 /** |
|
6322 * Checks if `value` is suitable for use as unique object key. |
|
6323 * |
|
6324 * @private |
|
6325 * @param {*} value The value to check. |
|
6326 * @returns {boolean} Returns `true` if `value` is suitable, else `false`. |
|
6327 */ |
|
6328 function isKeyable(value) { |
|
6329 var type = typeof value; |
|
6330 return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') |
|
6331 ? (value !== '__proto__') |
|
6332 : (value === null); |
|
6333 } |
|
6334 |
|
6335 /** |
|
6336 * Checks if `func` has a lazy counterpart. |
|
6337 * |
|
6338 * @private |
|
6339 * @param {Function} func The function to check. |
|
6340 * @returns {boolean} Returns `true` if `func` has a lazy counterpart, |
|
6341 * else `false`. |
|
6342 */ |
|
6343 function isLaziable(func) { |
|
6344 var funcName = getFuncName(func), |
|
6345 other = lodash[funcName]; |
|
6346 |
|
6347 if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { |
|
6348 return false; |
|
6349 } |
|
6350 if (func === other) { |
|
6351 return true; |
|
6352 } |
|
6353 var data = getData(other); |
|
6354 return !!data && func === data[0]; |
|
6355 } |
|
6356 |
|
6357 /** |
|
6358 * Checks if `func` has its source masked. |
|
6359 * |
|
6360 * @private |
|
6361 * @param {Function} func The function to check. |
|
6362 * @returns {boolean} Returns `true` if `func` is masked, else `false`. |
|
6363 */ |
|
6364 function isMasked(func) { |
|
6365 return !!maskSrcKey && (maskSrcKey in func); |
|
6366 } |
|
6367 |
|
6368 /** |
|
6369 * Checks if `func` is capable of being masked. |
|
6370 * |
|
6371 * @private |
|
6372 * @param {*} value The value to check. |
|
6373 * @returns {boolean} Returns `true` if `func` is maskable, else `false`. |
|
6374 */ |
|
6375 var isMaskable = coreJsData ? isFunction : stubFalse; |
|
6376 |
|
6377 /** |
|
6378 * Checks if `value` is likely a prototype object. |
|
6379 * |
|
6380 * @private |
|
6381 * @param {*} value The value to check. |
|
6382 * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. |
|
6383 */ |
|
6384 function isPrototype(value) { |
|
6385 var Ctor = value && value.constructor, |
|
6386 proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; |
|
6387 |
|
6388 return value === proto; |
|
6389 } |
|
6390 |
|
6391 /** |
|
6392 * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. |
|
6393 * |
|
6394 * @private |
|
6395 * @param {*} value The value to check. |
|
6396 * @returns {boolean} Returns `true` if `value` if suitable for strict |
|
6397 * equality comparisons, else `false`. |
|
6398 */ |
|
6399 function isStrictComparable(value) { |
|
6400 return value === value && !isObject(value); |
|
6401 } |
|
6402 |
|
6403 /** |
|
6404 * A specialized version of `matchesProperty` for source values suitable |
|
6405 * for strict equality comparisons, i.e. `===`. |
|
6406 * |
|
6407 * @private |
|
6408 * @param {string} key The key of the property to get. |
|
6409 * @param {*} srcValue The value to match. |
|
6410 * @returns {Function} Returns the new spec function. |
|
6411 */ |
|
6412 function matchesStrictComparable(key, srcValue) { |
|
6413 return function(object) { |
|
6414 if (object == null) { |
|
6415 return false; |
|
6416 } |
|
6417 return object[key] === srcValue && |
|
6418 (srcValue !== undefined || (key in Object(object))); |
|
6419 }; |
|
6420 } |
|
6421 |
|
6422 /** |
|
6423 * A specialized version of `_.memoize` which clears the memoized function's |
|
6424 * cache when it exceeds `MAX_MEMOIZE_SIZE`. |
|
6425 * |
|
6426 * @private |
|
6427 * @param {Function} func The function to have its output memoized. |
|
6428 * @returns {Function} Returns the new memoized function. |
|
6429 */ |
|
6430 function memoizeCapped(func) { |
|
6431 var result = memoize(func, function(key) { |
|
6432 if (cache.size === MAX_MEMOIZE_SIZE) { |
|
6433 cache.clear(); |
|
6434 } |
|
6435 return key; |
|
6436 }); |
|
6437 |
|
6438 var cache = result.cache; |
|
6439 return result; |
|
6440 } |
|
6441 |
|
6442 /** |
|
6443 * Merges the function metadata of `source` into `data`. |
|
6444 * |
|
6445 * Merging metadata reduces the number of wrappers used to invoke a function. |
|
6446 * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` |
|
6447 * may be applied regardless of execution order. Methods like `_.ary` and |
|
6448 * `_.rearg` modify function arguments, making the order in which they are |
|
6449 * executed important, preventing the merging of metadata. However, we make |
|
6450 * an exception for a safe combined case where curried functions have `_.ary` |
|
6451 * and or `_.rearg` applied. |
|
6452 * |
|
6453 * @private |
|
6454 * @param {Array} data The destination metadata. |
|
6455 * @param {Array} source The source metadata. |
|
6456 * @returns {Array} Returns `data`. |
|
6457 */ |
|
6458 function mergeData(data, source) { |
|
6459 var bitmask = data[1], |
|
6460 srcBitmask = source[1], |
|
6461 newBitmask = bitmask | srcBitmask, |
|
6462 isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); |
|
6463 |
|
6464 var isCombo = |
|
6465 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || |
|
6466 ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || |
|
6467 ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); |
|
6468 |
|
6469 // Exit early if metadata can't be merged. |
|
6470 if (!(isCommon || isCombo)) { |
|
6471 return data; |
|
6472 } |
|
6473 // Use source `thisArg` if available. |
|
6474 if (srcBitmask & WRAP_BIND_FLAG) { |
|
6475 data[2] = source[2]; |
|
6476 // Set when currying a bound function. |
|
6477 newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; |
|
6478 } |
|
6479 // Compose partial arguments. |
|
6480 var value = source[3]; |
|
6481 if (value) { |
|
6482 var partials = data[3]; |
|
6483 data[3] = partials ? composeArgs(partials, value, source[4]) : value; |
|
6484 data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; |
|
6485 } |
|
6486 // Compose partial right arguments. |
|
6487 value = source[5]; |
|
6488 if (value) { |
|
6489 partials = data[5]; |
|
6490 data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; |
|
6491 data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; |
|
6492 } |
|
6493 // Use source `argPos` if available. |
|
6494 value = source[7]; |
|
6495 if (value) { |
|
6496 data[7] = value; |
|
6497 } |
|
6498 // Use source `ary` if it's smaller. |
|
6499 if (srcBitmask & WRAP_ARY_FLAG) { |
|
6500 data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); |
|
6501 } |
|
6502 // Use source `arity` if one is not provided. |
|
6503 if (data[9] == null) { |
|
6504 data[9] = source[9]; |
|
6505 } |
|
6506 // Use source `func` and merge bitmasks. |
|
6507 data[0] = source[0]; |
|
6508 data[1] = newBitmask; |
|
6509 |
|
6510 return data; |
|
6511 } |
|
6512 |
|
6513 /** |
|
6514 * This function is like |
|
6515 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) |
|
6516 * except that it includes inherited enumerable properties. |
|
6517 * |
|
6518 * @private |
|
6519 * @param {Object} object The object to query. |
|
6520 * @returns {Array} Returns the array of property names. |
|
6521 */ |
|
6522 function nativeKeysIn(object) { |
|
6523 var result = []; |
|
6524 if (object != null) { |
|
6525 for (var key in Object(object)) { |
|
6526 result.push(key); |
|
6527 } |
|
6528 } |
|
6529 return result; |
|
6530 } |
|
6531 |
|
6532 /** |
|
6533 * Converts `value` to a string using `Object.prototype.toString`. |
|
6534 * |
|
6535 * @private |
|
6536 * @param {*} value The value to convert. |
|
6537 * @returns {string} Returns the converted string. |
|
6538 */ |
|
6539 function objectToString(value) { |
|
6540 return nativeObjectToString.call(value); |
|
6541 } |
|
6542 |
|
6543 /** |
|
6544 * A specialized version of `baseRest` which transforms the rest array. |
|
6545 * |
|
6546 * @private |
|
6547 * @param {Function} func The function to apply a rest parameter to. |
|
6548 * @param {number} [start=func.length-1] The start position of the rest parameter. |
|
6549 * @param {Function} transform The rest array transform. |
|
6550 * @returns {Function} Returns the new function. |
|
6551 */ |
|
6552 function overRest(func, start, transform) { |
|
6553 start = nativeMax(start === undefined ? (func.length - 1) : start, 0); |
|
6554 return function() { |
|
6555 var args = arguments, |
|
6556 index = -1, |
|
6557 length = nativeMax(args.length - start, 0), |
|
6558 array = Array(length); |
|
6559 |
|
6560 while (++index < length) { |
|
6561 array[index] = args[start + index]; |
|
6562 } |
|
6563 index = -1; |
|
6564 var otherArgs = Array(start + 1); |
|
6565 while (++index < start) { |
|
6566 otherArgs[index] = args[index]; |
|
6567 } |
|
6568 otherArgs[start] = transform(array); |
|
6569 return apply(func, this, otherArgs); |
|
6570 }; |
|
6571 } |
|
6572 |
|
6573 /** |
|
6574 * Gets the parent value at `path` of `object`. |
|
6575 * |
|
6576 * @private |
|
6577 * @param {Object} object The object to query. |
|
6578 * @param {Array} path The path to get the parent value of. |
|
6579 * @returns {*} Returns the parent value. |
|
6580 */ |
|
6581 function parent(object, path) { |
|
6582 return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); |
|
6583 } |
|
6584 |
|
6585 /** |
|
6586 * Reorder `array` according to the specified indexes where the element at |
|
6587 * the first index is assigned as the first element, the element at |
|
6588 * the second index is assigned as the second element, and so on. |
|
6589 * |
|
6590 * @private |
|
6591 * @param {Array} array The array to reorder. |
|
6592 * @param {Array} indexes The arranged array indexes. |
|
6593 * @returns {Array} Returns `array`. |
|
6594 */ |
|
6595 function reorder(array, indexes) { |
|
6596 var arrLength = array.length, |
|
6597 length = nativeMin(indexes.length, arrLength), |
|
6598 oldArray = copyArray(array); |
|
6599 |
|
6600 while (length--) { |
|
6601 var index = indexes[length]; |
|
6602 array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; |
|
6603 } |
|
6604 return array; |
|
6605 } |
|
6606 |
|
6607 /** |
|
6608 * Gets the value at `key`, unless `key` is "__proto__". |
|
6609 * |
|
6610 * @private |
|
6611 * @param {Object} object The object to query. |
|
6612 * @param {string} key The key of the property to get. |
|
6613 * @returns {*} Returns the property value. |
|
6614 */ |
|
6615 function safeGet(object, key) { |
|
6616 if (key == '__proto__') { |
|
6617 return; |
|
6618 } |
|
6619 |
|
6620 return object[key]; |
|
6621 } |
|
6622 |
|
6623 /** |
|
6624 * Sets metadata for `func`. |
|
6625 * |
|
6626 * **Note:** If this function becomes hot, i.e. is invoked a lot in a short |
|
6627 * period of time, it will trip its breaker and transition to an identity |
|
6628 * function to avoid garbage collection pauses in V8. See |
|
6629 * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) |
|
6630 * for more details. |
|
6631 * |
|
6632 * @private |
|
6633 * @param {Function} func The function to associate metadata with. |
|
6634 * @param {*} data The metadata. |
|
6635 * @returns {Function} Returns `func`. |
|
6636 */ |
|
6637 var setData = shortOut(baseSetData); |
|
6638 |
|
6639 /** |
|
6640 * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). |
|
6641 * |
|
6642 * @private |
|
6643 * @param {Function} func The function to delay. |
|
6644 * @param {number} wait The number of milliseconds to delay invocation. |
|
6645 * @returns {number|Object} Returns the timer id or timeout object. |
|
6646 */ |
|
6647 var setTimeout = ctxSetTimeout || function(func, wait) { |
|
6648 return root.setTimeout(func, wait); |
|
6649 }; |
|
6650 |
|
6651 /** |
|
6652 * Sets the `toString` method of `func` to return `string`. |
|
6653 * |
|
6654 * @private |
|
6655 * @param {Function} func The function to modify. |
|
6656 * @param {Function} string The `toString` result. |
|
6657 * @returns {Function} Returns `func`. |
|
6658 */ |
|
6659 var setToString = shortOut(baseSetToString); |
|
6660 |
|
6661 /** |
|
6662 * Sets the `toString` method of `wrapper` to mimic the source of `reference` |
|
6663 * with wrapper details in a comment at the top of the source body. |
|
6664 * |
|
6665 * @private |
|
6666 * @param {Function} wrapper The function to modify. |
|
6667 * @param {Function} reference The reference function. |
|
6668 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
6669 * @returns {Function} Returns `wrapper`. |
|
6670 */ |
|
6671 function setWrapToString(wrapper, reference, bitmask) { |
|
6672 var source = (reference + ''); |
|
6673 return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); |
|
6674 } |
|
6675 |
|
6676 /** |
|
6677 * Creates a function that'll short out and invoke `identity` instead |
|
6678 * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` |
|
6679 * milliseconds. |
|
6680 * |
|
6681 * @private |
|
6682 * @param {Function} func The function to restrict. |
|
6683 * @returns {Function} Returns the new shortable function. |
|
6684 */ |
|
6685 function shortOut(func) { |
|
6686 var count = 0, |
|
6687 lastCalled = 0; |
|
6688 |
|
6689 return function() { |
|
6690 var stamp = nativeNow(), |
|
6691 remaining = HOT_SPAN - (stamp - lastCalled); |
|
6692 |
|
6693 lastCalled = stamp; |
|
6694 if (remaining > 0) { |
|
6695 if (++count >= HOT_COUNT) { |
|
6696 return arguments[0]; |
|
6697 } |
|
6698 } else { |
|
6699 count = 0; |
|
6700 } |
|
6701 return func.apply(undefined, arguments); |
|
6702 }; |
|
6703 } |
|
6704 |
|
6705 /** |
|
6706 * A specialized version of `_.shuffle` which mutates and sets the size of `array`. |
|
6707 * |
|
6708 * @private |
|
6709 * @param {Array} array The array to shuffle. |
|
6710 * @param {number} [size=array.length] The size of `array`. |
|
6711 * @returns {Array} Returns `array`. |
|
6712 */ |
|
6713 function shuffleSelf(array, size) { |
|
6714 var index = -1, |
|
6715 length = array.length, |
|
6716 lastIndex = length - 1; |
|
6717 |
|
6718 size = size === undefined ? length : size; |
|
6719 while (++index < size) { |
|
6720 var rand = baseRandom(index, lastIndex), |
|
6721 value = array[rand]; |
|
6722 |
|
6723 array[rand] = array[index]; |
|
6724 array[index] = value; |
|
6725 } |
|
6726 array.length = size; |
|
6727 return array; |
|
6728 } |
|
6729 |
|
6730 /** |
|
6731 * Converts `string` to a property path array. |
|
6732 * |
|
6733 * @private |
|
6734 * @param {string} string The string to convert. |
|
6735 * @returns {Array} Returns the property path array. |
|
6736 */ |
|
6737 var stringToPath = memoizeCapped(function(string) { |
|
6738 var result = []; |
|
6739 if (string.charCodeAt(0) === 46 /* . */) { |
|
6740 result.push(''); |
|
6741 } |
|
6742 string.replace(rePropName, function(match, number, quote, subString) { |
|
6743 result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); |
|
6744 }); |
|
6745 return result; |
|
6746 }); |
|
6747 |
|
6748 /** |
|
6749 * Converts `value` to a string key if it's not a string or symbol. |
|
6750 * |
|
6751 * @private |
|
6752 * @param {*} value The value to inspect. |
|
6753 * @returns {string|symbol} Returns the key. |
|
6754 */ |
|
6755 function toKey(value) { |
|
6756 if (typeof value == 'string' || isSymbol(value)) { |
|
6757 return value; |
|
6758 } |
|
6759 var result = (value + ''); |
|
6760 return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; |
|
6761 } |
|
6762 |
|
6763 /** |
|
6764 * Converts `func` to its source code. |
|
6765 * |
|
6766 * @private |
|
6767 * @param {Function} func The function to convert. |
|
6768 * @returns {string} Returns the source code. |
|
6769 */ |
|
6770 function toSource(func) { |
|
6771 if (func != null) { |
|
6772 try { |
|
6773 return funcToString.call(func); |
|
6774 } catch (e) {} |
|
6775 try { |
|
6776 return (func + ''); |
|
6777 } catch (e) {} |
|
6778 } |
|
6779 return ''; |
|
6780 } |
|
6781 |
|
6782 /** |
|
6783 * Updates wrapper `details` based on `bitmask` flags. |
|
6784 * |
|
6785 * @private |
|
6786 * @returns {Array} details The details to modify. |
|
6787 * @param {number} bitmask The bitmask flags. See `createWrap` for more details. |
|
6788 * @returns {Array} Returns `details`. |
|
6789 */ |
|
6790 function updateWrapDetails(details, bitmask) { |
|
6791 arrayEach(wrapFlags, function(pair) { |
|
6792 var value = '_.' + pair[0]; |
|
6793 if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { |
|
6794 details.push(value); |
|
6795 } |
|
6796 }); |
|
6797 return details.sort(); |
|
6798 } |
|
6799 |
|
6800 /** |
|
6801 * Creates a clone of `wrapper`. |
|
6802 * |
|
6803 * @private |
|
6804 * @param {Object} wrapper The wrapper to clone. |
|
6805 * @returns {Object} Returns the cloned wrapper. |
|
6806 */ |
|
6807 function wrapperClone(wrapper) { |
|
6808 if (wrapper instanceof LazyWrapper) { |
|
6809 return wrapper.clone(); |
|
6810 } |
|
6811 var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); |
|
6812 result.__actions__ = copyArray(wrapper.__actions__); |
|
6813 result.__index__ = wrapper.__index__; |
|
6814 result.__values__ = wrapper.__values__; |
|
6815 return result; |
|
6816 } |
|
6817 |
|
6818 /*------------------------------------------------------------------------*/ |
|
6819 |
|
6820 /** |
|
6821 * Creates an array of elements split into groups the length of `size`. |
|
6822 * If `array` can't be split evenly, the final chunk will be the remaining |
|
6823 * elements. |
|
6824 * |
|
6825 * @static |
|
6826 * @memberOf _ |
|
6827 * @since 3.0.0 |
|
6828 * @category Array |
|
6829 * @param {Array} array The array to process. |
|
6830 * @param {number} [size=1] The length of each chunk |
|
6831 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
6832 * @returns {Array} Returns the new array of chunks. |
|
6833 * @example |
|
6834 * |
|
6835 * _.chunk(['a', 'b', 'c', 'd'], 2); |
|
6836 * // => [['a', 'b'], ['c', 'd']] |
|
6837 * |
|
6838 * _.chunk(['a', 'b', 'c', 'd'], 3); |
|
6839 * // => [['a', 'b', 'c'], ['d']] |
|
6840 */ |
|
6841 function chunk(array, size, guard) { |
|
6842 if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { |
|
6843 size = 1; |
|
6844 } else { |
|
6845 size = nativeMax(toInteger(size), 0); |
|
6846 } |
|
6847 var length = array == null ? 0 : array.length; |
|
6848 if (!length || size < 1) { |
|
6849 return []; |
|
6850 } |
|
6851 var index = 0, |
|
6852 resIndex = 0, |
|
6853 result = Array(nativeCeil(length / size)); |
|
6854 |
|
6855 while (index < length) { |
|
6856 result[resIndex++] = baseSlice(array, index, (index += size)); |
|
6857 } |
|
6858 return result; |
|
6859 } |
|
6860 |
|
6861 /** |
|
6862 * Creates an array with all falsey values removed. The values `false`, `null`, |
|
6863 * `0`, `""`, `undefined`, and `NaN` are falsey. |
|
6864 * |
|
6865 * @static |
|
6866 * @memberOf _ |
|
6867 * @since 0.1.0 |
|
6868 * @category Array |
|
6869 * @param {Array} array The array to compact. |
|
6870 * @returns {Array} Returns the new array of filtered values. |
|
6871 * @example |
|
6872 * |
|
6873 * _.compact([0, 1, false, 2, '', 3]); |
|
6874 * // => [1, 2, 3] |
|
6875 */ |
|
6876 function compact(array) { |
|
6877 var index = -1, |
|
6878 length = array == null ? 0 : array.length, |
|
6879 resIndex = 0, |
|
6880 result = []; |
|
6881 |
|
6882 while (++index < length) { |
|
6883 var value = array[index]; |
|
6884 if (value) { |
|
6885 result[resIndex++] = value; |
|
6886 } |
|
6887 } |
|
6888 return result; |
|
6889 } |
|
6890 |
|
6891 /** |
|
6892 * Creates a new array concatenating `array` with any additional arrays |
|
6893 * and/or values. |
|
6894 * |
|
6895 * @static |
|
6896 * @memberOf _ |
|
6897 * @since 4.0.0 |
|
6898 * @category Array |
|
6899 * @param {Array} array The array to concatenate. |
|
6900 * @param {...*} [values] The values to concatenate. |
|
6901 * @returns {Array} Returns the new concatenated array. |
|
6902 * @example |
|
6903 * |
|
6904 * var array = [1]; |
|
6905 * var other = _.concat(array, 2, [3], [[4]]); |
|
6906 * |
|
6907 * console.log(other); |
|
6908 * // => [1, 2, 3, [4]] |
|
6909 * |
|
6910 * console.log(array); |
|
6911 * // => [1] |
|
6912 */ |
|
6913 function concat() { |
|
6914 var length = arguments.length; |
|
6915 if (!length) { |
|
6916 return []; |
|
6917 } |
|
6918 var args = Array(length - 1), |
|
6919 array = arguments[0], |
|
6920 index = length; |
|
6921 |
|
6922 while (index--) { |
|
6923 args[index - 1] = arguments[index]; |
|
6924 } |
|
6925 return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); |
|
6926 } |
|
6927 |
|
6928 /** |
|
6929 * Creates an array of `array` values not included in the other given arrays |
|
6930 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
6931 * for equality comparisons. The order and references of result values are |
|
6932 * determined by the first array. |
|
6933 * |
|
6934 * **Note:** Unlike `_.pullAll`, this method returns a new array. |
|
6935 * |
|
6936 * @static |
|
6937 * @memberOf _ |
|
6938 * @since 0.1.0 |
|
6939 * @category Array |
|
6940 * @param {Array} array The array to inspect. |
|
6941 * @param {...Array} [values] The values to exclude. |
|
6942 * @returns {Array} Returns the new array of filtered values. |
|
6943 * @see _.without, _.xor |
|
6944 * @example |
|
6945 * |
|
6946 * _.difference([2, 1], [2, 3]); |
|
6947 * // => [1] |
|
6948 */ |
|
6949 var difference = baseRest(function(array, values) { |
|
6950 return isArrayLikeObject(array) |
|
6951 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) |
|
6952 : []; |
|
6953 }); |
|
6954 |
|
6955 /** |
|
6956 * This method is like `_.difference` except that it accepts `iteratee` which |
|
6957 * is invoked for each element of `array` and `values` to generate the criterion |
|
6958 * by which they're compared. The order and references of result values are |
|
6959 * determined by the first array. The iteratee is invoked with one argument: |
|
6960 * (value). |
|
6961 * |
|
6962 * **Note:** Unlike `_.pullAllBy`, this method returns a new array. |
|
6963 * |
|
6964 * @static |
|
6965 * @memberOf _ |
|
6966 * @since 4.0.0 |
|
6967 * @category Array |
|
6968 * @param {Array} array The array to inspect. |
|
6969 * @param {...Array} [values] The values to exclude. |
|
6970 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
6971 * @returns {Array} Returns the new array of filtered values. |
|
6972 * @example |
|
6973 * |
|
6974 * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); |
|
6975 * // => [1.2] |
|
6976 * |
|
6977 * // The `_.property` iteratee shorthand. |
|
6978 * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); |
|
6979 * // => [{ 'x': 2 }] |
|
6980 */ |
|
6981 var differenceBy = baseRest(function(array, values) { |
|
6982 var iteratee = last(values); |
|
6983 if (isArrayLikeObject(iteratee)) { |
|
6984 iteratee = undefined; |
|
6985 } |
|
6986 return isArrayLikeObject(array) |
|
6987 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) |
|
6988 : []; |
|
6989 }); |
|
6990 |
|
6991 /** |
|
6992 * This method is like `_.difference` except that it accepts `comparator` |
|
6993 * which is invoked to compare elements of `array` to `values`. The order and |
|
6994 * references of result values are determined by the first array. The comparator |
|
6995 * is invoked with two arguments: (arrVal, othVal). |
|
6996 * |
|
6997 * **Note:** Unlike `_.pullAllWith`, this method returns a new array. |
|
6998 * |
|
6999 * @static |
|
7000 * @memberOf _ |
|
7001 * @since 4.0.0 |
|
7002 * @category Array |
|
7003 * @param {Array} array The array to inspect. |
|
7004 * @param {...Array} [values] The values to exclude. |
|
7005 * @param {Function} [comparator] The comparator invoked per element. |
|
7006 * @returns {Array} Returns the new array of filtered values. |
|
7007 * @example |
|
7008 * |
|
7009 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; |
|
7010 * |
|
7011 * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); |
|
7012 * // => [{ 'x': 2, 'y': 1 }] |
|
7013 */ |
|
7014 var differenceWith = baseRest(function(array, values) { |
|
7015 var comparator = last(values); |
|
7016 if (isArrayLikeObject(comparator)) { |
|
7017 comparator = undefined; |
|
7018 } |
|
7019 return isArrayLikeObject(array) |
|
7020 ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) |
|
7021 : []; |
|
7022 }); |
|
7023 |
|
7024 /** |
|
7025 * Creates a slice of `array` with `n` elements dropped from the beginning. |
|
7026 * |
|
7027 * @static |
|
7028 * @memberOf _ |
|
7029 * @since 0.5.0 |
|
7030 * @category Array |
|
7031 * @param {Array} array The array to query. |
|
7032 * @param {number} [n=1] The number of elements to drop. |
|
7033 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
7034 * @returns {Array} Returns the slice of `array`. |
|
7035 * @example |
|
7036 * |
|
7037 * _.drop([1, 2, 3]); |
|
7038 * // => [2, 3] |
|
7039 * |
|
7040 * _.drop([1, 2, 3], 2); |
|
7041 * // => [3] |
|
7042 * |
|
7043 * _.drop([1, 2, 3], 5); |
|
7044 * // => [] |
|
7045 * |
|
7046 * _.drop([1, 2, 3], 0); |
|
7047 * // => [1, 2, 3] |
|
7048 */ |
|
7049 function drop(array, n, guard) { |
|
7050 var length = array == null ? 0 : array.length; |
|
7051 if (!length) { |
|
7052 return []; |
|
7053 } |
|
7054 n = (guard || n === undefined) ? 1 : toInteger(n); |
|
7055 return baseSlice(array, n < 0 ? 0 : n, length); |
|
7056 } |
|
7057 |
|
7058 /** |
|
7059 * Creates a slice of `array` with `n` elements dropped from the end. |
|
7060 * |
|
7061 * @static |
|
7062 * @memberOf _ |
|
7063 * @since 3.0.0 |
|
7064 * @category Array |
|
7065 * @param {Array} array The array to query. |
|
7066 * @param {number} [n=1] The number of elements to drop. |
|
7067 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
7068 * @returns {Array} Returns the slice of `array`. |
|
7069 * @example |
|
7070 * |
|
7071 * _.dropRight([1, 2, 3]); |
|
7072 * // => [1, 2] |
|
7073 * |
|
7074 * _.dropRight([1, 2, 3], 2); |
|
7075 * // => [1] |
|
7076 * |
|
7077 * _.dropRight([1, 2, 3], 5); |
|
7078 * // => [] |
|
7079 * |
|
7080 * _.dropRight([1, 2, 3], 0); |
|
7081 * // => [1, 2, 3] |
|
7082 */ |
|
7083 function dropRight(array, n, guard) { |
|
7084 var length = array == null ? 0 : array.length; |
|
7085 if (!length) { |
|
7086 return []; |
|
7087 } |
|
7088 n = (guard || n === undefined) ? 1 : toInteger(n); |
|
7089 n = length - n; |
|
7090 return baseSlice(array, 0, n < 0 ? 0 : n); |
|
7091 } |
|
7092 |
|
7093 /** |
|
7094 * Creates a slice of `array` excluding elements dropped from the end. |
|
7095 * Elements are dropped until `predicate` returns falsey. The predicate is |
|
7096 * invoked with three arguments: (value, index, array). |
|
7097 * |
|
7098 * @static |
|
7099 * @memberOf _ |
|
7100 * @since 3.0.0 |
|
7101 * @category Array |
|
7102 * @param {Array} array The array to query. |
|
7103 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
7104 * @returns {Array} Returns the slice of `array`. |
|
7105 * @example |
|
7106 * |
|
7107 * var users = [ |
|
7108 * { 'user': 'barney', 'active': true }, |
|
7109 * { 'user': 'fred', 'active': false }, |
|
7110 * { 'user': 'pebbles', 'active': false } |
|
7111 * ]; |
|
7112 * |
|
7113 * _.dropRightWhile(users, function(o) { return !o.active; }); |
|
7114 * // => objects for ['barney'] |
|
7115 * |
|
7116 * // The `_.matches` iteratee shorthand. |
|
7117 * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); |
|
7118 * // => objects for ['barney', 'fred'] |
|
7119 * |
|
7120 * // The `_.matchesProperty` iteratee shorthand. |
|
7121 * _.dropRightWhile(users, ['active', false]); |
|
7122 * // => objects for ['barney'] |
|
7123 * |
|
7124 * // The `_.property` iteratee shorthand. |
|
7125 * _.dropRightWhile(users, 'active'); |
|
7126 * // => objects for ['barney', 'fred', 'pebbles'] |
|
7127 */ |
|
7128 function dropRightWhile(array, predicate) { |
|
7129 return (array && array.length) |
|
7130 ? baseWhile(array, getIteratee(predicate, 3), true, true) |
|
7131 : []; |
|
7132 } |
|
7133 |
|
7134 /** |
|
7135 * Creates a slice of `array` excluding elements dropped from the beginning. |
|
7136 * Elements are dropped until `predicate` returns falsey. The predicate is |
|
7137 * invoked with three arguments: (value, index, array). |
|
7138 * |
|
7139 * @static |
|
7140 * @memberOf _ |
|
7141 * @since 3.0.0 |
|
7142 * @category Array |
|
7143 * @param {Array} array The array to query. |
|
7144 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
7145 * @returns {Array} Returns the slice of `array`. |
|
7146 * @example |
|
7147 * |
|
7148 * var users = [ |
|
7149 * { 'user': 'barney', 'active': false }, |
|
7150 * { 'user': 'fred', 'active': false }, |
|
7151 * { 'user': 'pebbles', 'active': true } |
|
7152 * ]; |
|
7153 * |
|
7154 * _.dropWhile(users, function(o) { return !o.active; }); |
|
7155 * // => objects for ['pebbles'] |
|
7156 * |
|
7157 * // The `_.matches` iteratee shorthand. |
|
7158 * _.dropWhile(users, { 'user': 'barney', 'active': false }); |
|
7159 * // => objects for ['fred', 'pebbles'] |
|
7160 * |
|
7161 * // The `_.matchesProperty` iteratee shorthand. |
|
7162 * _.dropWhile(users, ['active', false]); |
|
7163 * // => objects for ['pebbles'] |
|
7164 * |
|
7165 * // The `_.property` iteratee shorthand. |
|
7166 * _.dropWhile(users, 'active'); |
|
7167 * // => objects for ['barney', 'fred', 'pebbles'] |
|
7168 */ |
|
7169 function dropWhile(array, predicate) { |
|
7170 return (array && array.length) |
|
7171 ? baseWhile(array, getIteratee(predicate, 3), true) |
|
7172 : []; |
|
7173 } |
|
7174 |
|
7175 /** |
|
7176 * Fills elements of `array` with `value` from `start` up to, but not |
|
7177 * including, `end`. |
|
7178 * |
|
7179 * **Note:** This method mutates `array`. |
|
7180 * |
|
7181 * @static |
|
7182 * @memberOf _ |
|
7183 * @since 3.2.0 |
|
7184 * @category Array |
|
7185 * @param {Array} array The array to fill. |
|
7186 * @param {*} value The value to fill `array` with. |
|
7187 * @param {number} [start=0] The start position. |
|
7188 * @param {number} [end=array.length] The end position. |
|
7189 * @returns {Array} Returns `array`. |
|
7190 * @example |
|
7191 * |
|
7192 * var array = [1, 2, 3]; |
|
7193 * |
|
7194 * _.fill(array, 'a'); |
|
7195 * console.log(array); |
|
7196 * // => ['a', 'a', 'a'] |
|
7197 * |
|
7198 * _.fill(Array(3), 2); |
|
7199 * // => [2, 2, 2] |
|
7200 * |
|
7201 * _.fill([4, 6, 8, 10], '*', 1, 3); |
|
7202 * // => [4, '*', '*', 10] |
|
7203 */ |
|
7204 function fill(array, value, start, end) { |
|
7205 var length = array == null ? 0 : array.length; |
|
7206 if (!length) { |
|
7207 return []; |
|
7208 } |
|
7209 if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { |
|
7210 start = 0; |
|
7211 end = length; |
|
7212 } |
|
7213 return baseFill(array, value, start, end); |
|
7214 } |
|
7215 |
|
7216 /** |
|
7217 * This method is like `_.find` except that it returns the index of the first |
|
7218 * element `predicate` returns truthy for instead of the element itself. |
|
7219 * |
|
7220 * @static |
|
7221 * @memberOf _ |
|
7222 * @since 1.1.0 |
|
7223 * @category Array |
|
7224 * @param {Array} array The array to inspect. |
|
7225 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
7226 * @param {number} [fromIndex=0] The index to search from. |
|
7227 * @returns {number} Returns the index of the found element, else `-1`. |
|
7228 * @example |
|
7229 * |
|
7230 * var users = [ |
|
7231 * { 'user': 'barney', 'active': false }, |
|
7232 * { 'user': 'fred', 'active': false }, |
|
7233 * { 'user': 'pebbles', 'active': true } |
|
7234 * ]; |
|
7235 * |
|
7236 * _.findIndex(users, function(o) { return o.user == 'barney'; }); |
|
7237 * // => 0 |
|
7238 * |
|
7239 * // The `_.matches` iteratee shorthand. |
|
7240 * _.findIndex(users, { 'user': 'fred', 'active': false }); |
|
7241 * // => 1 |
|
7242 * |
|
7243 * // The `_.matchesProperty` iteratee shorthand. |
|
7244 * _.findIndex(users, ['active', false]); |
|
7245 * // => 0 |
|
7246 * |
|
7247 * // The `_.property` iteratee shorthand. |
|
7248 * _.findIndex(users, 'active'); |
|
7249 * // => 2 |
|
7250 */ |
|
7251 function findIndex(array, predicate, fromIndex) { |
|
7252 var length = array == null ? 0 : array.length; |
|
7253 if (!length) { |
|
7254 return -1; |
|
7255 } |
|
7256 var index = fromIndex == null ? 0 : toInteger(fromIndex); |
|
7257 if (index < 0) { |
|
7258 index = nativeMax(length + index, 0); |
|
7259 } |
|
7260 return baseFindIndex(array, getIteratee(predicate, 3), index); |
|
7261 } |
|
7262 |
|
7263 /** |
|
7264 * This method is like `_.findIndex` except that it iterates over elements |
|
7265 * of `collection` from right to left. |
|
7266 * |
|
7267 * @static |
|
7268 * @memberOf _ |
|
7269 * @since 2.0.0 |
|
7270 * @category Array |
|
7271 * @param {Array} array The array to inspect. |
|
7272 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
7273 * @param {number} [fromIndex=array.length-1] The index to search from. |
|
7274 * @returns {number} Returns the index of the found element, else `-1`. |
|
7275 * @example |
|
7276 * |
|
7277 * var users = [ |
|
7278 * { 'user': 'barney', 'active': true }, |
|
7279 * { 'user': 'fred', 'active': false }, |
|
7280 * { 'user': 'pebbles', 'active': false } |
|
7281 * ]; |
|
7282 * |
|
7283 * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); |
|
7284 * // => 2 |
|
7285 * |
|
7286 * // The `_.matches` iteratee shorthand. |
|
7287 * _.findLastIndex(users, { 'user': 'barney', 'active': true }); |
|
7288 * // => 0 |
|
7289 * |
|
7290 * // The `_.matchesProperty` iteratee shorthand. |
|
7291 * _.findLastIndex(users, ['active', false]); |
|
7292 * // => 2 |
|
7293 * |
|
7294 * // The `_.property` iteratee shorthand. |
|
7295 * _.findLastIndex(users, 'active'); |
|
7296 * // => 0 |
|
7297 */ |
|
7298 function findLastIndex(array, predicate, fromIndex) { |
|
7299 var length = array == null ? 0 : array.length; |
|
7300 if (!length) { |
|
7301 return -1; |
|
7302 } |
|
7303 var index = length - 1; |
|
7304 if (fromIndex !== undefined) { |
|
7305 index = toInteger(fromIndex); |
|
7306 index = fromIndex < 0 |
|
7307 ? nativeMax(length + index, 0) |
|
7308 : nativeMin(index, length - 1); |
|
7309 } |
|
7310 return baseFindIndex(array, getIteratee(predicate, 3), index, true); |
|
7311 } |
|
7312 |
|
7313 /** |
|
7314 * Flattens `array` a single level deep. |
|
7315 * |
|
7316 * @static |
|
7317 * @memberOf _ |
|
7318 * @since 0.1.0 |
|
7319 * @category Array |
|
7320 * @param {Array} array The array to flatten. |
|
7321 * @returns {Array} Returns the new flattened array. |
|
7322 * @example |
|
7323 * |
|
7324 * _.flatten([1, [2, [3, [4]], 5]]); |
|
7325 * // => [1, 2, [3, [4]], 5] |
|
7326 */ |
|
7327 function flatten(array) { |
|
7328 var length = array == null ? 0 : array.length; |
|
7329 return length ? baseFlatten(array, 1) : []; |
|
7330 } |
|
7331 |
|
7332 /** |
|
7333 * Recursively flattens `array`. |
|
7334 * |
|
7335 * @static |
|
7336 * @memberOf _ |
|
7337 * @since 3.0.0 |
|
7338 * @category Array |
|
7339 * @param {Array} array The array to flatten. |
|
7340 * @returns {Array} Returns the new flattened array. |
|
7341 * @example |
|
7342 * |
|
7343 * _.flattenDeep([1, [2, [3, [4]], 5]]); |
|
7344 * // => [1, 2, 3, 4, 5] |
|
7345 */ |
|
7346 function flattenDeep(array) { |
|
7347 var length = array == null ? 0 : array.length; |
|
7348 return length ? baseFlatten(array, INFINITY) : []; |
|
7349 } |
|
7350 |
|
7351 /** |
|
7352 * Recursively flatten `array` up to `depth` times. |
|
7353 * |
|
7354 * @static |
|
7355 * @memberOf _ |
|
7356 * @since 4.4.0 |
|
7357 * @category Array |
|
7358 * @param {Array} array The array to flatten. |
|
7359 * @param {number} [depth=1] The maximum recursion depth. |
|
7360 * @returns {Array} Returns the new flattened array. |
|
7361 * @example |
|
7362 * |
|
7363 * var array = [1, [2, [3, [4]], 5]]; |
|
7364 * |
|
7365 * _.flattenDepth(array, 1); |
|
7366 * // => [1, 2, [3, [4]], 5] |
|
7367 * |
|
7368 * _.flattenDepth(array, 2); |
|
7369 * // => [1, 2, 3, [4], 5] |
|
7370 */ |
|
7371 function flattenDepth(array, depth) { |
|
7372 var length = array == null ? 0 : array.length; |
|
7373 if (!length) { |
|
7374 return []; |
|
7375 } |
|
7376 depth = depth === undefined ? 1 : toInteger(depth); |
|
7377 return baseFlatten(array, depth); |
|
7378 } |
|
7379 |
|
7380 /** |
|
7381 * The inverse of `_.toPairs`; this method returns an object composed |
|
7382 * from key-value `pairs`. |
|
7383 * |
|
7384 * @static |
|
7385 * @memberOf _ |
|
7386 * @since 4.0.0 |
|
7387 * @category Array |
|
7388 * @param {Array} pairs The key-value pairs. |
|
7389 * @returns {Object} Returns the new object. |
|
7390 * @example |
|
7391 * |
|
7392 * _.fromPairs([['a', 1], ['b', 2]]); |
|
7393 * // => { 'a': 1, 'b': 2 } |
|
7394 */ |
|
7395 function fromPairs(pairs) { |
|
7396 var index = -1, |
|
7397 length = pairs == null ? 0 : pairs.length, |
|
7398 result = {}; |
|
7399 |
|
7400 while (++index < length) { |
|
7401 var pair = pairs[index]; |
|
7402 result[pair[0]] = pair[1]; |
|
7403 } |
|
7404 return result; |
|
7405 } |
|
7406 |
|
7407 /** |
|
7408 * Gets the first element of `array`. |
|
7409 * |
|
7410 * @static |
|
7411 * @memberOf _ |
|
7412 * @since 0.1.0 |
|
7413 * @alias first |
|
7414 * @category Array |
|
7415 * @param {Array} array The array to query. |
|
7416 * @returns {*} Returns the first element of `array`. |
|
7417 * @example |
|
7418 * |
|
7419 * _.head([1, 2, 3]); |
|
7420 * // => 1 |
|
7421 * |
|
7422 * _.head([]); |
|
7423 * // => undefined |
|
7424 */ |
|
7425 function head(array) { |
|
7426 return (array && array.length) ? array[0] : undefined; |
|
7427 } |
|
7428 |
|
7429 /** |
|
7430 * Gets the index at which the first occurrence of `value` is found in `array` |
|
7431 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
7432 * for equality comparisons. If `fromIndex` is negative, it's used as the |
|
7433 * offset from the end of `array`. |
|
7434 * |
|
7435 * @static |
|
7436 * @memberOf _ |
|
7437 * @since 0.1.0 |
|
7438 * @category Array |
|
7439 * @param {Array} array The array to inspect. |
|
7440 * @param {*} value The value to search for. |
|
7441 * @param {number} [fromIndex=0] The index to search from. |
|
7442 * @returns {number} Returns the index of the matched value, else `-1`. |
|
7443 * @example |
|
7444 * |
|
7445 * _.indexOf([1, 2, 1, 2], 2); |
|
7446 * // => 1 |
|
7447 * |
|
7448 * // Search from the `fromIndex`. |
|
7449 * _.indexOf([1, 2, 1, 2], 2, 2); |
|
7450 * // => 3 |
|
7451 */ |
|
7452 function indexOf(array, value, fromIndex) { |
|
7453 var length = array == null ? 0 : array.length; |
|
7454 if (!length) { |
|
7455 return -1; |
|
7456 } |
|
7457 var index = fromIndex == null ? 0 : toInteger(fromIndex); |
|
7458 if (index < 0) { |
|
7459 index = nativeMax(length + index, 0); |
|
7460 } |
|
7461 return baseIndexOf(array, value, index); |
|
7462 } |
|
7463 |
|
7464 /** |
|
7465 * Gets all but the last element of `array`. |
|
7466 * |
|
7467 * @static |
|
7468 * @memberOf _ |
|
7469 * @since 0.1.0 |
|
7470 * @category Array |
|
7471 * @param {Array} array The array to query. |
|
7472 * @returns {Array} Returns the slice of `array`. |
|
7473 * @example |
|
7474 * |
|
7475 * _.initial([1, 2, 3]); |
|
7476 * // => [1, 2] |
|
7477 */ |
|
7478 function initial(array) { |
|
7479 var length = array == null ? 0 : array.length; |
|
7480 return length ? baseSlice(array, 0, -1) : []; |
|
7481 } |
|
7482 |
|
7483 /** |
|
7484 * Creates an array of unique values that are included in all given arrays |
|
7485 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
7486 * for equality comparisons. The order and references of result values are |
|
7487 * determined by the first array. |
|
7488 * |
|
7489 * @static |
|
7490 * @memberOf _ |
|
7491 * @since 0.1.0 |
|
7492 * @category Array |
|
7493 * @param {...Array} [arrays] The arrays to inspect. |
|
7494 * @returns {Array} Returns the new array of intersecting values. |
|
7495 * @example |
|
7496 * |
|
7497 * _.intersection([2, 1], [2, 3]); |
|
7498 * // => [2] |
|
7499 */ |
|
7500 var intersection = baseRest(function(arrays) { |
|
7501 var mapped = arrayMap(arrays, castArrayLikeObject); |
|
7502 return (mapped.length && mapped[0] === arrays[0]) |
|
7503 ? baseIntersection(mapped) |
|
7504 : []; |
|
7505 }); |
|
7506 |
|
7507 /** |
|
7508 * This method is like `_.intersection` except that it accepts `iteratee` |
|
7509 * which is invoked for each element of each `arrays` to generate the criterion |
|
7510 * by which they're compared. The order and references of result values are |
|
7511 * determined by the first array. The iteratee is invoked with one argument: |
|
7512 * (value). |
|
7513 * |
|
7514 * @static |
|
7515 * @memberOf _ |
|
7516 * @since 4.0.0 |
|
7517 * @category Array |
|
7518 * @param {...Array} [arrays] The arrays to inspect. |
|
7519 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
7520 * @returns {Array} Returns the new array of intersecting values. |
|
7521 * @example |
|
7522 * |
|
7523 * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); |
|
7524 * // => [2.1] |
|
7525 * |
|
7526 * // The `_.property` iteratee shorthand. |
|
7527 * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); |
|
7528 * // => [{ 'x': 1 }] |
|
7529 */ |
|
7530 var intersectionBy = baseRest(function(arrays) { |
|
7531 var iteratee = last(arrays), |
|
7532 mapped = arrayMap(arrays, castArrayLikeObject); |
|
7533 |
|
7534 if (iteratee === last(mapped)) { |
|
7535 iteratee = undefined; |
|
7536 } else { |
|
7537 mapped.pop(); |
|
7538 } |
|
7539 return (mapped.length && mapped[0] === arrays[0]) |
|
7540 ? baseIntersection(mapped, getIteratee(iteratee, 2)) |
|
7541 : []; |
|
7542 }); |
|
7543 |
|
7544 /** |
|
7545 * This method is like `_.intersection` except that it accepts `comparator` |
|
7546 * which is invoked to compare elements of `arrays`. The order and references |
|
7547 * of result values are determined by the first array. The comparator is |
|
7548 * invoked with two arguments: (arrVal, othVal). |
|
7549 * |
|
7550 * @static |
|
7551 * @memberOf _ |
|
7552 * @since 4.0.0 |
|
7553 * @category Array |
|
7554 * @param {...Array} [arrays] The arrays to inspect. |
|
7555 * @param {Function} [comparator] The comparator invoked per element. |
|
7556 * @returns {Array} Returns the new array of intersecting values. |
|
7557 * @example |
|
7558 * |
|
7559 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; |
|
7560 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; |
|
7561 * |
|
7562 * _.intersectionWith(objects, others, _.isEqual); |
|
7563 * // => [{ 'x': 1, 'y': 2 }] |
|
7564 */ |
|
7565 var intersectionWith = baseRest(function(arrays) { |
|
7566 var comparator = last(arrays), |
|
7567 mapped = arrayMap(arrays, castArrayLikeObject); |
|
7568 |
|
7569 comparator = typeof comparator == 'function' ? comparator : undefined; |
|
7570 if (comparator) { |
|
7571 mapped.pop(); |
|
7572 } |
|
7573 return (mapped.length && mapped[0] === arrays[0]) |
|
7574 ? baseIntersection(mapped, undefined, comparator) |
|
7575 : []; |
|
7576 }); |
|
7577 |
|
7578 /** |
|
7579 * Converts all elements in `array` into a string separated by `separator`. |
|
7580 * |
|
7581 * @static |
|
7582 * @memberOf _ |
|
7583 * @since 4.0.0 |
|
7584 * @category Array |
|
7585 * @param {Array} array The array to convert. |
|
7586 * @param {string} [separator=','] The element separator. |
|
7587 * @returns {string} Returns the joined string. |
|
7588 * @example |
|
7589 * |
|
7590 * _.join(['a', 'b', 'c'], '~'); |
|
7591 * // => 'a~b~c' |
|
7592 */ |
|
7593 function join(array, separator) { |
|
7594 return array == null ? '' : nativeJoin.call(array, separator); |
|
7595 } |
|
7596 |
|
7597 /** |
|
7598 * Gets the last element of `array`. |
|
7599 * |
|
7600 * @static |
|
7601 * @memberOf _ |
|
7602 * @since 0.1.0 |
|
7603 * @category Array |
|
7604 * @param {Array} array The array to query. |
|
7605 * @returns {*} Returns the last element of `array`. |
|
7606 * @example |
|
7607 * |
|
7608 * _.last([1, 2, 3]); |
|
7609 * // => 3 |
|
7610 */ |
|
7611 function last(array) { |
|
7612 var length = array == null ? 0 : array.length; |
|
7613 return length ? array[length - 1] : undefined; |
|
7614 } |
|
7615 |
|
7616 /** |
|
7617 * This method is like `_.indexOf` except that it iterates over elements of |
|
7618 * `array` from right to left. |
|
7619 * |
|
7620 * @static |
|
7621 * @memberOf _ |
|
7622 * @since 0.1.0 |
|
7623 * @category Array |
|
7624 * @param {Array} array The array to inspect. |
|
7625 * @param {*} value The value to search for. |
|
7626 * @param {number} [fromIndex=array.length-1] The index to search from. |
|
7627 * @returns {number} Returns the index of the matched value, else `-1`. |
|
7628 * @example |
|
7629 * |
|
7630 * _.lastIndexOf([1, 2, 1, 2], 2); |
|
7631 * // => 3 |
|
7632 * |
|
7633 * // Search from the `fromIndex`. |
|
7634 * _.lastIndexOf([1, 2, 1, 2], 2, 2); |
|
7635 * // => 1 |
|
7636 */ |
|
7637 function lastIndexOf(array, value, fromIndex) { |
|
7638 var length = array == null ? 0 : array.length; |
|
7639 if (!length) { |
|
7640 return -1; |
|
7641 } |
|
7642 var index = length; |
|
7643 if (fromIndex !== undefined) { |
|
7644 index = toInteger(fromIndex); |
|
7645 index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); |
|
7646 } |
|
7647 return value === value |
|
7648 ? strictLastIndexOf(array, value, index) |
|
7649 : baseFindIndex(array, baseIsNaN, index, true); |
|
7650 } |
|
7651 |
|
7652 /** |
|
7653 * Gets the element at index `n` of `array`. If `n` is negative, the nth |
|
7654 * element from the end is returned. |
|
7655 * |
|
7656 * @static |
|
7657 * @memberOf _ |
|
7658 * @since 4.11.0 |
|
7659 * @category Array |
|
7660 * @param {Array} array The array to query. |
|
7661 * @param {number} [n=0] The index of the element to return. |
|
7662 * @returns {*} Returns the nth element of `array`. |
|
7663 * @example |
|
7664 * |
|
7665 * var array = ['a', 'b', 'c', 'd']; |
|
7666 * |
|
7667 * _.nth(array, 1); |
|
7668 * // => 'b' |
|
7669 * |
|
7670 * _.nth(array, -2); |
|
7671 * // => 'c'; |
|
7672 */ |
|
7673 function nth(array, n) { |
|
7674 return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; |
|
7675 } |
|
7676 |
|
7677 /** |
|
7678 * Removes all given values from `array` using |
|
7679 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
7680 * for equality comparisons. |
|
7681 * |
|
7682 * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` |
|
7683 * to remove elements from an array by predicate. |
|
7684 * |
|
7685 * @static |
|
7686 * @memberOf _ |
|
7687 * @since 2.0.0 |
|
7688 * @category Array |
|
7689 * @param {Array} array The array to modify. |
|
7690 * @param {...*} [values] The values to remove. |
|
7691 * @returns {Array} Returns `array`. |
|
7692 * @example |
|
7693 * |
|
7694 * var array = ['a', 'b', 'c', 'a', 'b', 'c']; |
|
7695 * |
|
7696 * _.pull(array, 'a', 'c'); |
|
7697 * console.log(array); |
|
7698 * // => ['b', 'b'] |
|
7699 */ |
|
7700 var pull = baseRest(pullAll); |
|
7701 |
|
7702 /** |
|
7703 * This method is like `_.pull` except that it accepts an array of values to remove. |
|
7704 * |
|
7705 * **Note:** Unlike `_.difference`, this method mutates `array`. |
|
7706 * |
|
7707 * @static |
|
7708 * @memberOf _ |
|
7709 * @since 4.0.0 |
|
7710 * @category Array |
|
7711 * @param {Array} array The array to modify. |
|
7712 * @param {Array} values The values to remove. |
|
7713 * @returns {Array} Returns `array`. |
|
7714 * @example |
|
7715 * |
|
7716 * var array = ['a', 'b', 'c', 'a', 'b', 'c']; |
|
7717 * |
|
7718 * _.pullAll(array, ['a', 'c']); |
|
7719 * console.log(array); |
|
7720 * // => ['b', 'b'] |
|
7721 */ |
|
7722 function pullAll(array, values) { |
|
7723 return (array && array.length && values && values.length) |
|
7724 ? basePullAll(array, values) |
|
7725 : array; |
|
7726 } |
|
7727 |
|
7728 /** |
|
7729 * This method is like `_.pullAll` except that it accepts `iteratee` which is |
|
7730 * invoked for each element of `array` and `values` to generate the criterion |
|
7731 * by which they're compared. The iteratee is invoked with one argument: (value). |
|
7732 * |
|
7733 * **Note:** Unlike `_.differenceBy`, this method mutates `array`. |
|
7734 * |
|
7735 * @static |
|
7736 * @memberOf _ |
|
7737 * @since 4.0.0 |
|
7738 * @category Array |
|
7739 * @param {Array} array The array to modify. |
|
7740 * @param {Array} values The values to remove. |
|
7741 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
7742 * @returns {Array} Returns `array`. |
|
7743 * @example |
|
7744 * |
|
7745 * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; |
|
7746 * |
|
7747 * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); |
|
7748 * console.log(array); |
|
7749 * // => [{ 'x': 2 }] |
|
7750 */ |
|
7751 function pullAllBy(array, values, iteratee) { |
|
7752 return (array && array.length && values && values.length) |
|
7753 ? basePullAll(array, values, getIteratee(iteratee, 2)) |
|
7754 : array; |
|
7755 } |
|
7756 |
|
7757 /** |
|
7758 * This method is like `_.pullAll` except that it accepts `comparator` which |
|
7759 * is invoked to compare elements of `array` to `values`. The comparator is |
|
7760 * invoked with two arguments: (arrVal, othVal). |
|
7761 * |
|
7762 * **Note:** Unlike `_.differenceWith`, this method mutates `array`. |
|
7763 * |
|
7764 * @static |
|
7765 * @memberOf _ |
|
7766 * @since 4.6.0 |
|
7767 * @category Array |
|
7768 * @param {Array} array The array to modify. |
|
7769 * @param {Array} values The values to remove. |
|
7770 * @param {Function} [comparator] The comparator invoked per element. |
|
7771 * @returns {Array} Returns `array`. |
|
7772 * @example |
|
7773 * |
|
7774 * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; |
|
7775 * |
|
7776 * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); |
|
7777 * console.log(array); |
|
7778 * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] |
|
7779 */ |
|
7780 function pullAllWith(array, values, comparator) { |
|
7781 return (array && array.length && values && values.length) |
|
7782 ? basePullAll(array, values, undefined, comparator) |
|
7783 : array; |
|
7784 } |
|
7785 |
|
7786 /** |
|
7787 * Removes elements from `array` corresponding to `indexes` and returns an |
|
7788 * array of removed elements. |
|
7789 * |
|
7790 * **Note:** Unlike `_.at`, this method mutates `array`. |
|
7791 * |
|
7792 * @static |
|
7793 * @memberOf _ |
|
7794 * @since 3.0.0 |
|
7795 * @category Array |
|
7796 * @param {Array} array The array to modify. |
|
7797 * @param {...(number|number[])} [indexes] The indexes of elements to remove. |
|
7798 * @returns {Array} Returns the new array of removed elements. |
|
7799 * @example |
|
7800 * |
|
7801 * var array = ['a', 'b', 'c', 'd']; |
|
7802 * var pulled = _.pullAt(array, [1, 3]); |
|
7803 * |
|
7804 * console.log(array); |
|
7805 * // => ['a', 'c'] |
|
7806 * |
|
7807 * console.log(pulled); |
|
7808 * // => ['b', 'd'] |
|
7809 */ |
|
7810 var pullAt = flatRest(function(array, indexes) { |
|
7811 var length = array == null ? 0 : array.length, |
|
7812 result = baseAt(array, indexes); |
|
7813 |
|
7814 basePullAt(array, arrayMap(indexes, function(index) { |
|
7815 return isIndex(index, length) ? +index : index; |
|
7816 }).sort(compareAscending)); |
|
7817 |
|
7818 return result; |
|
7819 }); |
|
7820 |
|
7821 /** |
|
7822 * Removes all elements from `array` that `predicate` returns truthy for |
|
7823 * and returns an array of the removed elements. The predicate is invoked |
|
7824 * with three arguments: (value, index, array). |
|
7825 * |
|
7826 * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` |
|
7827 * to pull elements from an array by value. |
|
7828 * |
|
7829 * @static |
|
7830 * @memberOf _ |
|
7831 * @since 2.0.0 |
|
7832 * @category Array |
|
7833 * @param {Array} array The array to modify. |
|
7834 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
7835 * @returns {Array} Returns the new array of removed elements. |
|
7836 * @example |
|
7837 * |
|
7838 * var array = [1, 2, 3, 4]; |
|
7839 * var evens = _.remove(array, function(n) { |
|
7840 * return n % 2 == 0; |
|
7841 * }); |
|
7842 * |
|
7843 * console.log(array); |
|
7844 * // => [1, 3] |
|
7845 * |
|
7846 * console.log(evens); |
|
7847 * // => [2, 4] |
|
7848 */ |
|
7849 function remove(array, predicate) { |
|
7850 var result = []; |
|
7851 if (!(array && array.length)) { |
|
7852 return result; |
|
7853 } |
|
7854 var index = -1, |
|
7855 indexes = [], |
|
7856 length = array.length; |
|
7857 |
|
7858 predicate = getIteratee(predicate, 3); |
|
7859 while (++index < length) { |
|
7860 var value = array[index]; |
|
7861 if (predicate(value, index, array)) { |
|
7862 result.push(value); |
|
7863 indexes.push(index); |
|
7864 } |
|
7865 } |
|
7866 basePullAt(array, indexes); |
|
7867 return result; |
|
7868 } |
|
7869 |
|
7870 /** |
|
7871 * Reverses `array` so that the first element becomes the last, the second |
|
7872 * element becomes the second to last, and so on. |
|
7873 * |
|
7874 * **Note:** This method mutates `array` and is based on |
|
7875 * [`Array#reverse`](https://mdn.io/Array/reverse). |
|
7876 * |
|
7877 * @static |
|
7878 * @memberOf _ |
|
7879 * @since 4.0.0 |
|
7880 * @category Array |
|
7881 * @param {Array} array The array to modify. |
|
7882 * @returns {Array} Returns `array`. |
|
7883 * @example |
|
7884 * |
|
7885 * var array = [1, 2, 3]; |
|
7886 * |
|
7887 * _.reverse(array); |
|
7888 * // => [3, 2, 1] |
|
7889 * |
|
7890 * console.log(array); |
|
7891 * // => [3, 2, 1] |
|
7892 */ |
|
7893 function reverse(array) { |
|
7894 return array == null ? array : nativeReverse.call(array); |
|
7895 } |
|
7896 |
|
7897 /** |
|
7898 * Creates a slice of `array` from `start` up to, but not including, `end`. |
|
7899 * |
|
7900 * **Note:** This method is used instead of |
|
7901 * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are |
|
7902 * returned. |
|
7903 * |
|
7904 * @static |
|
7905 * @memberOf _ |
|
7906 * @since 3.0.0 |
|
7907 * @category Array |
|
7908 * @param {Array} array The array to slice. |
|
7909 * @param {number} [start=0] The start position. |
|
7910 * @param {number} [end=array.length] The end position. |
|
7911 * @returns {Array} Returns the slice of `array`. |
|
7912 */ |
|
7913 function slice(array, start, end) { |
|
7914 var length = array == null ? 0 : array.length; |
|
7915 if (!length) { |
|
7916 return []; |
|
7917 } |
|
7918 if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { |
|
7919 start = 0; |
|
7920 end = length; |
|
7921 } |
|
7922 else { |
|
7923 start = start == null ? 0 : toInteger(start); |
|
7924 end = end === undefined ? length : toInteger(end); |
|
7925 } |
|
7926 return baseSlice(array, start, end); |
|
7927 } |
|
7928 |
|
7929 /** |
|
7930 * Uses a binary search to determine the lowest index at which `value` |
|
7931 * should be inserted into `array` in order to maintain its sort order. |
|
7932 * |
|
7933 * @static |
|
7934 * @memberOf _ |
|
7935 * @since 0.1.0 |
|
7936 * @category Array |
|
7937 * @param {Array} array The sorted array to inspect. |
|
7938 * @param {*} value The value to evaluate. |
|
7939 * @returns {number} Returns the index at which `value` should be inserted |
|
7940 * into `array`. |
|
7941 * @example |
|
7942 * |
|
7943 * _.sortedIndex([30, 50], 40); |
|
7944 * // => 1 |
|
7945 */ |
|
7946 function sortedIndex(array, value) { |
|
7947 return baseSortedIndex(array, value); |
|
7948 } |
|
7949 |
|
7950 /** |
|
7951 * This method is like `_.sortedIndex` except that it accepts `iteratee` |
|
7952 * which is invoked for `value` and each element of `array` to compute their |
|
7953 * sort ranking. The iteratee is invoked with one argument: (value). |
|
7954 * |
|
7955 * @static |
|
7956 * @memberOf _ |
|
7957 * @since 4.0.0 |
|
7958 * @category Array |
|
7959 * @param {Array} array The sorted array to inspect. |
|
7960 * @param {*} value The value to evaluate. |
|
7961 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
7962 * @returns {number} Returns the index at which `value` should be inserted |
|
7963 * into `array`. |
|
7964 * @example |
|
7965 * |
|
7966 * var objects = [{ 'x': 4 }, { 'x': 5 }]; |
|
7967 * |
|
7968 * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); |
|
7969 * // => 0 |
|
7970 * |
|
7971 * // The `_.property` iteratee shorthand. |
|
7972 * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); |
|
7973 * // => 0 |
|
7974 */ |
|
7975 function sortedIndexBy(array, value, iteratee) { |
|
7976 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); |
|
7977 } |
|
7978 |
|
7979 /** |
|
7980 * This method is like `_.indexOf` except that it performs a binary |
|
7981 * search on a sorted `array`. |
|
7982 * |
|
7983 * @static |
|
7984 * @memberOf _ |
|
7985 * @since 4.0.0 |
|
7986 * @category Array |
|
7987 * @param {Array} array The array to inspect. |
|
7988 * @param {*} value The value to search for. |
|
7989 * @returns {number} Returns the index of the matched value, else `-1`. |
|
7990 * @example |
|
7991 * |
|
7992 * _.sortedIndexOf([4, 5, 5, 5, 6], 5); |
|
7993 * // => 1 |
|
7994 */ |
|
7995 function sortedIndexOf(array, value) { |
|
7996 var length = array == null ? 0 : array.length; |
|
7997 if (length) { |
|
7998 var index = baseSortedIndex(array, value); |
|
7999 if (index < length && eq(array[index], value)) { |
|
8000 return index; |
|
8001 } |
|
8002 } |
|
8003 return -1; |
|
8004 } |
|
8005 |
|
8006 /** |
|
8007 * This method is like `_.sortedIndex` except that it returns the highest |
|
8008 * index at which `value` should be inserted into `array` in order to |
|
8009 * maintain its sort order. |
|
8010 * |
|
8011 * @static |
|
8012 * @memberOf _ |
|
8013 * @since 3.0.0 |
|
8014 * @category Array |
|
8015 * @param {Array} array The sorted array to inspect. |
|
8016 * @param {*} value The value to evaluate. |
|
8017 * @returns {number} Returns the index at which `value` should be inserted |
|
8018 * into `array`. |
|
8019 * @example |
|
8020 * |
|
8021 * _.sortedLastIndex([4, 5, 5, 5, 6], 5); |
|
8022 * // => 4 |
|
8023 */ |
|
8024 function sortedLastIndex(array, value) { |
|
8025 return baseSortedIndex(array, value, true); |
|
8026 } |
|
8027 |
|
8028 /** |
|
8029 * This method is like `_.sortedLastIndex` except that it accepts `iteratee` |
|
8030 * which is invoked for `value` and each element of `array` to compute their |
|
8031 * sort ranking. The iteratee is invoked with one argument: (value). |
|
8032 * |
|
8033 * @static |
|
8034 * @memberOf _ |
|
8035 * @since 4.0.0 |
|
8036 * @category Array |
|
8037 * @param {Array} array The sorted array to inspect. |
|
8038 * @param {*} value The value to evaluate. |
|
8039 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
8040 * @returns {number} Returns the index at which `value` should be inserted |
|
8041 * into `array`. |
|
8042 * @example |
|
8043 * |
|
8044 * var objects = [{ 'x': 4 }, { 'x': 5 }]; |
|
8045 * |
|
8046 * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); |
|
8047 * // => 1 |
|
8048 * |
|
8049 * // The `_.property` iteratee shorthand. |
|
8050 * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); |
|
8051 * // => 1 |
|
8052 */ |
|
8053 function sortedLastIndexBy(array, value, iteratee) { |
|
8054 return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); |
|
8055 } |
|
8056 |
|
8057 /** |
|
8058 * This method is like `_.lastIndexOf` except that it performs a binary |
|
8059 * search on a sorted `array`. |
|
8060 * |
|
8061 * @static |
|
8062 * @memberOf _ |
|
8063 * @since 4.0.0 |
|
8064 * @category Array |
|
8065 * @param {Array} array The array to inspect. |
|
8066 * @param {*} value The value to search for. |
|
8067 * @returns {number} Returns the index of the matched value, else `-1`. |
|
8068 * @example |
|
8069 * |
|
8070 * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); |
|
8071 * // => 3 |
|
8072 */ |
|
8073 function sortedLastIndexOf(array, value) { |
|
8074 var length = array == null ? 0 : array.length; |
|
8075 if (length) { |
|
8076 var index = baseSortedIndex(array, value, true) - 1; |
|
8077 if (eq(array[index], value)) { |
|
8078 return index; |
|
8079 } |
|
8080 } |
|
8081 return -1; |
|
8082 } |
|
8083 |
|
8084 /** |
|
8085 * This method is like `_.uniq` except that it's designed and optimized |
|
8086 * for sorted arrays. |
|
8087 * |
|
8088 * @static |
|
8089 * @memberOf _ |
|
8090 * @since 4.0.0 |
|
8091 * @category Array |
|
8092 * @param {Array} array The array to inspect. |
|
8093 * @returns {Array} Returns the new duplicate free array. |
|
8094 * @example |
|
8095 * |
|
8096 * _.sortedUniq([1, 1, 2]); |
|
8097 * // => [1, 2] |
|
8098 */ |
|
8099 function sortedUniq(array) { |
|
8100 return (array && array.length) |
|
8101 ? baseSortedUniq(array) |
|
8102 : []; |
|
8103 } |
|
8104 |
|
8105 /** |
|
8106 * This method is like `_.uniqBy` except that it's designed and optimized |
|
8107 * for sorted arrays. |
|
8108 * |
|
8109 * @static |
|
8110 * @memberOf _ |
|
8111 * @since 4.0.0 |
|
8112 * @category Array |
|
8113 * @param {Array} array The array to inspect. |
|
8114 * @param {Function} [iteratee] The iteratee invoked per element. |
|
8115 * @returns {Array} Returns the new duplicate free array. |
|
8116 * @example |
|
8117 * |
|
8118 * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); |
|
8119 * // => [1.1, 2.3] |
|
8120 */ |
|
8121 function sortedUniqBy(array, iteratee) { |
|
8122 return (array && array.length) |
|
8123 ? baseSortedUniq(array, getIteratee(iteratee, 2)) |
|
8124 : []; |
|
8125 } |
|
8126 |
|
8127 /** |
|
8128 * Gets all but the first element of `array`. |
|
8129 * |
|
8130 * @static |
|
8131 * @memberOf _ |
|
8132 * @since 4.0.0 |
|
8133 * @category Array |
|
8134 * @param {Array} array The array to query. |
|
8135 * @returns {Array} Returns the slice of `array`. |
|
8136 * @example |
|
8137 * |
|
8138 * _.tail([1, 2, 3]); |
|
8139 * // => [2, 3] |
|
8140 */ |
|
8141 function tail(array) { |
|
8142 var length = array == null ? 0 : array.length; |
|
8143 return length ? baseSlice(array, 1, length) : []; |
|
8144 } |
|
8145 |
|
8146 /** |
|
8147 * Creates a slice of `array` with `n` elements taken from the beginning. |
|
8148 * |
|
8149 * @static |
|
8150 * @memberOf _ |
|
8151 * @since 0.1.0 |
|
8152 * @category Array |
|
8153 * @param {Array} array The array to query. |
|
8154 * @param {number} [n=1] The number of elements to take. |
|
8155 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
8156 * @returns {Array} Returns the slice of `array`. |
|
8157 * @example |
|
8158 * |
|
8159 * _.take([1, 2, 3]); |
|
8160 * // => [1] |
|
8161 * |
|
8162 * _.take([1, 2, 3], 2); |
|
8163 * // => [1, 2] |
|
8164 * |
|
8165 * _.take([1, 2, 3], 5); |
|
8166 * // => [1, 2, 3] |
|
8167 * |
|
8168 * _.take([1, 2, 3], 0); |
|
8169 * // => [] |
|
8170 */ |
|
8171 function take(array, n, guard) { |
|
8172 if (!(array && array.length)) { |
|
8173 return []; |
|
8174 } |
|
8175 n = (guard || n === undefined) ? 1 : toInteger(n); |
|
8176 return baseSlice(array, 0, n < 0 ? 0 : n); |
|
8177 } |
|
8178 |
|
8179 /** |
|
8180 * Creates a slice of `array` with `n` elements taken from the end. |
|
8181 * |
|
8182 * @static |
|
8183 * @memberOf _ |
|
8184 * @since 3.0.0 |
|
8185 * @category Array |
|
8186 * @param {Array} array The array to query. |
|
8187 * @param {number} [n=1] The number of elements to take. |
|
8188 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
8189 * @returns {Array} Returns the slice of `array`. |
|
8190 * @example |
|
8191 * |
|
8192 * _.takeRight([1, 2, 3]); |
|
8193 * // => [3] |
|
8194 * |
|
8195 * _.takeRight([1, 2, 3], 2); |
|
8196 * // => [2, 3] |
|
8197 * |
|
8198 * _.takeRight([1, 2, 3], 5); |
|
8199 * // => [1, 2, 3] |
|
8200 * |
|
8201 * _.takeRight([1, 2, 3], 0); |
|
8202 * // => [] |
|
8203 */ |
|
8204 function takeRight(array, n, guard) { |
|
8205 var length = array == null ? 0 : array.length; |
|
8206 if (!length) { |
|
8207 return []; |
|
8208 } |
|
8209 n = (guard || n === undefined) ? 1 : toInteger(n); |
|
8210 n = length - n; |
|
8211 return baseSlice(array, n < 0 ? 0 : n, length); |
|
8212 } |
|
8213 |
|
8214 /** |
|
8215 * Creates a slice of `array` with elements taken from the end. Elements are |
|
8216 * taken until `predicate` returns falsey. The predicate is invoked with |
|
8217 * three arguments: (value, index, array). |
|
8218 * |
|
8219 * @static |
|
8220 * @memberOf _ |
|
8221 * @since 3.0.0 |
|
8222 * @category Array |
|
8223 * @param {Array} array The array to query. |
|
8224 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
8225 * @returns {Array} Returns the slice of `array`. |
|
8226 * @example |
|
8227 * |
|
8228 * var users = [ |
|
8229 * { 'user': 'barney', 'active': true }, |
|
8230 * { 'user': 'fred', 'active': false }, |
|
8231 * { 'user': 'pebbles', 'active': false } |
|
8232 * ]; |
|
8233 * |
|
8234 * _.takeRightWhile(users, function(o) { return !o.active; }); |
|
8235 * // => objects for ['fred', 'pebbles'] |
|
8236 * |
|
8237 * // The `_.matches` iteratee shorthand. |
|
8238 * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); |
|
8239 * // => objects for ['pebbles'] |
|
8240 * |
|
8241 * // The `_.matchesProperty` iteratee shorthand. |
|
8242 * _.takeRightWhile(users, ['active', false]); |
|
8243 * // => objects for ['fred', 'pebbles'] |
|
8244 * |
|
8245 * // The `_.property` iteratee shorthand. |
|
8246 * _.takeRightWhile(users, 'active'); |
|
8247 * // => [] |
|
8248 */ |
|
8249 function takeRightWhile(array, predicate) { |
|
8250 return (array && array.length) |
|
8251 ? baseWhile(array, getIteratee(predicate, 3), false, true) |
|
8252 : []; |
|
8253 } |
|
8254 |
|
8255 /** |
|
8256 * Creates a slice of `array` with elements taken from the beginning. Elements |
|
8257 * are taken until `predicate` returns falsey. The predicate is invoked with |
|
8258 * three arguments: (value, index, array). |
|
8259 * |
|
8260 * @static |
|
8261 * @memberOf _ |
|
8262 * @since 3.0.0 |
|
8263 * @category Array |
|
8264 * @param {Array} array The array to query. |
|
8265 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
8266 * @returns {Array} Returns the slice of `array`. |
|
8267 * @example |
|
8268 * |
|
8269 * var users = [ |
|
8270 * { 'user': 'barney', 'active': false }, |
|
8271 * { 'user': 'fred', 'active': false }, |
|
8272 * { 'user': 'pebbles', 'active': true } |
|
8273 * ]; |
|
8274 * |
|
8275 * _.takeWhile(users, function(o) { return !o.active; }); |
|
8276 * // => objects for ['barney', 'fred'] |
|
8277 * |
|
8278 * // The `_.matches` iteratee shorthand. |
|
8279 * _.takeWhile(users, { 'user': 'barney', 'active': false }); |
|
8280 * // => objects for ['barney'] |
|
8281 * |
|
8282 * // The `_.matchesProperty` iteratee shorthand. |
|
8283 * _.takeWhile(users, ['active', false]); |
|
8284 * // => objects for ['barney', 'fred'] |
|
8285 * |
|
8286 * // The `_.property` iteratee shorthand. |
|
8287 * _.takeWhile(users, 'active'); |
|
8288 * // => [] |
|
8289 */ |
|
8290 function takeWhile(array, predicate) { |
|
8291 return (array && array.length) |
|
8292 ? baseWhile(array, getIteratee(predicate, 3)) |
|
8293 : []; |
|
8294 } |
|
8295 |
|
8296 /** |
|
8297 * Creates an array of unique values, in order, from all given arrays using |
|
8298 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
8299 * for equality comparisons. |
|
8300 * |
|
8301 * @static |
|
8302 * @memberOf _ |
|
8303 * @since 0.1.0 |
|
8304 * @category Array |
|
8305 * @param {...Array} [arrays] The arrays to inspect. |
|
8306 * @returns {Array} Returns the new array of combined values. |
|
8307 * @example |
|
8308 * |
|
8309 * _.union([2], [1, 2]); |
|
8310 * // => [2, 1] |
|
8311 */ |
|
8312 var union = baseRest(function(arrays) { |
|
8313 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); |
|
8314 }); |
|
8315 |
|
8316 /** |
|
8317 * This method is like `_.union` except that it accepts `iteratee` which is |
|
8318 * invoked for each element of each `arrays` to generate the criterion by |
|
8319 * which uniqueness is computed. Result values are chosen from the first |
|
8320 * array in which the value occurs. The iteratee is invoked with one argument: |
|
8321 * (value). |
|
8322 * |
|
8323 * @static |
|
8324 * @memberOf _ |
|
8325 * @since 4.0.0 |
|
8326 * @category Array |
|
8327 * @param {...Array} [arrays] The arrays to inspect. |
|
8328 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
8329 * @returns {Array} Returns the new array of combined values. |
|
8330 * @example |
|
8331 * |
|
8332 * _.unionBy([2.1], [1.2, 2.3], Math.floor); |
|
8333 * // => [2.1, 1.2] |
|
8334 * |
|
8335 * // The `_.property` iteratee shorthand. |
|
8336 * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); |
|
8337 * // => [{ 'x': 1 }, { 'x': 2 }] |
|
8338 */ |
|
8339 var unionBy = baseRest(function(arrays) { |
|
8340 var iteratee = last(arrays); |
|
8341 if (isArrayLikeObject(iteratee)) { |
|
8342 iteratee = undefined; |
|
8343 } |
|
8344 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); |
|
8345 }); |
|
8346 |
|
8347 /** |
|
8348 * This method is like `_.union` except that it accepts `comparator` which |
|
8349 * is invoked to compare elements of `arrays`. Result values are chosen from |
|
8350 * the first array in which the value occurs. The comparator is invoked |
|
8351 * with two arguments: (arrVal, othVal). |
|
8352 * |
|
8353 * @static |
|
8354 * @memberOf _ |
|
8355 * @since 4.0.0 |
|
8356 * @category Array |
|
8357 * @param {...Array} [arrays] The arrays to inspect. |
|
8358 * @param {Function} [comparator] The comparator invoked per element. |
|
8359 * @returns {Array} Returns the new array of combined values. |
|
8360 * @example |
|
8361 * |
|
8362 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; |
|
8363 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; |
|
8364 * |
|
8365 * _.unionWith(objects, others, _.isEqual); |
|
8366 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] |
|
8367 */ |
|
8368 var unionWith = baseRest(function(arrays) { |
|
8369 var comparator = last(arrays); |
|
8370 comparator = typeof comparator == 'function' ? comparator : undefined; |
|
8371 return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); |
|
8372 }); |
|
8373 |
|
8374 /** |
|
8375 * Creates a duplicate-free version of an array, using |
|
8376 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
8377 * for equality comparisons, in which only the first occurrence of each element |
|
8378 * is kept. The order of result values is determined by the order they occur |
|
8379 * in the array. |
|
8380 * |
|
8381 * @static |
|
8382 * @memberOf _ |
|
8383 * @since 0.1.0 |
|
8384 * @category Array |
|
8385 * @param {Array} array The array to inspect. |
|
8386 * @returns {Array} Returns the new duplicate free array. |
|
8387 * @example |
|
8388 * |
|
8389 * _.uniq([2, 1, 2]); |
|
8390 * // => [2, 1] |
|
8391 */ |
|
8392 function uniq(array) { |
|
8393 return (array && array.length) ? baseUniq(array) : []; |
|
8394 } |
|
8395 |
|
8396 /** |
|
8397 * This method is like `_.uniq` except that it accepts `iteratee` which is |
|
8398 * invoked for each element in `array` to generate the criterion by which |
|
8399 * uniqueness is computed. The order of result values is determined by the |
|
8400 * order they occur in the array. The iteratee is invoked with one argument: |
|
8401 * (value). |
|
8402 * |
|
8403 * @static |
|
8404 * @memberOf _ |
|
8405 * @since 4.0.0 |
|
8406 * @category Array |
|
8407 * @param {Array} array The array to inspect. |
|
8408 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
8409 * @returns {Array} Returns the new duplicate free array. |
|
8410 * @example |
|
8411 * |
|
8412 * _.uniqBy([2.1, 1.2, 2.3], Math.floor); |
|
8413 * // => [2.1, 1.2] |
|
8414 * |
|
8415 * // The `_.property` iteratee shorthand. |
|
8416 * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); |
|
8417 * // => [{ 'x': 1 }, { 'x': 2 }] |
|
8418 */ |
|
8419 function uniqBy(array, iteratee) { |
|
8420 return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; |
|
8421 } |
|
8422 |
|
8423 /** |
|
8424 * This method is like `_.uniq` except that it accepts `comparator` which |
|
8425 * is invoked to compare elements of `array`. The order of result values is |
|
8426 * determined by the order they occur in the array.The comparator is invoked |
|
8427 * with two arguments: (arrVal, othVal). |
|
8428 * |
|
8429 * @static |
|
8430 * @memberOf _ |
|
8431 * @since 4.0.0 |
|
8432 * @category Array |
|
8433 * @param {Array} array The array to inspect. |
|
8434 * @param {Function} [comparator] The comparator invoked per element. |
|
8435 * @returns {Array} Returns the new duplicate free array. |
|
8436 * @example |
|
8437 * |
|
8438 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; |
|
8439 * |
|
8440 * _.uniqWith(objects, _.isEqual); |
|
8441 * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] |
|
8442 */ |
|
8443 function uniqWith(array, comparator) { |
|
8444 comparator = typeof comparator == 'function' ? comparator : undefined; |
|
8445 return (array && array.length) ? baseUniq(array, undefined, comparator) : []; |
|
8446 } |
|
8447 |
|
8448 /** |
|
8449 * This method is like `_.zip` except that it accepts an array of grouped |
|
8450 * elements and creates an array regrouping the elements to their pre-zip |
|
8451 * configuration. |
|
8452 * |
|
8453 * @static |
|
8454 * @memberOf _ |
|
8455 * @since 1.2.0 |
|
8456 * @category Array |
|
8457 * @param {Array} array The array of grouped elements to process. |
|
8458 * @returns {Array} Returns the new array of regrouped elements. |
|
8459 * @example |
|
8460 * |
|
8461 * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); |
|
8462 * // => [['a', 1, true], ['b', 2, false]] |
|
8463 * |
|
8464 * _.unzip(zipped); |
|
8465 * // => [['a', 'b'], [1, 2], [true, false]] |
|
8466 */ |
|
8467 function unzip(array) { |
|
8468 if (!(array && array.length)) { |
|
8469 return []; |
|
8470 } |
|
8471 var length = 0; |
|
8472 array = arrayFilter(array, function(group) { |
|
8473 if (isArrayLikeObject(group)) { |
|
8474 length = nativeMax(group.length, length); |
|
8475 return true; |
|
8476 } |
|
8477 }); |
|
8478 return baseTimes(length, function(index) { |
|
8479 return arrayMap(array, baseProperty(index)); |
|
8480 }); |
|
8481 } |
|
8482 |
|
8483 /** |
|
8484 * This method is like `_.unzip` except that it accepts `iteratee` to specify |
|
8485 * how regrouped values should be combined. The iteratee is invoked with the |
|
8486 * elements of each group: (...group). |
|
8487 * |
|
8488 * @static |
|
8489 * @memberOf _ |
|
8490 * @since 3.8.0 |
|
8491 * @category Array |
|
8492 * @param {Array} array The array of grouped elements to process. |
|
8493 * @param {Function} [iteratee=_.identity] The function to combine |
|
8494 * regrouped values. |
|
8495 * @returns {Array} Returns the new array of regrouped elements. |
|
8496 * @example |
|
8497 * |
|
8498 * var zipped = _.zip([1, 2], [10, 20], [100, 200]); |
|
8499 * // => [[1, 10, 100], [2, 20, 200]] |
|
8500 * |
|
8501 * _.unzipWith(zipped, _.add); |
|
8502 * // => [3, 30, 300] |
|
8503 */ |
|
8504 function unzipWith(array, iteratee) { |
|
8505 if (!(array && array.length)) { |
|
8506 return []; |
|
8507 } |
|
8508 var result = unzip(array); |
|
8509 if (iteratee == null) { |
|
8510 return result; |
|
8511 } |
|
8512 return arrayMap(result, function(group) { |
|
8513 return apply(iteratee, undefined, group); |
|
8514 }); |
|
8515 } |
|
8516 |
|
8517 /** |
|
8518 * Creates an array excluding all given values using |
|
8519 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
8520 * for equality comparisons. |
|
8521 * |
|
8522 * **Note:** Unlike `_.pull`, this method returns a new array. |
|
8523 * |
|
8524 * @static |
|
8525 * @memberOf _ |
|
8526 * @since 0.1.0 |
|
8527 * @category Array |
|
8528 * @param {Array} array The array to inspect. |
|
8529 * @param {...*} [values] The values to exclude. |
|
8530 * @returns {Array} Returns the new array of filtered values. |
|
8531 * @see _.difference, _.xor |
|
8532 * @example |
|
8533 * |
|
8534 * _.without([2, 1, 2, 3], 1, 2); |
|
8535 * // => [3] |
|
8536 */ |
|
8537 var without = baseRest(function(array, values) { |
|
8538 return isArrayLikeObject(array) |
|
8539 ? baseDifference(array, values) |
|
8540 : []; |
|
8541 }); |
|
8542 |
|
8543 /** |
|
8544 * Creates an array of unique values that is the |
|
8545 * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) |
|
8546 * of the given arrays. The order of result values is determined by the order |
|
8547 * they occur in the arrays. |
|
8548 * |
|
8549 * @static |
|
8550 * @memberOf _ |
|
8551 * @since 2.4.0 |
|
8552 * @category Array |
|
8553 * @param {...Array} [arrays] The arrays to inspect. |
|
8554 * @returns {Array} Returns the new array of filtered values. |
|
8555 * @see _.difference, _.without |
|
8556 * @example |
|
8557 * |
|
8558 * _.xor([2, 1], [2, 3]); |
|
8559 * // => [1, 3] |
|
8560 */ |
|
8561 var xor = baseRest(function(arrays) { |
|
8562 return baseXor(arrayFilter(arrays, isArrayLikeObject)); |
|
8563 }); |
|
8564 |
|
8565 /** |
|
8566 * This method is like `_.xor` except that it accepts `iteratee` which is |
|
8567 * invoked for each element of each `arrays` to generate the criterion by |
|
8568 * which by which they're compared. The order of result values is determined |
|
8569 * by the order they occur in the arrays. The iteratee is invoked with one |
|
8570 * argument: (value). |
|
8571 * |
|
8572 * @static |
|
8573 * @memberOf _ |
|
8574 * @since 4.0.0 |
|
8575 * @category Array |
|
8576 * @param {...Array} [arrays] The arrays to inspect. |
|
8577 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
8578 * @returns {Array} Returns the new array of filtered values. |
|
8579 * @example |
|
8580 * |
|
8581 * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); |
|
8582 * // => [1.2, 3.4] |
|
8583 * |
|
8584 * // The `_.property` iteratee shorthand. |
|
8585 * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); |
|
8586 * // => [{ 'x': 2 }] |
|
8587 */ |
|
8588 var xorBy = baseRest(function(arrays) { |
|
8589 var iteratee = last(arrays); |
|
8590 if (isArrayLikeObject(iteratee)) { |
|
8591 iteratee = undefined; |
|
8592 } |
|
8593 return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); |
|
8594 }); |
|
8595 |
|
8596 /** |
|
8597 * This method is like `_.xor` except that it accepts `comparator` which is |
|
8598 * invoked to compare elements of `arrays`. The order of result values is |
|
8599 * determined by the order they occur in the arrays. The comparator is invoked |
|
8600 * with two arguments: (arrVal, othVal). |
|
8601 * |
|
8602 * @static |
|
8603 * @memberOf _ |
|
8604 * @since 4.0.0 |
|
8605 * @category Array |
|
8606 * @param {...Array} [arrays] The arrays to inspect. |
|
8607 * @param {Function} [comparator] The comparator invoked per element. |
|
8608 * @returns {Array} Returns the new array of filtered values. |
|
8609 * @example |
|
8610 * |
|
8611 * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; |
|
8612 * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; |
|
8613 * |
|
8614 * _.xorWith(objects, others, _.isEqual); |
|
8615 * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] |
|
8616 */ |
|
8617 var xorWith = baseRest(function(arrays) { |
|
8618 var comparator = last(arrays); |
|
8619 comparator = typeof comparator == 'function' ? comparator : undefined; |
|
8620 return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); |
|
8621 }); |
|
8622 |
|
8623 /** |
|
8624 * Creates an array of grouped elements, the first of which contains the |
|
8625 * first elements of the given arrays, the second of which contains the |
|
8626 * second elements of the given arrays, and so on. |
|
8627 * |
|
8628 * @static |
|
8629 * @memberOf _ |
|
8630 * @since 0.1.0 |
|
8631 * @category Array |
|
8632 * @param {...Array} [arrays] The arrays to process. |
|
8633 * @returns {Array} Returns the new array of grouped elements. |
|
8634 * @example |
|
8635 * |
|
8636 * _.zip(['a', 'b'], [1, 2], [true, false]); |
|
8637 * // => [['a', 1, true], ['b', 2, false]] |
|
8638 */ |
|
8639 var zip = baseRest(unzip); |
|
8640 |
|
8641 /** |
|
8642 * This method is like `_.fromPairs` except that it accepts two arrays, |
|
8643 * one of property identifiers and one of corresponding values. |
|
8644 * |
|
8645 * @static |
|
8646 * @memberOf _ |
|
8647 * @since 0.4.0 |
|
8648 * @category Array |
|
8649 * @param {Array} [props=[]] The property identifiers. |
|
8650 * @param {Array} [values=[]] The property values. |
|
8651 * @returns {Object} Returns the new object. |
|
8652 * @example |
|
8653 * |
|
8654 * _.zipObject(['a', 'b'], [1, 2]); |
|
8655 * // => { 'a': 1, 'b': 2 } |
|
8656 */ |
|
8657 function zipObject(props, values) { |
|
8658 return baseZipObject(props || [], values || [], assignValue); |
|
8659 } |
|
8660 |
|
8661 /** |
|
8662 * This method is like `_.zipObject` except that it supports property paths. |
|
8663 * |
|
8664 * @static |
|
8665 * @memberOf _ |
|
8666 * @since 4.1.0 |
|
8667 * @category Array |
|
8668 * @param {Array} [props=[]] The property identifiers. |
|
8669 * @param {Array} [values=[]] The property values. |
|
8670 * @returns {Object} Returns the new object. |
|
8671 * @example |
|
8672 * |
|
8673 * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); |
|
8674 * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } |
|
8675 */ |
|
8676 function zipObjectDeep(props, values) { |
|
8677 return baseZipObject(props || [], values || [], baseSet); |
|
8678 } |
|
8679 |
|
8680 /** |
|
8681 * This method is like `_.zip` except that it accepts `iteratee` to specify |
|
8682 * how grouped values should be combined. The iteratee is invoked with the |
|
8683 * elements of each group: (...group). |
|
8684 * |
|
8685 * @static |
|
8686 * @memberOf _ |
|
8687 * @since 3.8.0 |
|
8688 * @category Array |
|
8689 * @param {...Array} [arrays] The arrays to process. |
|
8690 * @param {Function} [iteratee=_.identity] The function to combine |
|
8691 * grouped values. |
|
8692 * @returns {Array} Returns the new array of grouped elements. |
|
8693 * @example |
|
8694 * |
|
8695 * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { |
|
8696 * return a + b + c; |
|
8697 * }); |
|
8698 * // => [111, 222] |
|
8699 */ |
|
8700 var zipWith = baseRest(function(arrays) { |
|
8701 var length = arrays.length, |
|
8702 iteratee = length > 1 ? arrays[length - 1] : undefined; |
|
8703 |
|
8704 iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; |
|
8705 return unzipWith(arrays, iteratee); |
|
8706 }); |
|
8707 |
|
8708 /*------------------------------------------------------------------------*/ |
|
8709 |
|
8710 /** |
|
8711 * Creates a `lodash` wrapper instance that wraps `value` with explicit method |
|
8712 * chain sequences enabled. The result of such sequences must be unwrapped |
|
8713 * with `_#value`. |
|
8714 * |
|
8715 * @static |
|
8716 * @memberOf _ |
|
8717 * @since 1.3.0 |
|
8718 * @category Seq |
|
8719 * @param {*} value The value to wrap. |
|
8720 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
8721 * @example |
|
8722 * |
|
8723 * var users = [ |
|
8724 * { 'user': 'barney', 'age': 36 }, |
|
8725 * { 'user': 'fred', 'age': 40 }, |
|
8726 * { 'user': 'pebbles', 'age': 1 } |
|
8727 * ]; |
|
8728 * |
|
8729 * var youngest = _ |
|
8730 * .chain(users) |
|
8731 * .sortBy('age') |
|
8732 * .map(function(o) { |
|
8733 * return o.user + ' is ' + o.age; |
|
8734 * }) |
|
8735 * .head() |
|
8736 * .value(); |
|
8737 * // => 'pebbles is 1' |
|
8738 */ |
|
8739 function chain(value) { |
|
8740 var result = lodash(value); |
|
8741 result.__chain__ = true; |
|
8742 return result; |
|
8743 } |
|
8744 |
|
8745 /** |
|
8746 * This method invokes `interceptor` and returns `value`. The interceptor |
|
8747 * is invoked with one argument; (value). The purpose of this method is to |
|
8748 * "tap into" a method chain sequence in order to modify intermediate results. |
|
8749 * |
|
8750 * @static |
|
8751 * @memberOf _ |
|
8752 * @since 0.1.0 |
|
8753 * @category Seq |
|
8754 * @param {*} value The value to provide to `interceptor`. |
|
8755 * @param {Function} interceptor The function to invoke. |
|
8756 * @returns {*} Returns `value`. |
|
8757 * @example |
|
8758 * |
|
8759 * _([1, 2, 3]) |
|
8760 * .tap(function(array) { |
|
8761 * // Mutate input array. |
|
8762 * array.pop(); |
|
8763 * }) |
|
8764 * .reverse() |
|
8765 * .value(); |
|
8766 * // => [2, 1] |
|
8767 */ |
|
8768 function tap(value, interceptor) { |
|
8769 interceptor(value); |
|
8770 return value; |
|
8771 } |
|
8772 |
|
8773 /** |
|
8774 * This method is like `_.tap` except that it returns the result of `interceptor`. |
|
8775 * The purpose of this method is to "pass thru" values replacing intermediate |
|
8776 * results in a method chain sequence. |
|
8777 * |
|
8778 * @static |
|
8779 * @memberOf _ |
|
8780 * @since 3.0.0 |
|
8781 * @category Seq |
|
8782 * @param {*} value The value to provide to `interceptor`. |
|
8783 * @param {Function} interceptor The function to invoke. |
|
8784 * @returns {*} Returns the result of `interceptor`. |
|
8785 * @example |
|
8786 * |
|
8787 * _(' abc ') |
|
8788 * .chain() |
|
8789 * .trim() |
|
8790 * .thru(function(value) { |
|
8791 * return [value]; |
|
8792 * }) |
|
8793 * .value(); |
|
8794 * // => ['abc'] |
|
8795 */ |
|
8796 function thru(value, interceptor) { |
|
8797 return interceptor(value); |
|
8798 } |
|
8799 |
|
8800 /** |
|
8801 * This method is the wrapper version of `_.at`. |
|
8802 * |
|
8803 * @name at |
|
8804 * @memberOf _ |
|
8805 * @since 1.0.0 |
|
8806 * @category Seq |
|
8807 * @param {...(string|string[])} [paths] The property paths to pick. |
|
8808 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
8809 * @example |
|
8810 * |
|
8811 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; |
|
8812 * |
|
8813 * _(object).at(['a[0].b.c', 'a[1]']).value(); |
|
8814 * // => [3, 4] |
|
8815 */ |
|
8816 var wrapperAt = flatRest(function(paths) { |
|
8817 var length = paths.length, |
|
8818 start = length ? paths[0] : 0, |
|
8819 value = this.__wrapped__, |
|
8820 interceptor = function(object) { return baseAt(object, paths); }; |
|
8821 |
|
8822 if (length > 1 || this.__actions__.length || |
|
8823 !(value instanceof LazyWrapper) || !isIndex(start)) { |
|
8824 return this.thru(interceptor); |
|
8825 } |
|
8826 value = value.slice(start, +start + (length ? 1 : 0)); |
|
8827 value.__actions__.push({ |
|
8828 'func': thru, |
|
8829 'args': [interceptor], |
|
8830 'thisArg': undefined |
|
8831 }); |
|
8832 return new LodashWrapper(value, this.__chain__).thru(function(array) { |
|
8833 if (length && !array.length) { |
|
8834 array.push(undefined); |
|
8835 } |
|
8836 return array; |
|
8837 }); |
|
8838 }); |
|
8839 |
|
8840 /** |
|
8841 * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. |
|
8842 * |
|
8843 * @name chain |
|
8844 * @memberOf _ |
|
8845 * @since 0.1.0 |
|
8846 * @category Seq |
|
8847 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
8848 * @example |
|
8849 * |
|
8850 * var users = [ |
|
8851 * { 'user': 'barney', 'age': 36 }, |
|
8852 * { 'user': 'fred', 'age': 40 } |
|
8853 * ]; |
|
8854 * |
|
8855 * // A sequence without explicit chaining. |
|
8856 * _(users).head(); |
|
8857 * // => { 'user': 'barney', 'age': 36 } |
|
8858 * |
|
8859 * // A sequence with explicit chaining. |
|
8860 * _(users) |
|
8861 * .chain() |
|
8862 * .head() |
|
8863 * .pick('user') |
|
8864 * .value(); |
|
8865 * // => { 'user': 'barney' } |
|
8866 */ |
|
8867 function wrapperChain() { |
|
8868 return chain(this); |
|
8869 } |
|
8870 |
|
8871 /** |
|
8872 * Executes the chain sequence and returns the wrapped result. |
|
8873 * |
|
8874 * @name commit |
|
8875 * @memberOf _ |
|
8876 * @since 3.2.0 |
|
8877 * @category Seq |
|
8878 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
8879 * @example |
|
8880 * |
|
8881 * var array = [1, 2]; |
|
8882 * var wrapped = _(array).push(3); |
|
8883 * |
|
8884 * console.log(array); |
|
8885 * // => [1, 2] |
|
8886 * |
|
8887 * wrapped = wrapped.commit(); |
|
8888 * console.log(array); |
|
8889 * // => [1, 2, 3] |
|
8890 * |
|
8891 * wrapped.last(); |
|
8892 * // => 3 |
|
8893 * |
|
8894 * console.log(array); |
|
8895 * // => [1, 2, 3] |
|
8896 */ |
|
8897 function wrapperCommit() { |
|
8898 return new LodashWrapper(this.value(), this.__chain__); |
|
8899 } |
|
8900 |
|
8901 /** |
|
8902 * Gets the next value on a wrapped object following the |
|
8903 * [iterator protocol](https://mdn.io/iteration_protocols#iterator). |
|
8904 * |
|
8905 * @name next |
|
8906 * @memberOf _ |
|
8907 * @since 4.0.0 |
|
8908 * @category Seq |
|
8909 * @returns {Object} Returns the next iterator value. |
|
8910 * @example |
|
8911 * |
|
8912 * var wrapped = _([1, 2]); |
|
8913 * |
|
8914 * wrapped.next(); |
|
8915 * // => { 'done': false, 'value': 1 } |
|
8916 * |
|
8917 * wrapped.next(); |
|
8918 * // => { 'done': false, 'value': 2 } |
|
8919 * |
|
8920 * wrapped.next(); |
|
8921 * // => { 'done': true, 'value': undefined } |
|
8922 */ |
|
8923 function wrapperNext() { |
|
8924 if (this.__values__ === undefined) { |
|
8925 this.__values__ = toArray(this.value()); |
|
8926 } |
|
8927 var done = this.__index__ >= this.__values__.length, |
|
8928 value = done ? undefined : this.__values__[this.__index__++]; |
|
8929 |
|
8930 return { 'done': done, 'value': value }; |
|
8931 } |
|
8932 |
|
8933 /** |
|
8934 * Enables the wrapper to be iterable. |
|
8935 * |
|
8936 * @name Symbol.iterator |
|
8937 * @memberOf _ |
|
8938 * @since 4.0.0 |
|
8939 * @category Seq |
|
8940 * @returns {Object} Returns the wrapper object. |
|
8941 * @example |
|
8942 * |
|
8943 * var wrapped = _([1, 2]); |
|
8944 * |
|
8945 * wrapped[Symbol.iterator]() === wrapped; |
|
8946 * // => true |
|
8947 * |
|
8948 * Array.from(wrapped); |
|
8949 * // => [1, 2] |
|
8950 */ |
|
8951 function wrapperToIterator() { |
|
8952 return this; |
|
8953 } |
|
8954 |
|
8955 /** |
|
8956 * Creates a clone of the chain sequence planting `value` as the wrapped value. |
|
8957 * |
|
8958 * @name plant |
|
8959 * @memberOf _ |
|
8960 * @since 3.2.0 |
|
8961 * @category Seq |
|
8962 * @param {*} value The value to plant. |
|
8963 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
8964 * @example |
|
8965 * |
|
8966 * function square(n) { |
|
8967 * return n * n; |
|
8968 * } |
|
8969 * |
|
8970 * var wrapped = _([1, 2]).map(square); |
|
8971 * var other = wrapped.plant([3, 4]); |
|
8972 * |
|
8973 * other.value(); |
|
8974 * // => [9, 16] |
|
8975 * |
|
8976 * wrapped.value(); |
|
8977 * // => [1, 4] |
|
8978 */ |
|
8979 function wrapperPlant(value) { |
|
8980 var result, |
|
8981 parent = this; |
|
8982 |
|
8983 while (parent instanceof baseLodash) { |
|
8984 var clone = wrapperClone(parent); |
|
8985 clone.__index__ = 0; |
|
8986 clone.__values__ = undefined; |
|
8987 if (result) { |
|
8988 previous.__wrapped__ = clone; |
|
8989 } else { |
|
8990 result = clone; |
|
8991 } |
|
8992 var previous = clone; |
|
8993 parent = parent.__wrapped__; |
|
8994 } |
|
8995 previous.__wrapped__ = value; |
|
8996 return result; |
|
8997 } |
|
8998 |
|
8999 /** |
|
9000 * This method is the wrapper version of `_.reverse`. |
|
9001 * |
|
9002 * **Note:** This method mutates the wrapped array. |
|
9003 * |
|
9004 * @name reverse |
|
9005 * @memberOf _ |
|
9006 * @since 0.1.0 |
|
9007 * @category Seq |
|
9008 * @returns {Object} Returns the new `lodash` wrapper instance. |
|
9009 * @example |
|
9010 * |
|
9011 * var array = [1, 2, 3]; |
|
9012 * |
|
9013 * _(array).reverse().value() |
|
9014 * // => [3, 2, 1] |
|
9015 * |
|
9016 * console.log(array); |
|
9017 * // => [3, 2, 1] |
|
9018 */ |
|
9019 function wrapperReverse() { |
|
9020 var value = this.__wrapped__; |
|
9021 if (value instanceof LazyWrapper) { |
|
9022 var wrapped = value; |
|
9023 if (this.__actions__.length) { |
|
9024 wrapped = new LazyWrapper(this); |
|
9025 } |
|
9026 wrapped = wrapped.reverse(); |
|
9027 wrapped.__actions__.push({ |
|
9028 'func': thru, |
|
9029 'args': [reverse], |
|
9030 'thisArg': undefined |
|
9031 }); |
|
9032 return new LodashWrapper(wrapped, this.__chain__); |
|
9033 } |
|
9034 return this.thru(reverse); |
|
9035 } |
|
9036 |
|
9037 /** |
|
9038 * Executes the chain sequence to resolve the unwrapped value. |
|
9039 * |
|
9040 * @name value |
|
9041 * @memberOf _ |
|
9042 * @since 0.1.0 |
|
9043 * @alias toJSON, valueOf |
|
9044 * @category Seq |
|
9045 * @returns {*} Returns the resolved unwrapped value. |
|
9046 * @example |
|
9047 * |
|
9048 * _([1, 2, 3]).value(); |
|
9049 * // => [1, 2, 3] |
|
9050 */ |
|
9051 function wrapperValue() { |
|
9052 return baseWrapperValue(this.__wrapped__, this.__actions__); |
|
9053 } |
|
9054 |
|
9055 /*------------------------------------------------------------------------*/ |
|
9056 |
|
9057 /** |
|
9058 * Creates an object composed of keys generated from the results of running |
|
9059 * each element of `collection` thru `iteratee`. The corresponding value of |
|
9060 * each key is the number of times the key was returned by `iteratee`. The |
|
9061 * iteratee is invoked with one argument: (value). |
|
9062 * |
|
9063 * @static |
|
9064 * @memberOf _ |
|
9065 * @since 0.5.0 |
|
9066 * @category Collection |
|
9067 * @param {Array|Object} collection The collection to iterate over. |
|
9068 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. |
|
9069 * @returns {Object} Returns the composed aggregate object. |
|
9070 * @example |
|
9071 * |
|
9072 * _.countBy([6.1, 4.2, 6.3], Math.floor); |
|
9073 * // => { '4': 1, '6': 2 } |
|
9074 * |
|
9075 * // The `_.property` iteratee shorthand. |
|
9076 * _.countBy(['one', 'two', 'three'], 'length'); |
|
9077 * // => { '3': 2, '5': 1 } |
|
9078 */ |
|
9079 var countBy = createAggregator(function(result, value, key) { |
|
9080 if (hasOwnProperty.call(result, key)) { |
|
9081 ++result[key]; |
|
9082 } else { |
|
9083 baseAssignValue(result, key, 1); |
|
9084 } |
|
9085 }); |
|
9086 |
|
9087 /** |
|
9088 * Checks if `predicate` returns truthy for **all** elements of `collection`. |
|
9089 * Iteration is stopped once `predicate` returns falsey. The predicate is |
|
9090 * invoked with three arguments: (value, index|key, collection). |
|
9091 * |
|
9092 * **Note:** This method returns `true` for |
|
9093 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because |
|
9094 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of |
|
9095 * elements of empty collections. |
|
9096 * |
|
9097 * @static |
|
9098 * @memberOf _ |
|
9099 * @since 0.1.0 |
|
9100 * @category Collection |
|
9101 * @param {Array|Object} collection The collection to iterate over. |
|
9102 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9103 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
9104 * @returns {boolean} Returns `true` if all elements pass the predicate check, |
|
9105 * else `false`. |
|
9106 * @example |
|
9107 * |
|
9108 * _.every([true, 1, null, 'yes'], Boolean); |
|
9109 * // => false |
|
9110 * |
|
9111 * var users = [ |
|
9112 * { 'user': 'barney', 'age': 36, 'active': false }, |
|
9113 * { 'user': 'fred', 'age': 40, 'active': false } |
|
9114 * ]; |
|
9115 * |
|
9116 * // The `_.matches` iteratee shorthand. |
|
9117 * _.every(users, { 'user': 'barney', 'active': false }); |
|
9118 * // => false |
|
9119 * |
|
9120 * // The `_.matchesProperty` iteratee shorthand. |
|
9121 * _.every(users, ['active', false]); |
|
9122 * // => true |
|
9123 * |
|
9124 * // The `_.property` iteratee shorthand. |
|
9125 * _.every(users, 'active'); |
|
9126 * // => false |
|
9127 */ |
|
9128 function every(collection, predicate, guard) { |
|
9129 var func = isArray(collection) ? arrayEvery : baseEvery; |
|
9130 if (guard && isIterateeCall(collection, predicate, guard)) { |
|
9131 predicate = undefined; |
|
9132 } |
|
9133 return func(collection, getIteratee(predicate, 3)); |
|
9134 } |
|
9135 |
|
9136 /** |
|
9137 * Iterates over elements of `collection`, returning an array of all elements |
|
9138 * `predicate` returns truthy for. The predicate is invoked with three |
|
9139 * arguments: (value, index|key, collection). |
|
9140 * |
|
9141 * **Note:** Unlike `_.remove`, this method returns a new array. |
|
9142 * |
|
9143 * @static |
|
9144 * @memberOf _ |
|
9145 * @since 0.1.0 |
|
9146 * @category Collection |
|
9147 * @param {Array|Object} collection The collection to iterate over. |
|
9148 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9149 * @returns {Array} Returns the new filtered array. |
|
9150 * @see _.reject |
|
9151 * @example |
|
9152 * |
|
9153 * var users = [ |
|
9154 * { 'user': 'barney', 'age': 36, 'active': true }, |
|
9155 * { 'user': 'fred', 'age': 40, 'active': false } |
|
9156 * ]; |
|
9157 * |
|
9158 * _.filter(users, function(o) { return !o.active; }); |
|
9159 * // => objects for ['fred'] |
|
9160 * |
|
9161 * // The `_.matches` iteratee shorthand. |
|
9162 * _.filter(users, { 'age': 36, 'active': true }); |
|
9163 * // => objects for ['barney'] |
|
9164 * |
|
9165 * // The `_.matchesProperty` iteratee shorthand. |
|
9166 * _.filter(users, ['active', false]); |
|
9167 * // => objects for ['fred'] |
|
9168 * |
|
9169 * // The `_.property` iteratee shorthand. |
|
9170 * _.filter(users, 'active'); |
|
9171 * // => objects for ['barney'] |
|
9172 */ |
|
9173 function filter(collection, predicate) { |
|
9174 var func = isArray(collection) ? arrayFilter : baseFilter; |
|
9175 return func(collection, getIteratee(predicate, 3)); |
|
9176 } |
|
9177 |
|
9178 /** |
|
9179 * Iterates over elements of `collection`, returning the first element |
|
9180 * `predicate` returns truthy for. The predicate is invoked with three |
|
9181 * arguments: (value, index|key, collection). |
|
9182 * |
|
9183 * @static |
|
9184 * @memberOf _ |
|
9185 * @since 0.1.0 |
|
9186 * @category Collection |
|
9187 * @param {Array|Object} collection The collection to inspect. |
|
9188 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9189 * @param {number} [fromIndex=0] The index to search from. |
|
9190 * @returns {*} Returns the matched element, else `undefined`. |
|
9191 * @example |
|
9192 * |
|
9193 * var users = [ |
|
9194 * { 'user': 'barney', 'age': 36, 'active': true }, |
|
9195 * { 'user': 'fred', 'age': 40, 'active': false }, |
|
9196 * { 'user': 'pebbles', 'age': 1, 'active': true } |
|
9197 * ]; |
|
9198 * |
|
9199 * _.find(users, function(o) { return o.age < 40; }); |
|
9200 * // => object for 'barney' |
|
9201 * |
|
9202 * // The `_.matches` iteratee shorthand. |
|
9203 * _.find(users, { 'age': 1, 'active': true }); |
|
9204 * // => object for 'pebbles' |
|
9205 * |
|
9206 * // The `_.matchesProperty` iteratee shorthand. |
|
9207 * _.find(users, ['active', false]); |
|
9208 * // => object for 'fred' |
|
9209 * |
|
9210 * // The `_.property` iteratee shorthand. |
|
9211 * _.find(users, 'active'); |
|
9212 * // => object for 'barney' |
|
9213 */ |
|
9214 var find = createFind(findIndex); |
|
9215 |
|
9216 /** |
|
9217 * This method is like `_.find` except that it iterates over elements of |
|
9218 * `collection` from right to left. |
|
9219 * |
|
9220 * @static |
|
9221 * @memberOf _ |
|
9222 * @since 2.0.0 |
|
9223 * @category Collection |
|
9224 * @param {Array|Object} collection The collection to inspect. |
|
9225 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9226 * @param {number} [fromIndex=collection.length-1] The index to search from. |
|
9227 * @returns {*} Returns the matched element, else `undefined`. |
|
9228 * @example |
|
9229 * |
|
9230 * _.findLast([1, 2, 3, 4], function(n) { |
|
9231 * return n % 2 == 1; |
|
9232 * }); |
|
9233 * // => 3 |
|
9234 */ |
|
9235 var findLast = createFind(findLastIndex); |
|
9236 |
|
9237 /** |
|
9238 * Creates a flattened array of values by running each element in `collection` |
|
9239 * thru `iteratee` and flattening the mapped results. The iteratee is invoked |
|
9240 * with three arguments: (value, index|key, collection). |
|
9241 * |
|
9242 * @static |
|
9243 * @memberOf _ |
|
9244 * @since 4.0.0 |
|
9245 * @category Collection |
|
9246 * @param {Array|Object} collection The collection to iterate over. |
|
9247 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9248 * @returns {Array} Returns the new flattened array. |
|
9249 * @example |
|
9250 * |
|
9251 * function duplicate(n) { |
|
9252 * return [n, n]; |
|
9253 * } |
|
9254 * |
|
9255 * _.flatMap([1, 2], duplicate); |
|
9256 * // => [1, 1, 2, 2] |
|
9257 */ |
|
9258 function flatMap(collection, iteratee) { |
|
9259 return baseFlatten(map(collection, iteratee), 1); |
|
9260 } |
|
9261 |
|
9262 /** |
|
9263 * This method is like `_.flatMap` except that it recursively flattens the |
|
9264 * mapped results. |
|
9265 * |
|
9266 * @static |
|
9267 * @memberOf _ |
|
9268 * @since 4.7.0 |
|
9269 * @category Collection |
|
9270 * @param {Array|Object} collection The collection to iterate over. |
|
9271 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9272 * @returns {Array} Returns the new flattened array. |
|
9273 * @example |
|
9274 * |
|
9275 * function duplicate(n) { |
|
9276 * return [[[n, n]]]; |
|
9277 * } |
|
9278 * |
|
9279 * _.flatMapDeep([1, 2], duplicate); |
|
9280 * // => [1, 1, 2, 2] |
|
9281 */ |
|
9282 function flatMapDeep(collection, iteratee) { |
|
9283 return baseFlatten(map(collection, iteratee), INFINITY); |
|
9284 } |
|
9285 |
|
9286 /** |
|
9287 * This method is like `_.flatMap` except that it recursively flattens the |
|
9288 * mapped results up to `depth` times. |
|
9289 * |
|
9290 * @static |
|
9291 * @memberOf _ |
|
9292 * @since 4.7.0 |
|
9293 * @category Collection |
|
9294 * @param {Array|Object} collection The collection to iterate over. |
|
9295 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9296 * @param {number} [depth=1] The maximum recursion depth. |
|
9297 * @returns {Array} Returns the new flattened array. |
|
9298 * @example |
|
9299 * |
|
9300 * function duplicate(n) { |
|
9301 * return [[[n, n]]]; |
|
9302 * } |
|
9303 * |
|
9304 * _.flatMapDepth([1, 2], duplicate, 2); |
|
9305 * // => [[1, 1], [2, 2]] |
|
9306 */ |
|
9307 function flatMapDepth(collection, iteratee, depth) { |
|
9308 depth = depth === undefined ? 1 : toInteger(depth); |
|
9309 return baseFlatten(map(collection, iteratee), depth); |
|
9310 } |
|
9311 |
|
9312 /** |
|
9313 * Iterates over elements of `collection` and invokes `iteratee` for each element. |
|
9314 * The iteratee is invoked with three arguments: (value, index|key, collection). |
|
9315 * Iteratee functions may exit iteration early by explicitly returning `false`. |
|
9316 * |
|
9317 * **Note:** As with other "Collections" methods, objects with a "length" |
|
9318 * property are iterated like arrays. To avoid this behavior use `_.forIn` |
|
9319 * or `_.forOwn` for object iteration. |
|
9320 * |
|
9321 * @static |
|
9322 * @memberOf _ |
|
9323 * @since 0.1.0 |
|
9324 * @alias each |
|
9325 * @category Collection |
|
9326 * @param {Array|Object} collection The collection to iterate over. |
|
9327 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9328 * @returns {Array|Object} Returns `collection`. |
|
9329 * @see _.forEachRight |
|
9330 * @example |
|
9331 * |
|
9332 * _.forEach([1, 2], function(value) { |
|
9333 * console.log(value); |
|
9334 * }); |
|
9335 * // => Logs `1` then `2`. |
|
9336 * |
|
9337 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { |
|
9338 * console.log(key); |
|
9339 * }); |
|
9340 * // => Logs 'a' then 'b' (iteration order is not guaranteed). |
|
9341 */ |
|
9342 function forEach(collection, iteratee) { |
|
9343 var func = isArray(collection) ? arrayEach : baseEach; |
|
9344 return func(collection, getIteratee(iteratee, 3)); |
|
9345 } |
|
9346 |
|
9347 /** |
|
9348 * This method is like `_.forEach` except that it iterates over elements of |
|
9349 * `collection` from right to left. |
|
9350 * |
|
9351 * @static |
|
9352 * @memberOf _ |
|
9353 * @since 2.0.0 |
|
9354 * @alias eachRight |
|
9355 * @category Collection |
|
9356 * @param {Array|Object} collection The collection to iterate over. |
|
9357 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9358 * @returns {Array|Object} Returns `collection`. |
|
9359 * @see _.forEach |
|
9360 * @example |
|
9361 * |
|
9362 * _.forEachRight([1, 2], function(value) { |
|
9363 * console.log(value); |
|
9364 * }); |
|
9365 * // => Logs `2` then `1`. |
|
9366 */ |
|
9367 function forEachRight(collection, iteratee) { |
|
9368 var func = isArray(collection) ? arrayEachRight : baseEachRight; |
|
9369 return func(collection, getIteratee(iteratee, 3)); |
|
9370 } |
|
9371 |
|
9372 /** |
|
9373 * Creates an object composed of keys generated from the results of running |
|
9374 * each element of `collection` thru `iteratee`. The order of grouped values |
|
9375 * is determined by the order they occur in `collection`. The corresponding |
|
9376 * value of each key is an array of elements responsible for generating the |
|
9377 * key. The iteratee is invoked with one argument: (value). |
|
9378 * |
|
9379 * @static |
|
9380 * @memberOf _ |
|
9381 * @since 0.1.0 |
|
9382 * @category Collection |
|
9383 * @param {Array|Object} collection The collection to iterate over. |
|
9384 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. |
|
9385 * @returns {Object} Returns the composed aggregate object. |
|
9386 * @example |
|
9387 * |
|
9388 * _.groupBy([6.1, 4.2, 6.3], Math.floor); |
|
9389 * // => { '4': [4.2], '6': [6.1, 6.3] } |
|
9390 * |
|
9391 * // The `_.property` iteratee shorthand. |
|
9392 * _.groupBy(['one', 'two', 'three'], 'length'); |
|
9393 * // => { '3': ['one', 'two'], '5': ['three'] } |
|
9394 */ |
|
9395 var groupBy = createAggregator(function(result, value, key) { |
|
9396 if (hasOwnProperty.call(result, key)) { |
|
9397 result[key].push(value); |
|
9398 } else { |
|
9399 baseAssignValue(result, key, [value]); |
|
9400 } |
|
9401 }); |
|
9402 |
|
9403 /** |
|
9404 * Checks if `value` is in `collection`. If `collection` is a string, it's |
|
9405 * checked for a substring of `value`, otherwise |
|
9406 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
9407 * is used for equality comparisons. If `fromIndex` is negative, it's used as |
|
9408 * the offset from the end of `collection`. |
|
9409 * |
|
9410 * @static |
|
9411 * @memberOf _ |
|
9412 * @since 0.1.0 |
|
9413 * @category Collection |
|
9414 * @param {Array|Object|string} collection The collection to inspect. |
|
9415 * @param {*} value The value to search for. |
|
9416 * @param {number} [fromIndex=0] The index to search from. |
|
9417 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. |
|
9418 * @returns {boolean} Returns `true` if `value` is found, else `false`. |
|
9419 * @example |
|
9420 * |
|
9421 * _.includes([1, 2, 3], 1); |
|
9422 * // => true |
|
9423 * |
|
9424 * _.includes([1, 2, 3], 1, 2); |
|
9425 * // => false |
|
9426 * |
|
9427 * _.includes({ 'a': 1, 'b': 2 }, 1); |
|
9428 * // => true |
|
9429 * |
|
9430 * _.includes('abcd', 'bc'); |
|
9431 * // => true |
|
9432 */ |
|
9433 function includes(collection, value, fromIndex, guard) { |
|
9434 collection = isArrayLike(collection) ? collection : values(collection); |
|
9435 fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; |
|
9436 |
|
9437 var length = collection.length; |
|
9438 if (fromIndex < 0) { |
|
9439 fromIndex = nativeMax(length + fromIndex, 0); |
|
9440 } |
|
9441 return isString(collection) |
|
9442 ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) |
|
9443 : (!!length && baseIndexOf(collection, value, fromIndex) > -1); |
|
9444 } |
|
9445 |
|
9446 /** |
|
9447 * Invokes the method at `path` of each element in `collection`, returning |
|
9448 * an array of the results of each invoked method. Any additional arguments |
|
9449 * are provided to each invoked method. If `path` is a function, it's invoked |
|
9450 * for, and `this` bound to, each element in `collection`. |
|
9451 * |
|
9452 * @static |
|
9453 * @memberOf _ |
|
9454 * @since 4.0.0 |
|
9455 * @category Collection |
|
9456 * @param {Array|Object} collection The collection to iterate over. |
|
9457 * @param {Array|Function|string} path The path of the method to invoke or |
|
9458 * the function invoked per iteration. |
|
9459 * @param {...*} [args] The arguments to invoke each method with. |
|
9460 * @returns {Array} Returns the array of results. |
|
9461 * @example |
|
9462 * |
|
9463 * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); |
|
9464 * // => [[1, 5, 7], [1, 2, 3]] |
|
9465 * |
|
9466 * _.invokeMap([123, 456], String.prototype.split, ''); |
|
9467 * // => [['1', '2', '3'], ['4', '5', '6']] |
|
9468 */ |
|
9469 var invokeMap = baseRest(function(collection, path, args) { |
|
9470 var index = -1, |
|
9471 isFunc = typeof path == 'function', |
|
9472 result = isArrayLike(collection) ? Array(collection.length) : []; |
|
9473 |
|
9474 baseEach(collection, function(value) { |
|
9475 result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); |
|
9476 }); |
|
9477 return result; |
|
9478 }); |
|
9479 |
|
9480 /** |
|
9481 * Creates an object composed of keys generated from the results of running |
|
9482 * each element of `collection` thru `iteratee`. The corresponding value of |
|
9483 * each key is the last element responsible for generating the key. The |
|
9484 * iteratee is invoked with one argument: (value). |
|
9485 * |
|
9486 * @static |
|
9487 * @memberOf _ |
|
9488 * @since 4.0.0 |
|
9489 * @category Collection |
|
9490 * @param {Array|Object} collection The collection to iterate over. |
|
9491 * @param {Function} [iteratee=_.identity] The iteratee to transform keys. |
|
9492 * @returns {Object} Returns the composed aggregate object. |
|
9493 * @example |
|
9494 * |
|
9495 * var array = [ |
|
9496 * { 'dir': 'left', 'code': 97 }, |
|
9497 * { 'dir': 'right', 'code': 100 } |
|
9498 * ]; |
|
9499 * |
|
9500 * _.keyBy(array, function(o) { |
|
9501 * return String.fromCharCode(o.code); |
|
9502 * }); |
|
9503 * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } |
|
9504 * |
|
9505 * _.keyBy(array, 'dir'); |
|
9506 * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } |
|
9507 */ |
|
9508 var keyBy = createAggregator(function(result, value, key) { |
|
9509 baseAssignValue(result, key, value); |
|
9510 }); |
|
9511 |
|
9512 /** |
|
9513 * Creates an array of values by running each element in `collection` thru |
|
9514 * `iteratee`. The iteratee is invoked with three arguments: |
|
9515 * (value, index|key, collection). |
|
9516 * |
|
9517 * Many lodash methods are guarded to work as iteratees for methods like |
|
9518 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. |
|
9519 * |
|
9520 * The guarded methods are: |
|
9521 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, |
|
9522 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, |
|
9523 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, |
|
9524 * `template`, `trim`, `trimEnd`, `trimStart`, and `words` |
|
9525 * |
|
9526 * @static |
|
9527 * @memberOf _ |
|
9528 * @since 0.1.0 |
|
9529 * @category Collection |
|
9530 * @param {Array|Object} collection The collection to iterate over. |
|
9531 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9532 * @returns {Array} Returns the new mapped array. |
|
9533 * @example |
|
9534 * |
|
9535 * function square(n) { |
|
9536 * return n * n; |
|
9537 * } |
|
9538 * |
|
9539 * _.map([4, 8], square); |
|
9540 * // => [16, 64] |
|
9541 * |
|
9542 * _.map({ 'a': 4, 'b': 8 }, square); |
|
9543 * // => [16, 64] (iteration order is not guaranteed) |
|
9544 * |
|
9545 * var users = [ |
|
9546 * { 'user': 'barney' }, |
|
9547 * { 'user': 'fred' } |
|
9548 * ]; |
|
9549 * |
|
9550 * // The `_.property` iteratee shorthand. |
|
9551 * _.map(users, 'user'); |
|
9552 * // => ['barney', 'fred'] |
|
9553 */ |
|
9554 function map(collection, iteratee) { |
|
9555 var func = isArray(collection) ? arrayMap : baseMap; |
|
9556 return func(collection, getIteratee(iteratee, 3)); |
|
9557 } |
|
9558 |
|
9559 /** |
|
9560 * This method is like `_.sortBy` except that it allows specifying the sort |
|
9561 * orders of the iteratees to sort by. If `orders` is unspecified, all values |
|
9562 * are sorted in ascending order. Otherwise, specify an order of "desc" for |
|
9563 * descending or "asc" for ascending sort order of corresponding values. |
|
9564 * |
|
9565 * @static |
|
9566 * @memberOf _ |
|
9567 * @since 4.0.0 |
|
9568 * @category Collection |
|
9569 * @param {Array|Object} collection The collection to iterate over. |
|
9570 * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] |
|
9571 * The iteratees to sort by. |
|
9572 * @param {string[]} [orders] The sort orders of `iteratees`. |
|
9573 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. |
|
9574 * @returns {Array} Returns the new sorted array. |
|
9575 * @example |
|
9576 * |
|
9577 * var users = [ |
|
9578 * { 'user': 'fred', 'age': 48 }, |
|
9579 * { 'user': 'barney', 'age': 34 }, |
|
9580 * { 'user': 'fred', 'age': 40 }, |
|
9581 * { 'user': 'barney', 'age': 36 } |
|
9582 * ]; |
|
9583 * |
|
9584 * // Sort by `user` in ascending order and by `age` in descending order. |
|
9585 * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); |
|
9586 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] |
|
9587 */ |
|
9588 function orderBy(collection, iteratees, orders, guard) { |
|
9589 if (collection == null) { |
|
9590 return []; |
|
9591 } |
|
9592 if (!isArray(iteratees)) { |
|
9593 iteratees = iteratees == null ? [] : [iteratees]; |
|
9594 } |
|
9595 orders = guard ? undefined : orders; |
|
9596 if (!isArray(orders)) { |
|
9597 orders = orders == null ? [] : [orders]; |
|
9598 } |
|
9599 return baseOrderBy(collection, iteratees, orders); |
|
9600 } |
|
9601 |
|
9602 /** |
|
9603 * Creates an array of elements split into two groups, the first of which |
|
9604 * contains elements `predicate` returns truthy for, the second of which |
|
9605 * contains elements `predicate` returns falsey for. The predicate is |
|
9606 * invoked with one argument: (value). |
|
9607 * |
|
9608 * @static |
|
9609 * @memberOf _ |
|
9610 * @since 3.0.0 |
|
9611 * @category Collection |
|
9612 * @param {Array|Object} collection The collection to iterate over. |
|
9613 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9614 * @returns {Array} Returns the array of grouped elements. |
|
9615 * @example |
|
9616 * |
|
9617 * var users = [ |
|
9618 * { 'user': 'barney', 'age': 36, 'active': false }, |
|
9619 * { 'user': 'fred', 'age': 40, 'active': true }, |
|
9620 * { 'user': 'pebbles', 'age': 1, 'active': false } |
|
9621 * ]; |
|
9622 * |
|
9623 * _.partition(users, function(o) { return o.active; }); |
|
9624 * // => objects for [['fred'], ['barney', 'pebbles']] |
|
9625 * |
|
9626 * // The `_.matches` iteratee shorthand. |
|
9627 * _.partition(users, { 'age': 1, 'active': false }); |
|
9628 * // => objects for [['pebbles'], ['barney', 'fred']] |
|
9629 * |
|
9630 * // The `_.matchesProperty` iteratee shorthand. |
|
9631 * _.partition(users, ['active', false]); |
|
9632 * // => objects for [['barney', 'pebbles'], ['fred']] |
|
9633 * |
|
9634 * // The `_.property` iteratee shorthand. |
|
9635 * _.partition(users, 'active'); |
|
9636 * // => objects for [['fred'], ['barney', 'pebbles']] |
|
9637 */ |
|
9638 var partition = createAggregator(function(result, value, key) { |
|
9639 result[key ? 0 : 1].push(value); |
|
9640 }, function() { return [[], []]; }); |
|
9641 |
|
9642 /** |
|
9643 * Reduces `collection` to a value which is the accumulated result of running |
|
9644 * each element in `collection` thru `iteratee`, where each successive |
|
9645 * invocation is supplied the return value of the previous. If `accumulator` |
|
9646 * is not given, the first element of `collection` is used as the initial |
|
9647 * value. The iteratee is invoked with four arguments: |
|
9648 * (accumulator, value, index|key, collection). |
|
9649 * |
|
9650 * Many lodash methods are guarded to work as iteratees for methods like |
|
9651 * `_.reduce`, `_.reduceRight`, and `_.transform`. |
|
9652 * |
|
9653 * The guarded methods are: |
|
9654 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, |
|
9655 * and `sortBy` |
|
9656 * |
|
9657 * @static |
|
9658 * @memberOf _ |
|
9659 * @since 0.1.0 |
|
9660 * @category Collection |
|
9661 * @param {Array|Object} collection The collection to iterate over. |
|
9662 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9663 * @param {*} [accumulator] The initial value. |
|
9664 * @returns {*} Returns the accumulated value. |
|
9665 * @see _.reduceRight |
|
9666 * @example |
|
9667 * |
|
9668 * _.reduce([1, 2], function(sum, n) { |
|
9669 * return sum + n; |
|
9670 * }, 0); |
|
9671 * // => 3 |
|
9672 * |
|
9673 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { |
|
9674 * (result[value] || (result[value] = [])).push(key); |
|
9675 * return result; |
|
9676 * }, {}); |
|
9677 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) |
|
9678 */ |
|
9679 function reduce(collection, iteratee, accumulator) { |
|
9680 var func = isArray(collection) ? arrayReduce : baseReduce, |
|
9681 initAccum = arguments.length < 3; |
|
9682 |
|
9683 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); |
|
9684 } |
|
9685 |
|
9686 /** |
|
9687 * This method is like `_.reduce` except that it iterates over elements of |
|
9688 * `collection` from right to left. |
|
9689 * |
|
9690 * @static |
|
9691 * @memberOf _ |
|
9692 * @since 0.1.0 |
|
9693 * @category Collection |
|
9694 * @param {Array|Object} collection The collection to iterate over. |
|
9695 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
9696 * @param {*} [accumulator] The initial value. |
|
9697 * @returns {*} Returns the accumulated value. |
|
9698 * @see _.reduce |
|
9699 * @example |
|
9700 * |
|
9701 * var array = [[0, 1], [2, 3], [4, 5]]; |
|
9702 * |
|
9703 * _.reduceRight(array, function(flattened, other) { |
|
9704 * return flattened.concat(other); |
|
9705 * }, []); |
|
9706 * // => [4, 5, 2, 3, 0, 1] |
|
9707 */ |
|
9708 function reduceRight(collection, iteratee, accumulator) { |
|
9709 var func = isArray(collection) ? arrayReduceRight : baseReduce, |
|
9710 initAccum = arguments.length < 3; |
|
9711 |
|
9712 return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); |
|
9713 } |
|
9714 |
|
9715 /** |
|
9716 * The opposite of `_.filter`; this method returns the elements of `collection` |
|
9717 * that `predicate` does **not** return truthy for. |
|
9718 * |
|
9719 * @static |
|
9720 * @memberOf _ |
|
9721 * @since 0.1.0 |
|
9722 * @category Collection |
|
9723 * @param {Array|Object} collection The collection to iterate over. |
|
9724 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9725 * @returns {Array} Returns the new filtered array. |
|
9726 * @see _.filter |
|
9727 * @example |
|
9728 * |
|
9729 * var users = [ |
|
9730 * { 'user': 'barney', 'age': 36, 'active': false }, |
|
9731 * { 'user': 'fred', 'age': 40, 'active': true } |
|
9732 * ]; |
|
9733 * |
|
9734 * _.reject(users, function(o) { return !o.active; }); |
|
9735 * // => objects for ['fred'] |
|
9736 * |
|
9737 * // The `_.matches` iteratee shorthand. |
|
9738 * _.reject(users, { 'age': 40, 'active': true }); |
|
9739 * // => objects for ['barney'] |
|
9740 * |
|
9741 * // The `_.matchesProperty` iteratee shorthand. |
|
9742 * _.reject(users, ['active', false]); |
|
9743 * // => objects for ['fred'] |
|
9744 * |
|
9745 * // The `_.property` iteratee shorthand. |
|
9746 * _.reject(users, 'active'); |
|
9747 * // => objects for ['barney'] |
|
9748 */ |
|
9749 function reject(collection, predicate) { |
|
9750 var func = isArray(collection) ? arrayFilter : baseFilter; |
|
9751 return func(collection, negate(getIteratee(predicate, 3))); |
|
9752 } |
|
9753 |
|
9754 /** |
|
9755 * Gets a random element from `collection`. |
|
9756 * |
|
9757 * @static |
|
9758 * @memberOf _ |
|
9759 * @since 2.0.0 |
|
9760 * @category Collection |
|
9761 * @param {Array|Object} collection The collection to sample. |
|
9762 * @returns {*} Returns the random element. |
|
9763 * @example |
|
9764 * |
|
9765 * _.sample([1, 2, 3, 4]); |
|
9766 * // => 2 |
|
9767 */ |
|
9768 function sample(collection) { |
|
9769 var func = isArray(collection) ? arraySample : baseSample; |
|
9770 return func(collection); |
|
9771 } |
|
9772 |
|
9773 /** |
|
9774 * Gets `n` random elements at unique keys from `collection` up to the |
|
9775 * size of `collection`. |
|
9776 * |
|
9777 * @static |
|
9778 * @memberOf _ |
|
9779 * @since 4.0.0 |
|
9780 * @category Collection |
|
9781 * @param {Array|Object} collection The collection to sample. |
|
9782 * @param {number} [n=1] The number of elements to sample. |
|
9783 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
9784 * @returns {Array} Returns the random elements. |
|
9785 * @example |
|
9786 * |
|
9787 * _.sampleSize([1, 2, 3], 2); |
|
9788 * // => [3, 1] |
|
9789 * |
|
9790 * _.sampleSize([1, 2, 3], 4); |
|
9791 * // => [2, 3, 1] |
|
9792 */ |
|
9793 function sampleSize(collection, n, guard) { |
|
9794 if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { |
|
9795 n = 1; |
|
9796 } else { |
|
9797 n = toInteger(n); |
|
9798 } |
|
9799 var func = isArray(collection) ? arraySampleSize : baseSampleSize; |
|
9800 return func(collection, n); |
|
9801 } |
|
9802 |
|
9803 /** |
|
9804 * Creates an array of shuffled values, using a version of the |
|
9805 * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). |
|
9806 * |
|
9807 * @static |
|
9808 * @memberOf _ |
|
9809 * @since 0.1.0 |
|
9810 * @category Collection |
|
9811 * @param {Array|Object} collection The collection to shuffle. |
|
9812 * @returns {Array} Returns the new shuffled array. |
|
9813 * @example |
|
9814 * |
|
9815 * _.shuffle([1, 2, 3, 4]); |
|
9816 * // => [4, 1, 3, 2] |
|
9817 */ |
|
9818 function shuffle(collection) { |
|
9819 var func = isArray(collection) ? arrayShuffle : baseShuffle; |
|
9820 return func(collection); |
|
9821 } |
|
9822 |
|
9823 /** |
|
9824 * Gets the size of `collection` by returning its length for array-like |
|
9825 * values or the number of own enumerable string keyed properties for objects. |
|
9826 * |
|
9827 * @static |
|
9828 * @memberOf _ |
|
9829 * @since 0.1.0 |
|
9830 * @category Collection |
|
9831 * @param {Array|Object|string} collection The collection to inspect. |
|
9832 * @returns {number} Returns the collection size. |
|
9833 * @example |
|
9834 * |
|
9835 * _.size([1, 2, 3]); |
|
9836 * // => 3 |
|
9837 * |
|
9838 * _.size({ 'a': 1, 'b': 2 }); |
|
9839 * // => 2 |
|
9840 * |
|
9841 * _.size('pebbles'); |
|
9842 * // => 7 |
|
9843 */ |
|
9844 function size(collection) { |
|
9845 if (collection == null) { |
|
9846 return 0; |
|
9847 } |
|
9848 if (isArrayLike(collection)) { |
|
9849 return isString(collection) ? stringSize(collection) : collection.length; |
|
9850 } |
|
9851 var tag = getTag(collection); |
|
9852 if (tag == mapTag || tag == setTag) { |
|
9853 return collection.size; |
|
9854 } |
|
9855 return baseKeys(collection).length; |
|
9856 } |
|
9857 |
|
9858 /** |
|
9859 * Checks if `predicate` returns truthy for **any** element of `collection`. |
|
9860 * Iteration is stopped once `predicate` returns truthy. The predicate is |
|
9861 * invoked with three arguments: (value, index|key, collection). |
|
9862 * |
|
9863 * @static |
|
9864 * @memberOf _ |
|
9865 * @since 0.1.0 |
|
9866 * @category Collection |
|
9867 * @param {Array|Object} collection The collection to iterate over. |
|
9868 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
9869 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
9870 * @returns {boolean} Returns `true` if any element passes the predicate check, |
|
9871 * else `false`. |
|
9872 * @example |
|
9873 * |
|
9874 * _.some([null, 0, 'yes', false], Boolean); |
|
9875 * // => true |
|
9876 * |
|
9877 * var users = [ |
|
9878 * { 'user': 'barney', 'active': true }, |
|
9879 * { 'user': 'fred', 'active': false } |
|
9880 * ]; |
|
9881 * |
|
9882 * // The `_.matches` iteratee shorthand. |
|
9883 * _.some(users, { 'user': 'barney', 'active': false }); |
|
9884 * // => false |
|
9885 * |
|
9886 * // The `_.matchesProperty` iteratee shorthand. |
|
9887 * _.some(users, ['active', false]); |
|
9888 * // => true |
|
9889 * |
|
9890 * // The `_.property` iteratee shorthand. |
|
9891 * _.some(users, 'active'); |
|
9892 * // => true |
|
9893 */ |
|
9894 function some(collection, predicate, guard) { |
|
9895 var func = isArray(collection) ? arraySome : baseSome; |
|
9896 if (guard && isIterateeCall(collection, predicate, guard)) { |
|
9897 predicate = undefined; |
|
9898 } |
|
9899 return func(collection, getIteratee(predicate, 3)); |
|
9900 } |
|
9901 |
|
9902 /** |
|
9903 * Creates an array of elements, sorted in ascending order by the results of |
|
9904 * running each element in a collection thru each iteratee. This method |
|
9905 * performs a stable sort, that is, it preserves the original sort order of |
|
9906 * equal elements. The iteratees are invoked with one argument: (value). |
|
9907 * |
|
9908 * @static |
|
9909 * @memberOf _ |
|
9910 * @since 0.1.0 |
|
9911 * @category Collection |
|
9912 * @param {Array|Object} collection The collection to iterate over. |
|
9913 * @param {...(Function|Function[])} [iteratees=[_.identity]] |
|
9914 * The iteratees to sort by. |
|
9915 * @returns {Array} Returns the new sorted array. |
|
9916 * @example |
|
9917 * |
|
9918 * var users = [ |
|
9919 * { 'user': 'fred', 'age': 48 }, |
|
9920 * { 'user': 'barney', 'age': 36 }, |
|
9921 * { 'user': 'fred', 'age': 40 }, |
|
9922 * { 'user': 'barney', 'age': 34 } |
|
9923 * ]; |
|
9924 * |
|
9925 * _.sortBy(users, [function(o) { return o.user; }]); |
|
9926 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] |
|
9927 * |
|
9928 * _.sortBy(users, ['user', 'age']); |
|
9929 * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] |
|
9930 */ |
|
9931 var sortBy = baseRest(function(collection, iteratees) { |
|
9932 if (collection == null) { |
|
9933 return []; |
|
9934 } |
|
9935 var length = iteratees.length; |
|
9936 if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { |
|
9937 iteratees = []; |
|
9938 } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { |
|
9939 iteratees = [iteratees[0]]; |
|
9940 } |
|
9941 return baseOrderBy(collection, baseFlatten(iteratees, 1), []); |
|
9942 }); |
|
9943 |
|
9944 /*------------------------------------------------------------------------*/ |
|
9945 |
|
9946 /** |
|
9947 * Gets the timestamp of the number of milliseconds that have elapsed since |
|
9948 * the Unix epoch (1 January 1970 00:00:00 UTC). |
|
9949 * |
|
9950 * @static |
|
9951 * @memberOf _ |
|
9952 * @since 2.4.0 |
|
9953 * @category Date |
|
9954 * @returns {number} Returns the timestamp. |
|
9955 * @example |
|
9956 * |
|
9957 * _.defer(function(stamp) { |
|
9958 * console.log(_.now() - stamp); |
|
9959 * }, _.now()); |
|
9960 * // => Logs the number of milliseconds it took for the deferred invocation. |
|
9961 */ |
|
9962 var now = ctxNow || function() { |
|
9963 return root.Date.now(); |
|
9964 }; |
|
9965 |
|
9966 /*------------------------------------------------------------------------*/ |
|
9967 |
|
9968 /** |
|
9969 * The opposite of `_.before`; this method creates a function that invokes |
|
9970 * `func` once it's called `n` or more times. |
|
9971 * |
|
9972 * @static |
|
9973 * @memberOf _ |
|
9974 * @since 0.1.0 |
|
9975 * @category Function |
|
9976 * @param {number} n The number of calls before `func` is invoked. |
|
9977 * @param {Function} func The function to restrict. |
|
9978 * @returns {Function} Returns the new restricted function. |
|
9979 * @example |
|
9980 * |
|
9981 * var saves = ['profile', 'settings']; |
|
9982 * |
|
9983 * var done = _.after(saves.length, function() { |
|
9984 * console.log('done saving!'); |
|
9985 * }); |
|
9986 * |
|
9987 * _.forEach(saves, function(type) { |
|
9988 * asyncSave({ 'type': type, 'complete': done }); |
|
9989 * }); |
|
9990 * // => Logs 'done saving!' after the two async saves have completed. |
|
9991 */ |
|
9992 function after(n, func) { |
|
9993 if (typeof func != 'function') { |
|
9994 throw new TypeError(FUNC_ERROR_TEXT); |
|
9995 } |
|
9996 n = toInteger(n); |
|
9997 return function() { |
|
9998 if (--n < 1) { |
|
9999 return func.apply(this, arguments); |
|
10000 } |
|
10001 }; |
|
10002 } |
|
10003 |
|
10004 /** |
|
10005 * Creates a function that invokes `func`, with up to `n` arguments, |
|
10006 * ignoring any additional arguments. |
|
10007 * |
|
10008 * @static |
|
10009 * @memberOf _ |
|
10010 * @since 3.0.0 |
|
10011 * @category Function |
|
10012 * @param {Function} func The function to cap arguments for. |
|
10013 * @param {number} [n=func.length] The arity cap. |
|
10014 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
10015 * @returns {Function} Returns the new capped function. |
|
10016 * @example |
|
10017 * |
|
10018 * _.map(['6', '8', '10'], _.ary(parseInt, 1)); |
|
10019 * // => [6, 8, 10] |
|
10020 */ |
|
10021 function ary(func, n, guard) { |
|
10022 n = guard ? undefined : n; |
|
10023 n = (func && n == null) ? func.length : n; |
|
10024 return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); |
|
10025 } |
|
10026 |
|
10027 /** |
|
10028 * Creates a function that invokes `func`, with the `this` binding and arguments |
|
10029 * of the created function, while it's called less than `n` times. Subsequent |
|
10030 * calls to the created function return the result of the last `func` invocation. |
|
10031 * |
|
10032 * @static |
|
10033 * @memberOf _ |
|
10034 * @since 3.0.0 |
|
10035 * @category Function |
|
10036 * @param {number} n The number of calls at which `func` is no longer invoked. |
|
10037 * @param {Function} func The function to restrict. |
|
10038 * @returns {Function} Returns the new restricted function. |
|
10039 * @example |
|
10040 * |
|
10041 * jQuery(element).on('click', _.before(5, addContactToList)); |
|
10042 * // => Allows adding up to 4 contacts to the list. |
|
10043 */ |
|
10044 function before(n, func) { |
|
10045 var result; |
|
10046 if (typeof func != 'function') { |
|
10047 throw new TypeError(FUNC_ERROR_TEXT); |
|
10048 } |
|
10049 n = toInteger(n); |
|
10050 return function() { |
|
10051 if (--n > 0) { |
|
10052 result = func.apply(this, arguments); |
|
10053 } |
|
10054 if (n <= 1) { |
|
10055 func = undefined; |
|
10056 } |
|
10057 return result; |
|
10058 }; |
|
10059 } |
|
10060 |
|
10061 /** |
|
10062 * Creates a function that invokes `func` with the `this` binding of `thisArg` |
|
10063 * and `partials` prepended to the arguments it receives. |
|
10064 * |
|
10065 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, |
|
10066 * may be used as a placeholder for partially applied arguments. |
|
10067 * |
|
10068 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" |
|
10069 * property of bound functions. |
|
10070 * |
|
10071 * @static |
|
10072 * @memberOf _ |
|
10073 * @since 0.1.0 |
|
10074 * @category Function |
|
10075 * @param {Function} func The function to bind. |
|
10076 * @param {*} thisArg The `this` binding of `func`. |
|
10077 * @param {...*} [partials] The arguments to be partially applied. |
|
10078 * @returns {Function} Returns the new bound function. |
|
10079 * @example |
|
10080 * |
|
10081 * function greet(greeting, punctuation) { |
|
10082 * return greeting + ' ' + this.user + punctuation; |
|
10083 * } |
|
10084 * |
|
10085 * var object = { 'user': 'fred' }; |
|
10086 * |
|
10087 * var bound = _.bind(greet, object, 'hi'); |
|
10088 * bound('!'); |
|
10089 * // => 'hi fred!' |
|
10090 * |
|
10091 * // Bound with placeholders. |
|
10092 * var bound = _.bind(greet, object, _, '!'); |
|
10093 * bound('hi'); |
|
10094 * // => 'hi fred!' |
|
10095 */ |
|
10096 var bind = baseRest(function(func, thisArg, partials) { |
|
10097 var bitmask = WRAP_BIND_FLAG; |
|
10098 if (partials.length) { |
|
10099 var holders = replaceHolders(partials, getHolder(bind)); |
|
10100 bitmask |= WRAP_PARTIAL_FLAG; |
|
10101 } |
|
10102 return createWrap(func, bitmask, thisArg, partials, holders); |
|
10103 }); |
|
10104 |
|
10105 /** |
|
10106 * Creates a function that invokes the method at `object[key]` with `partials` |
|
10107 * prepended to the arguments it receives. |
|
10108 * |
|
10109 * This method differs from `_.bind` by allowing bound functions to reference |
|
10110 * methods that may be redefined or don't yet exist. See |
|
10111 * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) |
|
10112 * for more details. |
|
10113 * |
|
10114 * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic |
|
10115 * builds, may be used as a placeholder for partially applied arguments. |
|
10116 * |
|
10117 * @static |
|
10118 * @memberOf _ |
|
10119 * @since 0.10.0 |
|
10120 * @category Function |
|
10121 * @param {Object} object The object to invoke the method on. |
|
10122 * @param {string} key The key of the method. |
|
10123 * @param {...*} [partials] The arguments to be partially applied. |
|
10124 * @returns {Function} Returns the new bound function. |
|
10125 * @example |
|
10126 * |
|
10127 * var object = { |
|
10128 * 'user': 'fred', |
|
10129 * 'greet': function(greeting, punctuation) { |
|
10130 * return greeting + ' ' + this.user + punctuation; |
|
10131 * } |
|
10132 * }; |
|
10133 * |
|
10134 * var bound = _.bindKey(object, 'greet', 'hi'); |
|
10135 * bound('!'); |
|
10136 * // => 'hi fred!' |
|
10137 * |
|
10138 * object.greet = function(greeting, punctuation) { |
|
10139 * return greeting + 'ya ' + this.user + punctuation; |
|
10140 * }; |
|
10141 * |
|
10142 * bound('!'); |
|
10143 * // => 'hiya fred!' |
|
10144 * |
|
10145 * // Bound with placeholders. |
|
10146 * var bound = _.bindKey(object, 'greet', _, '!'); |
|
10147 * bound('hi'); |
|
10148 * // => 'hiya fred!' |
|
10149 */ |
|
10150 var bindKey = baseRest(function(object, key, partials) { |
|
10151 var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; |
|
10152 if (partials.length) { |
|
10153 var holders = replaceHolders(partials, getHolder(bindKey)); |
|
10154 bitmask |= WRAP_PARTIAL_FLAG; |
|
10155 } |
|
10156 return createWrap(key, bitmask, object, partials, holders); |
|
10157 }); |
|
10158 |
|
10159 /** |
|
10160 * Creates a function that accepts arguments of `func` and either invokes |
|
10161 * `func` returning its result, if at least `arity` number of arguments have |
|
10162 * been provided, or returns a function that accepts the remaining `func` |
|
10163 * arguments, and so on. The arity of `func` may be specified if `func.length` |
|
10164 * is not sufficient. |
|
10165 * |
|
10166 * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, |
|
10167 * may be used as a placeholder for provided arguments. |
|
10168 * |
|
10169 * **Note:** This method doesn't set the "length" property of curried functions. |
|
10170 * |
|
10171 * @static |
|
10172 * @memberOf _ |
|
10173 * @since 2.0.0 |
|
10174 * @category Function |
|
10175 * @param {Function} func The function to curry. |
|
10176 * @param {number} [arity=func.length] The arity of `func`. |
|
10177 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
10178 * @returns {Function} Returns the new curried function. |
|
10179 * @example |
|
10180 * |
|
10181 * var abc = function(a, b, c) { |
|
10182 * return [a, b, c]; |
|
10183 * }; |
|
10184 * |
|
10185 * var curried = _.curry(abc); |
|
10186 * |
|
10187 * curried(1)(2)(3); |
|
10188 * // => [1, 2, 3] |
|
10189 * |
|
10190 * curried(1, 2)(3); |
|
10191 * // => [1, 2, 3] |
|
10192 * |
|
10193 * curried(1, 2, 3); |
|
10194 * // => [1, 2, 3] |
|
10195 * |
|
10196 * // Curried with placeholders. |
|
10197 * curried(1)(_, 3)(2); |
|
10198 * // => [1, 2, 3] |
|
10199 */ |
|
10200 function curry(func, arity, guard) { |
|
10201 arity = guard ? undefined : arity; |
|
10202 var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); |
|
10203 result.placeholder = curry.placeholder; |
|
10204 return result; |
|
10205 } |
|
10206 |
|
10207 /** |
|
10208 * This method is like `_.curry` except that arguments are applied to `func` |
|
10209 * in the manner of `_.partialRight` instead of `_.partial`. |
|
10210 * |
|
10211 * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic |
|
10212 * builds, may be used as a placeholder for provided arguments. |
|
10213 * |
|
10214 * **Note:** This method doesn't set the "length" property of curried functions. |
|
10215 * |
|
10216 * @static |
|
10217 * @memberOf _ |
|
10218 * @since 3.0.0 |
|
10219 * @category Function |
|
10220 * @param {Function} func The function to curry. |
|
10221 * @param {number} [arity=func.length] The arity of `func`. |
|
10222 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
10223 * @returns {Function} Returns the new curried function. |
|
10224 * @example |
|
10225 * |
|
10226 * var abc = function(a, b, c) { |
|
10227 * return [a, b, c]; |
|
10228 * }; |
|
10229 * |
|
10230 * var curried = _.curryRight(abc); |
|
10231 * |
|
10232 * curried(3)(2)(1); |
|
10233 * // => [1, 2, 3] |
|
10234 * |
|
10235 * curried(2, 3)(1); |
|
10236 * // => [1, 2, 3] |
|
10237 * |
|
10238 * curried(1, 2, 3); |
|
10239 * // => [1, 2, 3] |
|
10240 * |
|
10241 * // Curried with placeholders. |
|
10242 * curried(3)(1, _)(2); |
|
10243 * // => [1, 2, 3] |
|
10244 */ |
|
10245 function curryRight(func, arity, guard) { |
|
10246 arity = guard ? undefined : arity; |
|
10247 var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); |
|
10248 result.placeholder = curryRight.placeholder; |
|
10249 return result; |
|
10250 } |
|
10251 |
|
10252 /** |
|
10253 * Creates a debounced function that delays invoking `func` until after `wait` |
|
10254 * milliseconds have elapsed since the last time the debounced function was |
|
10255 * invoked. The debounced function comes with a `cancel` method to cancel |
|
10256 * delayed `func` invocations and a `flush` method to immediately invoke them. |
|
10257 * Provide `options` to indicate whether `func` should be invoked on the |
|
10258 * leading and/or trailing edge of the `wait` timeout. The `func` is invoked |
|
10259 * with the last arguments provided to the debounced function. Subsequent |
|
10260 * calls to the debounced function return the result of the last `func` |
|
10261 * invocation. |
|
10262 * |
|
10263 * **Note:** If `leading` and `trailing` options are `true`, `func` is |
|
10264 * invoked on the trailing edge of the timeout only if the debounced function |
|
10265 * is invoked more than once during the `wait` timeout. |
|
10266 * |
|
10267 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred |
|
10268 * until to the next tick, similar to `setTimeout` with a timeout of `0`. |
|
10269 * |
|
10270 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) |
|
10271 * for details over the differences between `_.debounce` and `_.throttle`. |
|
10272 * |
|
10273 * @static |
|
10274 * @memberOf _ |
|
10275 * @since 0.1.0 |
|
10276 * @category Function |
|
10277 * @param {Function} func The function to debounce. |
|
10278 * @param {number} [wait=0] The number of milliseconds to delay. |
|
10279 * @param {Object} [options={}] The options object. |
|
10280 * @param {boolean} [options.leading=false] |
|
10281 * Specify invoking on the leading edge of the timeout. |
|
10282 * @param {number} [options.maxWait] |
|
10283 * The maximum time `func` is allowed to be delayed before it's invoked. |
|
10284 * @param {boolean} [options.trailing=true] |
|
10285 * Specify invoking on the trailing edge of the timeout. |
|
10286 * @returns {Function} Returns the new debounced function. |
|
10287 * @example |
|
10288 * |
|
10289 * // Avoid costly calculations while the window size is in flux. |
|
10290 * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); |
|
10291 * |
|
10292 * // Invoke `sendMail` when clicked, debouncing subsequent calls. |
|
10293 * jQuery(element).on('click', _.debounce(sendMail, 300, { |
|
10294 * 'leading': true, |
|
10295 * 'trailing': false |
|
10296 * })); |
|
10297 * |
|
10298 * // Ensure `batchLog` is invoked once after 1 second of debounced calls. |
|
10299 * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); |
|
10300 * var source = new EventSource('/stream'); |
|
10301 * jQuery(source).on('message', debounced); |
|
10302 * |
|
10303 * // Cancel the trailing debounced invocation. |
|
10304 * jQuery(window).on('popstate', debounced.cancel); |
|
10305 */ |
|
10306 function debounce(func, wait, options) { |
|
10307 var lastArgs, |
|
10308 lastThis, |
|
10309 maxWait, |
|
10310 result, |
|
10311 timerId, |
|
10312 lastCallTime, |
|
10313 lastInvokeTime = 0, |
|
10314 leading = false, |
|
10315 maxing = false, |
|
10316 trailing = true; |
|
10317 |
|
10318 if (typeof func != 'function') { |
|
10319 throw new TypeError(FUNC_ERROR_TEXT); |
|
10320 } |
|
10321 wait = toNumber(wait) || 0; |
|
10322 if (isObject(options)) { |
|
10323 leading = !!options.leading; |
|
10324 maxing = 'maxWait' in options; |
|
10325 maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; |
|
10326 trailing = 'trailing' in options ? !!options.trailing : trailing; |
|
10327 } |
|
10328 |
|
10329 function invokeFunc(time) { |
|
10330 var args = lastArgs, |
|
10331 thisArg = lastThis; |
|
10332 |
|
10333 lastArgs = lastThis = undefined; |
|
10334 lastInvokeTime = time; |
|
10335 result = func.apply(thisArg, args); |
|
10336 return result; |
|
10337 } |
|
10338 |
|
10339 function leadingEdge(time) { |
|
10340 // Reset any `maxWait` timer. |
|
10341 lastInvokeTime = time; |
|
10342 // Start the timer for the trailing edge. |
|
10343 timerId = setTimeout(timerExpired, wait); |
|
10344 // Invoke the leading edge. |
|
10345 return leading ? invokeFunc(time) : result; |
|
10346 } |
|
10347 |
|
10348 function remainingWait(time) { |
|
10349 var timeSinceLastCall = time - lastCallTime, |
|
10350 timeSinceLastInvoke = time - lastInvokeTime, |
|
10351 timeWaiting = wait - timeSinceLastCall; |
|
10352 |
|
10353 return maxing |
|
10354 ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) |
|
10355 : timeWaiting; |
|
10356 } |
|
10357 |
|
10358 function shouldInvoke(time) { |
|
10359 var timeSinceLastCall = time - lastCallTime, |
|
10360 timeSinceLastInvoke = time - lastInvokeTime; |
|
10361 |
|
10362 // Either this is the first call, activity has stopped and we're at the |
|
10363 // trailing edge, the system time has gone backwards and we're treating |
|
10364 // it as the trailing edge, or we've hit the `maxWait` limit. |
|
10365 return (lastCallTime === undefined || (timeSinceLastCall >= wait) || |
|
10366 (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); |
|
10367 } |
|
10368 |
|
10369 function timerExpired() { |
|
10370 var time = now(); |
|
10371 if (shouldInvoke(time)) { |
|
10372 return trailingEdge(time); |
|
10373 } |
|
10374 // Restart the timer. |
|
10375 timerId = setTimeout(timerExpired, remainingWait(time)); |
|
10376 } |
|
10377 |
|
10378 function trailingEdge(time) { |
|
10379 timerId = undefined; |
|
10380 |
|
10381 // Only invoke if we have `lastArgs` which means `func` has been |
|
10382 // debounced at least once. |
|
10383 if (trailing && lastArgs) { |
|
10384 return invokeFunc(time); |
|
10385 } |
|
10386 lastArgs = lastThis = undefined; |
|
10387 return result; |
|
10388 } |
|
10389 |
|
10390 function cancel() { |
|
10391 if (timerId !== undefined) { |
|
10392 clearTimeout(timerId); |
|
10393 } |
|
10394 lastInvokeTime = 0; |
|
10395 lastArgs = lastCallTime = lastThis = timerId = undefined; |
|
10396 } |
|
10397 |
|
10398 function flush() { |
|
10399 return timerId === undefined ? result : trailingEdge(now()); |
|
10400 } |
|
10401 |
|
10402 function debounced() { |
|
10403 var time = now(), |
|
10404 isInvoking = shouldInvoke(time); |
|
10405 |
|
10406 lastArgs = arguments; |
|
10407 lastThis = this; |
|
10408 lastCallTime = time; |
|
10409 |
|
10410 if (isInvoking) { |
|
10411 if (timerId === undefined) { |
|
10412 return leadingEdge(lastCallTime); |
|
10413 } |
|
10414 if (maxing) { |
|
10415 // Handle invocations in a tight loop. |
|
10416 timerId = setTimeout(timerExpired, wait); |
|
10417 return invokeFunc(lastCallTime); |
|
10418 } |
|
10419 } |
|
10420 if (timerId === undefined) { |
|
10421 timerId = setTimeout(timerExpired, wait); |
|
10422 } |
|
10423 return result; |
|
10424 } |
|
10425 debounced.cancel = cancel; |
|
10426 debounced.flush = flush; |
|
10427 return debounced; |
|
10428 } |
|
10429 |
|
10430 /** |
|
10431 * Defers invoking the `func` until the current call stack has cleared. Any |
|
10432 * additional arguments are provided to `func` when it's invoked. |
|
10433 * |
|
10434 * @static |
|
10435 * @memberOf _ |
|
10436 * @since 0.1.0 |
|
10437 * @category Function |
|
10438 * @param {Function} func The function to defer. |
|
10439 * @param {...*} [args] The arguments to invoke `func` with. |
|
10440 * @returns {number} Returns the timer id. |
|
10441 * @example |
|
10442 * |
|
10443 * _.defer(function(text) { |
|
10444 * console.log(text); |
|
10445 * }, 'deferred'); |
|
10446 * // => Logs 'deferred' after one millisecond. |
|
10447 */ |
|
10448 var defer = baseRest(function(func, args) { |
|
10449 return baseDelay(func, 1, args); |
|
10450 }); |
|
10451 |
|
10452 /** |
|
10453 * Invokes `func` after `wait` milliseconds. Any additional arguments are |
|
10454 * provided to `func` when it's invoked. |
|
10455 * |
|
10456 * @static |
|
10457 * @memberOf _ |
|
10458 * @since 0.1.0 |
|
10459 * @category Function |
|
10460 * @param {Function} func The function to delay. |
|
10461 * @param {number} wait The number of milliseconds to delay invocation. |
|
10462 * @param {...*} [args] The arguments to invoke `func` with. |
|
10463 * @returns {number} Returns the timer id. |
|
10464 * @example |
|
10465 * |
|
10466 * _.delay(function(text) { |
|
10467 * console.log(text); |
|
10468 * }, 1000, 'later'); |
|
10469 * // => Logs 'later' after one second. |
|
10470 */ |
|
10471 var delay = baseRest(function(func, wait, args) { |
|
10472 return baseDelay(func, toNumber(wait) || 0, args); |
|
10473 }); |
|
10474 |
|
10475 /** |
|
10476 * Creates a function that invokes `func` with arguments reversed. |
|
10477 * |
|
10478 * @static |
|
10479 * @memberOf _ |
|
10480 * @since 4.0.0 |
|
10481 * @category Function |
|
10482 * @param {Function} func The function to flip arguments for. |
|
10483 * @returns {Function} Returns the new flipped function. |
|
10484 * @example |
|
10485 * |
|
10486 * var flipped = _.flip(function() { |
|
10487 * return _.toArray(arguments); |
|
10488 * }); |
|
10489 * |
|
10490 * flipped('a', 'b', 'c', 'd'); |
|
10491 * // => ['d', 'c', 'b', 'a'] |
|
10492 */ |
|
10493 function flip(func) { |
|
10494 return createWrap(func, WRAP_FLIP_FLAG); |
|
10495 } |
|
10496 |
|
10497 /** |
|
10498 * Creates a function that memoizes the result of `func`. If `resolver` is |
|
10499 * provided, it determines the cache key for storing the result based on the |
|
10500 * arguments provided to the memoized function. By default, the first argument |
|
10501 * provided to the memoized function is used as the map cache key. The `func` |
|
10502 * is invoked with the `this` binding of the memoized function. |
|
10503 * |
|
10504 * **Note:** The cache is exposed as the `cache` property on the memoized |
|
10505 * function. Its creation may be customized by replacing the `_.memoize.Cache` |
|
10506 * constructor with one whose instances implement the |
|
10507 * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) |
|
10508 * method interface of `clear`, `delete`, `get`, `has`, and `set`. |
|
10509 * |
|
10510 * @static |
|
10511 * @memberOf _ |
|
10512 * @since 0.1.0 |
|
10513 * @category Function |
|
10514 * @param {Function} func The function to have its output memoized. |
|
10515 * @param {Function} [resolver] The function to resolve the cache key. |
|
10516 * @returns {Function} Returns the new memoized function. |
|
10517 * @example |
|
10518 * |
|
10519 * var object = { 'a': 1, 'b': 2 }; |
|
10520 * var other = { 'c': 3, 'd': 4 }; |
|
10521 * |
|
10522 * var values = _.memoize(_.values); |
|
10523 * values(object); |
|
10524 * // => [1, 2] |
|
10525 * |
|
10526 * values(other); |
|
10527 * // => [3, 4] |
|
10528 * |
|
10529 * object.a = 2; |
|
10530 * values(object); |
|
10531 * // => [1, 2] |
|
10532 * |
|
10533 * // Modify the result cache. |
|
10534 * values.cache.set(object, ['a', 'b']); |
|
10535 * values(object); |
|
10536 * // => ['a', 'b'] |
|
10537 * |
|
10538 * // Replace `_.memoize.Cache`. |
|
10539 * _.memoize.Cache = WeakMap; |
|
10540 */ |
|
10541 function memoize(func, resolver) { |
|
10542 if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { |
|
10543 throw new TypeError(FUNC_ERROR_TEXT); |
|
10544 } |
|
10545 var memoized = function() { |
|
10546 var args = arguments, |
|
10547 key = resolver ? resolver.apply(this, args) : args[0], |
|
10548 cache = memoized.cache; |
|
10549 |
|
10550 if (cache.has(key)) { |
|
10551 return cache.get(key); |
|
10552 } |
|
10553 var result = func.apply(this, args); |
|
10554 memoized.cache = cache.set(key, result) || cache; |
|
10555 return result; |
|
10556 }; |
|
10557 memoized.cache = new (memoize.Cache || MapCache); |
|
10558 return memoized; |
|
10559 } |
|
10560 |
|
10561 // Expose `MapCache`. |
|
10562 memoize.Cache = MapCache; |
|
10563 |
|
10564 /** |
|
10565 * Creates a function that negates the result of the predicate `func`. The |
|
10566 * `func` predicate is invoked with the `this` binding and arguments of the |
|
10567 * created function. |
|
10568 * |
|
10569 * @static |
|
10570 * @memberOf _ |
|
10571 * @since 3.0.0 |
|
10572 * @category Function |
|
10573 * @param {Function} predicate The predicate to negate. |
|
10574 * @returns {Function} Returns the new negated function. |
|
10575 * @example |
|
10576 * |
|
10577 * function isEven(n) { |
|
10578 * return n % 2 == 0; |
|
10579 * } |
|
10580 * |
|
10581 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); |
|
10582 * // => [1, 3, 5] |
|
10583 */ |
|
10584 function negate(predicate) { |
|
10585 if (typeof predicate != 'function') { |
|
10586 throw new TypeError(FUNC_ERROR_TEXT); |
|
10587 } |
|
10588 return function() { |
|
10589 var args = arguments; |
|
10590 switch (args.length) { |
|
10591 case 0: return !predicate.call(this); |
|
10592 case 1: return !predicate.call(this, args[0]); |
|
10593 case 2: return !predicate.call(this, args[0], args[1]); |
|
10594 case 3: return !predicate.call(this, args[0], args[1], args[2]); |
|
10595 } |
|
10596 return !predicate.apply(this, args); |
|
10597 }; |
|
10598 } |
|
10599 |
|
10600 /** |
|
10601 * Creates a function that is restricted to invoking `func` once. Repeat calls |
|
10602 * to the function return the value of the first invocation. The `func` is |
|
10603 * invoked with the `this` binding and arguments of the created function. |
|
10604 * |
|
10605 * @static |
|
10606 * @memberOf _ |
|
10607 * @since 0.1.0 |
|
10608 * @category Function |
|
10609 * @param {Function} func The function to restrict. |
|
10610 * @returns {Function} Returns the new restricted function. |
|
10611 * @example |
|
10612 * |
|
10613 * var initialize = _.once(createApplication); |
|
10614 * initialize(); |
|
10615 * initialize(); |
|
10616 * // => `createApplication` is invoked once |
|
10617 */ |
|
10618 function once(func) { |
|
10619 return before(2, func); |
|
10620 } |
|
10621 |
|
10622 /** |
|
10623 * Creates a function that invokes `func` with its arguments transformed. |
|
10624 * |
|
10625 * @static |
|
10626 * @since 4.0.0 |
|
10627 * @memberOf _ |
|
10628 * @category Function |
|
10629 * @param {Function} func The function to wrap. |
|
10630 * @param {...(Function|Function[])} [transforms=[_.identity]] |
|
10631 * The argument transforms. |
|
10632 * @returns {Function} Returns the new function. |
|
10633 * @example |
|
10634 * |
|
10635 * function doubled(n) { |
|
10636 * return n * 2; |
|
10637 * } |
|
10638 * |
|
10639 * function square(n) { |
|
10640 * return n * n; |
|
10641 * } |
|
10642 * |
|
10643 * var func = _.overArgs(function(x, y) { |
|
10644 * return [x, y]; |
|
10645 * }, [square, doubled]); |
|
10646 * |
|
10647 * func(9, 3); |
|
10648 * // => [81, 6] |
|
10649 * |
|
10650 * func(10, 5); |
|
10651 * // => [100, 10] |
|
10652 */ |
|
10653 var overArgs = castRest(function(func, transforms) { |
|
10654 transforms = (transforms.length == 1 && isArray(transforms[0])) |
|
10655 ? arrayMap(transforms[0], baseUnary(getIteratee())) |
|
10656 : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); |
|
10657 |
|
10658 var funcsLength = transforms.length; |
|
10659 return baseRest(function(args) { |
|
10660 var index = -1, |
|
10661 length = nativeMin(args.length, funcsLength); |
|
10662 |
|
10663 while (++index < length) { |
|
10664 args[index] = transforms[index].call(this, args[index]); |
|
10665 } |
|
10666 return apply(func, this, args); |
|
10667 }); |
|
10668 }); |
|
10669 |
|
10670 /** |
|
10671 * Creates a function that invokes `func` with `partials` prepended to the |
|
10672 * arguments it receives. This method is like `_.bind` except it does **not** |
|
10673 * alter the `this` binding. |
|
10674 * |
|
10675 * The `_.partial.placeholder` value, which defaults to `_` in monolithic |
|
10676 * builds, may be used as a placeholder for partially applied arguments. |
|
10677 * |
|
10678 * **Note:** This method doesn't set the "length" property of partially |
|
10679 * applied functions. |
|
10680 * |
|
10681 * @static |
|
10682 * @memberOf _ |
|
10683 * @since 0.2.0 |
|
10684 * @category Function |
|
10685 * @param {Function} func The function to partially apply arguments to. |
|
10686 * @param {...*} [partials] The arguments to be partially applied. |
|
10687 * @returns {Function} Returns the new partially applied function. |
|
10688 * @example |
|
10689 * |
|
10690 * function greet(greeting, name) { |
|
10691 * return greeting + ' ' + name; |
|
10692 * } |
|
10693 * |
|
10694 * var sayHelloTo = _.partial(greet, 'hello'); |
|
10695 * sayHelloTo('fred'); |
|
10696 * // => 'hello fred' |
|
10697 * |
|
10698 * // Partially applied with placeholders. |
|
10699 * var greetFred = _.partial(greet, _, 'fred'); |
|
10700 * greetFred('hi'); |
|
10701 * // => 'hi fred' |
|
10702 */ |
|
10703 var partial = baseRest(function(func, partials) { |
|
10704 var holders = replaceHolders(partials, getHolder(partial)); |
|
10705 return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); |
|
10706 }); |
|
10707 |
|
10708 /** |
|
10709 * This method is like `_.partial` except that partially applied arguments |
|
10710 * are appended to the arguments it receives. |
|
10711 * |
|
10712 * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic |
|
10713 * builds, may be used as a placeholder for partially applied arguments. |
|
10714 * |
|
10715 * **Note:** This method doesn't set the "length" property of partially |
|
10716 * applied functions. |
|
10717 * |
|
10718 * @static |
|
10719 * @memberOf _ |
|
10720 * @since 1.0.0 |
|
10721 * @category Function |
|
10722 * @param {Function} func The function to partially apply arguments to. |
|
10723 * @param {...*} [partials] The arguments to be partially applied. |
|
10724 * @returns {Function} Returns the new partially applied function. |
|
10725 * @example |
|
10726 * |
|
10727 * function greet(greeting, name) { |
|
10728 * return greeting + ' ' + name; |
|
10729 * } |
|
10730 * |
|
10731 * var greetFred = _.partialRight(greet, 'fred'); |
|
10732 * greetFred('hi'); |
|
10733 * // => 'hi fred' |
|
10734 * |
|
10735 * // Partially applied with placeholders. |
|
10736 * var sayHelloTo = _.partialRight(greet, 'hello', _); |
|
10737 * sayHelloTo('fred'); |
|
10738 * // => 'hello fred' |
|
10739 */ |
|
10740 var partialRight = baseRest(function(func, partials) { |
|
10741 var holders = replaceHolders(partials, getHolder(partialRight)); |
|
10742 return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); |
|
10743 }); |
|
10744 |
|
10745 /** |
|
10746 * Creates a function that invokes `func` with arguments arranged according |
|
10747 * to the specified `indexes` where the argument value at the first index is |
|
10748 * provided as the first argument, the argument value at the second index is |
|
10749 * provided as the second argument, and so on. |
|
10750 * |
|
10751 * @static |
|
10752 * @memberOf _ |
|
10753 * @since 3.0.0 |
|
10754 * @category Function |
|
10755 * @param {Function} func The function to rearrange arguments for. |
|
10756 * @param {...(number|number[])} indexes The arranged argument indexes. |
|
10757 * @returns {Function} Returns the new function. |
|
10758 * @example |
|
10759 * |
|
10760 * var rearged = _.rearg(function(a, b, c) { |
|
10761 * return [a, b, c]; |
|
10762 * }, [2, 0, 1]); |
|
10763 * |
|
10764 * rearged('b', 'c', 'a') |
|
10765 * // => ['a', 'b', 'c'] |
|
10766 */ |
|
10767 var rearg = flatRest(function(func, indexes) { |
|
10768 return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); |
|
10769 }); |
|
10770 |
|
10771 /** |
|
10772 * Creates a function that invokes `func` with the `this` binding of the |
|
10773 * created function and arguments from `start` and beyond provided as |
|
10774 * an array. |
|
10775 * |
|
10776 * **Note:** This method is based on the |
|
10777 * [rest parameter](https://mdn.io/rest_parameters). |
|
10778 * |
|
10779 * @static |
|
10780 * @memberOf _ |
|
10781 * @since 4.0.0 |
|
10782 * @category Function |
|
10783 * @param {Function} func The function to apply a rest parameter to. |
|
10784 * @param {number} [start=func.length-1] The start position of the rest parameter. |
|
10785 * @returns {Function} Returns the new function. |
|
10786 * @example |
|
10787 * |
|
10788 * var say = _.rest(function(what, names) { |
|
10789 * return what + ' ' + _.initial(names).join(', ') + |
|
10790 * (_.size(names) > 1 ? ', & ' : '') + _.last(names); |
|
10791 * }); |
|
10792 * |
|
10793 * say('hello', 'fred', 'barney', 'pebbles'); |
|
10794 * // => 'hello fred, barney, & pebbles' |
|
10795 */ |
|
10796 function rest(func, start) { |
|
10797 if (typeof func != 'function') { |
|
10798 throw new TypeError(FUNC_ERROR_TEXT); |
|
10799 } |
|
10800 start = start === undefined ? start : toInteger(start); |
|
10801 return baseRest(func, start); |
|
10802 } |
|
10803 |
|
10804 /** |
|
10805 * Creates a function that invokes `func` with the `this` binding of the |
|
10806 * create function and an array of arguments much like |
|
10807 * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). |
|
10808 * |
|
10809 * **Note:** This method is based on the |
|
10810 * [spread operator](https://mdn.io/spread_operator). |
|
10811 * |
|
10812 * @static |
|
10813 * @memberOf _ |
|
10814 * @since 3.2.0 |
|
10815 * @category Function |
|
10816 * @param {Function} func The function to spread arguments over. |
|
10817 * @param {number} [start=0] The start position of the spread. |
|
10818 * @returns {Function} Returns the new function. |
|
10819 * @example |
|
10820 * |
|
10821 * var say = _.spread(function(who, what) { |
|
10822 * return who + ' says ' + what; |
|
10823 * }); |
|
10824 * |
|
10825 * say(['fred', 'hello']); |
|
10826 * // => 'fred says hello' |
|
10827 * |
|
10828 * var numbers = Promise.all([ |
|
10829 * Promise.resolve(40), |
|
10830 * Promise.resolve(36) |
|
10831 * ]); |
|
10832 * |
|
10833 * numbers.then(_.spread(function(x, y) { |
|
10834 * return x + y; |
|
10835 * })); |
|
10836 * // => a Promise of 76 |
|
10837 */ |
|
10838 function spread(func, start) { |
|
10839 if (typeof func != 'function') { |
|
10840 throw new TypeError(FUNC_ERROR_TEXT); |
|
10841 } |
|
10842 start = start == null ? 0 : nativeMax(toInteger(start), 0); |
|
10843 return baseRest(function(args) { |
|
10844 var array = args[start], |
|
10845 otherArgs = castSlice(args, 0, start); |
|
10846 |
|
10847 if (array) { |
|
10848 arrayPush(otherArgs, array); |
|
10849 } |
|
10850 return apply(func, this, otherArgs); |
|
10851 }); |
|
10852 } |
|
10853 |
|
10854 /** |
|
10855 * Creates a throttled function that only invokes `func` at most once per |
|
10856 * every `wait` milliseconds. The throttled function comes with a `cancel` |
|
10857 * method to cancel delayed `func` invocations and a `flush` method to |
|
10858 * immediately invoke them. Provide `options` to indicate whether `func` |
|
10859 * should be invoked on the leading and/or trailing edge of the `wait` |
|
10860 * timeout. The `func` is invoked with the last arguments provided to the |
|
10861 * throttled function. Subsequent calls to the throttled function return the |
|
10862 * result of the last `func` invocation. |
|
10863 * |
|
10864 * **Note:** If `leading` and `trailing` options are `true`, `func` is |
|
10865 * invoked on the trailing edge of the timeout only if the throttled function |
|
10866 * is invoked more than once during the `wait` timeout. |
|
10867 * |
|
10868 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred |
|
10869 * until to the next tick, similar to `setTimeout` with a timeout of `0`. |
|
10870 * |
|
10871 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) |
|
10872 * for details over the differences between `_.throttle` and `_.debounce`. |
|
10873 * |
|
10874 * @static |
|
10875 * @memberOf _ |
|
10876 * @since 0.1.0 |
|
10877 * @category Function |
|
10878 * @param {Function} func The function to throttle. |
|
10879 * @param {number} [wait=0] The number of milliseconds to throttle invocations to. |
|
10880 * @param {Object} [options={}] The options object. |
|
10881 * @param {boolean} [options.leading=true] |
|
10882 * Specify invoking on the leading edge of the timeout. |
|
10883 * @param {boolean} [options.trailing=true] |
|
10884 * Specify invoking on the trailing edge of the timeout. |
|
10885 * @returns {Function} Returns the new throttled function. |
|
10886 * @example |
|
10887 * |
|
10888 * // Avoid excessively updating the position while scrolling. |
|
10889 * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); |
|
10890 * |
|
10891 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. |
|
10892 * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); |
|
10893 * jQuery(element).on('click', throttled); |
|
10894 * |
|
10895 * // Cancel the trailing throttled invocation. |
|
10896 * jQuery(window).on('popstate', throttled.cancel); |
|
10897 */ |
|
10898 function throttle(func, wait, options) { |
|
10899 var leading = true, |
|
10900 trailing = true; |
|
10901 |
|
10902 if (typeof func != 'function') { |
|
10903 throw new TypeError(FUNC_ERROR_TEXT); |
|
10904 } |
|
10905 if (isObject(options)) { |
|
10906 leading = 'leading' in options ? !!options.leading : leading; |
|
10907 trailing = 'trailing' in options ? !!options.trailing : trailing; |
|
10908 } |
|
10909 return debounce(func, wait, { |
|
10910 'leading': leading, |
|
10911 'maxWait': wait, |
|
10912 'trailing': trailing |
|
10913 }); |
|
10914 } |
|
10915 |
|
10916 /** |
|
10917 * Creates a function that accepts up to one argument, ignoring any |
|
10918 * additional arguments. |
|
10919 * |
|
10920 * @static |
|
10921 * @memberOf _ |
|
10922 * @since 4.0.0 |
|
10923 * @category Function |
|
10924 * @param {Function} func The function to cap arguments for. |
|
10925 * @returns {Function} Returns the new capped function. |
|
10926 * @example |
|
10927 * |
|
10928 * _.map(['6', '8', '10'], _.unary(parseInt)); |
|
10929 * // => [6, 8, 10] |
|
10930 */ |
|
10931 function unary(func) { |
|
10932 return ary(func, 1); |
|
10933 } |
|
10934 |
|
10935 /** |
|
10936 * Creates a function that provides `value` to `wrapper` as its first |
|
10937 * argument. Any additional arguments provided to the function are appended |
|
10938 * to those provided to the `wrapper`. The wrapper is invoked with the `this` |
|
10939 * binding of the created function. |
|
10940 * |
|
10941 * @static |
|
10942 * @memberOf _ |
|
10943 * @since 0.1.0 |
|
10944 * @category Function |
|
10945 * @param {*} value The value to wrap. |
|
10946 * @param {Function} [wrapper=identity] The wrapper function. |
|
10947 * @returns {Function} Returns the new function. |
|
10948 * @example |
|
10949 * |
|
10950 * var p = _.wrap(_.escape, function(func, text) { |
|
10951 * return '<p>' + func(text) + '</p>'; |
|
10952 * }); |
|
10953 * |
|
10954 * p('fred, barney, & pebbles'); |
|
10955 * // => '<p>fred, barney, & pebbles</p>' |
|
10956 */ |
|
10957 function wrap(value, wrapper) { |
|
10958 return partial(castFunction(wrapper), value); |
|
10959 } |
|
10960 |
|
10961 /*------------------------------------------------------------------------*/ |
|
10962 |
|
10963 /** |
|
10964 * Casts `value` as an array if it's not one. |
|
10965 * |
|
10966 * @static |
|
10967 * @memberOf _ |
|
10968 * @since 4.4.0 |
|
10969 * @category Lang |
|
10970 * @param {*} value The value to inspect. |
|
10971 * @returns {Array} Returns the cast array. |
|
10972 * @example |
|
10973 * |
|
10974 * _.castArray(1); |
|
10975 * // => [1] |
|
10976 * |
|
10977 * _.castArray({ 'a': 1 }); |
|
10978 * // => [{ 'a': 1 }] |
|
10979 * |
|
10980 * _.castArray('abc'); |
|
10981 * // => ['abc'] |
|
10982 * |
|
10983 * _.castArray(null); |
|
10984 * // => [null] |
|
10985 * |
|
10986 * _.castArray(undefined); |
|
10987 * // => [undefined] |
|
10988 * |
|
10989 * _.castArray(); |
|
10990 * // => [] |
|
10991 * |
|
10992 * var array = [1, 2, 3]; |
|
10993 * console.log(_.castArray(array) === array); |
|
10994 * // => true |
|
10995 */ |
|
10996 function castArray() { |
|
10997 if (!arguments.length) { |
|
10998 return []; |
|
10999 } |
|
11000 var value = arguments[0]; |
|
11001 return isArray(value) ? value : [value]; |
|
11002 } |
|
11003 |
|
11004 /** |
|
11005 * Creates a shallow clone of `value`. |
|
11006 * |
|
11007 * **Note:** This method is loosely based on the |
|
11008 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) |
|
11009 * and supports cloning arrays, array buffers, booleans, date objects, maps, |
|
11010 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed |
|
11011 * arrays. The own enumerable properties of `arguments` objects are cloned |
|
11012 * as plain objects. An empty object is returned for uncloneable values such |
|
11013 * as error objects, functions, DOM nodes, and WeakMaps. |
|
11014 * |
|
11015 * @static |
|
11016 * @memberOf _ |
|
11017 * @since 0.1.0 |
|
11018 * @category Lang |
|
11019 * @param {*} value The value to clone. |
|
11020 * @returns {*} Returns the cloned value. |
|
11021 * @see _.cloneDeep |
|
11022 * @example |
|
11023 * |
|
11024 * var objects = [{ 'a': 1 }, { 'b': 2 }]; |
|
11025 * |
|
11026 * var shallow = _.clone(objects); |
|
11027 * console.log(shallow[0] === objects[0]); |
|
11028 * // => true |
|
11029 */ |
|
11030 function clone(value) { |
|
11031 return baseClone(value, CLONE_SYMBOLS_FLAG); |
|
11032 } |
|
11033 |
|
11034 /** |
|
11035 * This method is like `_.clone` except that it accepts `customizer` which |
|
11036 * is invoked to produce the cloned value. If `customizer` returns `undefined`, |
|
11037 * cloning is handled by the method instead. The `customizer` is invoked with |
|
11038 * up to four arguments; (value [, index|key, object, stack]). |
|
11039 * |
|
11040 * @static |
|
11041 * @memberOf _ |
|
11042 * @since 4.0.0 |
|
11043 * @category Lang |
|
11044 * @param {*} value The value to clone. |
|
11045 * @param {Function} [customizer] The function to customize cloning. |
|
11046 * @returns {*} Returns the cloned value. |
|
11047 * @see _.cloneDeepWith |
|
11048 * @example |
|
11049 * |
|
11050 * function customizer(value) { |
|
11051 * if (_.isElement(value)) { |
|
11052 * return value.cloneNode(false); |
|
11053 * } |
|
11054 * } |
|
11055 * |
|
11056 * var el = _.cloneWith(document.body, customizer); |
|
11057 * |
|
11058 * console.log(el === document.body); |
|
11059 * // => false |
|
11060 * console.log(el.nodeName); |
|
11061 * // => 'BODY' |
|
11062 * console.log(el.childNodes.length); |
|
11063 * // => 0 |
|
11064 */ |
|
11065 function cloneWith(value, customizer) { |
|
11066 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
11067 return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); |
|
11068 } |
|
11069 |
|
11070 /** |
|
11071 * This method is like `_.clone` except that it recursively clones `value`. |
|
11072 * |
|
11073 * @static |
|
11074 * @memberOf _ |
|
11075 * @since 1.0.0 |
|
11076 * @category Lang |
|
11077 * @param {*} value The value to recursively clone. |
|
11078 * @returns {*} Returns the deep cloned value. |
|
11079 * @see _.clone |
|
11080 * @example |
|
11081 * |
|
11082 * var objects = [{ 'a': 1 }, { 'b': 2 }]; |
|
11083 * |
|
11084 * var deep = _.cloneDeep(objects); |
|
11085 * console.log(deep[0] === objects[0]); |
|
11086 * // => false |
|
11087 */ |
|
11088 function cloneDeep(value) { |
|
11089 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); |
|
11090 } |
|
11091 |
|
11092 /** |
|
11093 * This method is like `_.cloneWith` except that it recursively clones `value`. |
|
11094 * |
|
11095 * @static |
|
11096 * @memberOf _ |
|
11097 * @since 4.0.0 |
|
11098 * @category Lang |
|
11099 * @param {*} value The value to recursively clone. |
|
11100 * @param {Function} [customizer] The function to customize cloning. |
|
11101 * @returns {*} Returns the deep cloned value. |
|
11102 * @see _.cloneWith |
|
11103 * @example |
|
11104 * |
|
11105 * function customizer(value) { |
|
11106 * if (_.isElement(value)) { |
|
11107 * return value.cloneNode(true); |
|
11108 * } |
|
11109 * } |
|
11110 * |
|
11111 * var el = _.cloneDeepWith(document.body, customizer); |
|
11112 * |
|
11113 * console.log(el === document.body); |
|
11114 * // => false |
|
11115 * console.log(el.nodeName); |
|
11116 * // => 'BODY' |
|
11117 * console.log(el.childNodes.length); |
|
11118 * // => 20 |
|
11119 */ |
|
11120 function cloneDeepWith(value, customizer) { |
|
11121 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
11122 return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); |
|
11123 } |
|
11124 |
|
11125 /** |
|
11126 * Checks if `object` conforms to `source` by invoking the predicate |
|
11127 * properties of `source` with the corresponding property values of `object`. |
|
11128 * |
|
11129 * **Note:** This method is equivalent to `_.conforms` when `source` is |
|
11130 * partially applied. |
|
11131 * |
|
11132 * @static |
|
11133 * @memberOf _ |
|
11134 * @since 4.14.0 |
|
11135 * @category Lang |
|
11136 * @param {Object} object The object to inspect. |
|
11137 * @param {Object} source The object of property predicates to conform to. |
|
11138 * @returns {boolean} Returns `true` if `object` conforms, else `false`. |
|
11139 * @example |
|
11140 * |
|
11141 * var object = { 'a': 1, 'b': 2 }; |
|
11142 * |
|
11143 * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); |
|
11144 * // => true |
|
11145 * |
|
11146 * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); |
|
11147 * // => false |
|
11148 */ |
|
11149 function conformsTo(object, source) { |
|
11150 return source == null || baseConformsTo(object, source, keys(source)); |
|
11151 } |
|
11152 |
|
11153 /** |
|
11154 * Performs a |
|
11155 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) |
|
11156 * comparison between two values to determine if they are equivalent. |
|
11157 * |
|
11158 * @static |
|
11159 * @memberOf _ |
|
11160 * @since 4.0.0 |
|
11161 * @category Lang |
|
11162 * @param {*} value The value to compare. |
|
11163 * @param {*} other The other value to compare. |
|
11164 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
|
11165 * @example |
|
11166 * |
|
11167 * var object = { 'a': 1 }; |
|
11168 * var other = { 'a': 1 }; |
|
11169 * |
|
11170 * _.eq(object, object); |
|
11171 * // => true |
|
11172 * |
|
11173 * _.eq(object, other); |
|
11174 * // => false |
|
11175 * |
|
11176 * _.eq('a', 'a'); |
|
11177 * // => true |
|
11178 * |
|
11179 * _.eq('a', Object('a')); |
|
11180 * // => false |
|
11181 * |
|
11182 * _.eq(NaN, NaN); |
|
11183 * // => true |
|
11184 */ |
|
11185 function eq(value, other) { |
|
11186 return value === other || (value !== value && other !== other); |
|
11187 } |
|
11188 |
|
11189 /** |
|
11190 * Checks if `value` is greater than `other`. |
|
11191 * |
|
11192 * @static |
|
11193 * @memberOf _ |
|
11194 * @since 3.9.0 |
|
11195 * @category Lang |
|
11196 * @param {*} value The value to compare. |
|
11197 * @param {*} other The other value to compare. |
|
11198 * @returns {boolean} Returns `true` if `value` is greater than `other`, |
|
11199 * else `false`. |
|
11200 * @see _.lt |
|
11201 * @example |
|
11202 * |
|
11203 * _.gt(3, 1); |
|
11204 * // => true |
|
11205 * |
|
11206 * _.gt(3, 3); |
|
11207 * // => false |
|
11208 * |
|
11209 * _.gt(1, 3); |
|
11210 * // => false |
|
11211 */ |
|
11212 var gt = createRelationalOperation(baseGt); |
|
11213 |
|
11214 /** |
|
11215 * Checks if `value` is greater than or equal to `other`. |
|
11216 * |
|
11217 * @static |
|
11218 * @memberOf _ |
|
11219 * @since 3.9.0 |
|
11220 * @category Lang |
|
11221 * @param {*} value The value to compare. |
|
11222 * @param {*} other The other value to compare. |
|
11223 * @returns {boolean} Returns `true` if `value` is greater than or equal to |
|
11224 * `other`, else `false`. |
|
11225 * @see _.lte |
|
11226 * @example |
|
11227 * |
|
11228 * _.gte(3, 1); |
|
11229 * // => true |
|
11230 * |
|
11231 * _.gte(3, 3); |
|
11232 * // => true |
|
11233 * |
|
11234 * _.gte(1, 3); |
|
11235 * // => false |
|
11236 */ |
|
11237 var gte = createRelationalOperation(function(value, other) { |
|
11238 return value >= other; |
|
11239 }); |
|
11240 |
|
11241 /** |
|
11242 * Checks if `value` is likely an `arguments` object. |
|
11243 * |
|
11244 * @static |
|
11245 * @memberOf _ |
|
11246 * @since 0.1.0 |
|
11247 * @category Lang |
|
11248 * @param {*} value The value to check. |
|
11249 * @returns {boolean} Returns `true` if `value` is an `arguments` object, |
|
11250 * else `false`. |
|
11251 * @example |
|
11252 * |
|
11253 * _.isArguments(function() { return arguments; }()); |
|
11254 * // => true |
|
11255 * |
|
11256 * _.isArguments([1, 2, 3]); |
|
11257 * // => false |
|
11258 */ |
|
11259 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { |
|
11260 return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && |
|
11261 !propertyIsEnumerable.call(value, 'callee'); |
|
11262 }; |
|
11263 |
|
11264 /** |
|
11265 * Checks if `value` is classified as an `Array` object. |
|
11266 * |
|
11267 * @static |
|
11268 * @memberOf _ |
|
11269 * @since 0.1.0 |
|
11270 * @category Lang |
|
11271 * @param {*} value The value to check. |
|
11272 * @returns {boolean} Returns `true` if `value` is an array, else `false`. |
|
11273 * @example |
|
11274 * |
|
11275 * _.isArray([1, 2, 3]); |
|
11276 * // => true |
|
11277 * |
|
11278 * _.isArray(document.body.children); |
|
11279 * // => false |
|
11280 * |
|
11281 * _.isArray('abc'); |
|
11282 * // => false |
|
11283 * |
|
11284 * _.isArray(_.noop); |
|
11285 * // => false |
|
11286 */ |
|
11287 var isArray = Array.isArray; |
|
11288 |
|
11289 /** |
|
11290 * Checks if `value` is classified as an `ArrayBuffer` object. |
|
11291 * |
|
11292 * @static |
|
11293 * @memberOf _ |
|
11294 * @since 4.3.0 |
|
11295 * @category Lang |
|
11296 * @param {*} value The value to check. |
|
11297 * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. |
|
11298 * @example |
|
11299 * |
|
11300 * _.isArrayBuffer(new ArrayBuffer(2)); |
|
11301 * // => true |
|
11302 * |
|
11303 * _.isArrayBuffer(new Array(2)); |
|
11304 * // => false |
|
11305 */ |
|
11306 var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; |
|
11307 |
|
11308 /** |
|
11309 * Checks if `value` is array-like. A value is considered array-like if it's |
|
11310 * not a function and has a `value.length` that's an integer greater than or |
|
11311 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. |
|
11312 * |
|
11313 * @static |
|
11314 * @memberOf _ |
|
11315 * @since 4.0.0 |
|
11316 * @category Lang |
|
11317 * @param {*} value The value to check. |
|
11318 * @returns {boolean} Returns `true` if `value` is array-like, else `false`. |
|
11319 * @example |
|
11320 * |
|
11321 * _.isArrayLike([1, 2, 3]); |
|
11322 * // => true |
|
11323 * |
|
11324 * _.isArrayLike(document.body.children); |
|
11325 * // => true |
|
11326 * |
|
11327 * _.isArrayLike('abc'); |
|
11328 * // => true |
|
11329 * |
|
11330 * _.isArrayLike(_.noop); |
|
11331 * // => false |
|
11332 */ |
|
11333 function isArrayLike(value) { |
|
11334 return value != null && isLength(value.length) && !isFunction(value); |
|
11335 } |
|
11336 |
|
11337 /** |
|
11338 * This method is like `_.isArrayLike` except that it also checks if `value` |
|
11339 * is an object. |
|
11340 * |
|
11341 * @static |
|
11342 * @memberOf _ |
|
11343 * @since 4.0.0 |
|
11344 * @category Lang |
|
11345 * @param {*} value The value to check. |
|
11346 * @returns {boolean} Returns `true` if `value` is an array-like object, |
|
11347 * else `false`. |
|
11348 * @example |
|
11349 * |
|
11350 * _.isArrayLikeObject([1, 2, 3]); |
|
11351 * // => true |
|
11352 * |
|
11353 * _.isArrayLikeObject(document.body.children); |
|
11354 * // => true |
|
11355 * |
|
11356 * _.isArrayLikeObject('abc'); |
|
11357 * // => false |
|
11358 * |
|
11359 * _.isArrayLikeObject(_.noop); |
|
11360 * // => false |
|
11361 */ |
|
11362 function isArrayLikeObject(value) { |
|
11363 return isObjectLike(value) && isArrayLike(value); |
|
11364 } |
|
11365 |
|
11366 /** |
|
11367 * Checks if `value` is classified as a boolean primitive or object. |
|
11368 * |
|
11369 * @static |
|
11370 * @memberOf _ |
|
11371 * @since 0.1.0 |
|
11372 * @category Lang |
|
11373 * @param {*} value The value to check. |
|
11374 * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. |
|
11375 * @example |
|
11376 * |
|
11377 * _.isBoolean(false); |
|
11378 * // => true |
|
11379 * |
|
11380 * _.isBoolean(null); |
|
11381 * // => false |
|
11382 */ |
|
11383 function isBoolean(value) { |
|
11384 return value === true || value === false || |
|
11385 (isObjectLike(value) && baseGetTag(value) == boolTag); |
|
11386 } |
|
11387 |
|
11388 /** |
|
11389 * Checks if `value` is a buffer. |
|
11390 * |
|
11391 * @static |
|
11392 * @memberOf _ |
|
11393 * @since 4.3.0 |
|
11394 * @category Lang |
|
11395 * @param {*} value The value to check. |
|
11396 * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. |
|
11397 * @example |
|
11398 * |
|
11399 * _.isBuffer(new Buffer(2)); |
|
11400 * // => true |
|
11401 * |
|
11402 * _.isBuffer(new Uint8Array(2)); |
|
11403 * // => false |
|
11404 */ |
|
11405 var isBuffer = nativeIsBuffer || stubFalse; |
|
11406 |
|
11407 /** |
|
11408 * Checks if `value` is classified as a `Date` object. |
|
11409 * |
|
11410 * @static |
|
11411 * @memberOf _ |
|
11412 * @since 0.1.0 |
|
11413 * @category Lang |
|
11414 * @param {*} value The value to check. |
|
11415 * @returns {boolean} Returns `true` if `value` is a date object, else `false`. |
|
11416 * @example |
|
11417 * |
|
11418 * _.isDate(new Date); |
|
11419 * // => true |
|
11420 * |
|
11421 * _.isDate('Mon April 23 2012'); |
|
11422 * // => false |
|
11423 */ |
|
11424 var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; |
|
11425 |
|
11426 /** |
|
11427 * Checks if `value` is likely a DOM element. |
|
11428 * |
|
11429 * @static |
|
11430 * @memberOf _ |
|
11431 * @since 0.1.0 |
|
11432 * @category Lang |
|
11433 * @param {*} value The value to check. |
|
11434 * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. |
|
11435 * @example |
|
11436 * |
|
11437 * _.isElement(document.body); |
|
11438 * // => true |
|
11439 * |
|
11440 * _.isElement('<body>'); |
|
11441 * // => false |
|
11442 */ |
|
11443 function isElement(value) { |
|
11444 return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); |
|
11445 } |
|
11446 |
|
11447 /** |
|
11448 * Checks if `value` is an empty object, collection, map, or set. |
|
11449 * |
|
11450 * Objects are considered empty if they have no own enumerable string keyed |
|
11451 * properties. |
|
11452 * |
|
11453 * Array-like values such as `arguments` objects, arrays, buffers, strings, or |
|
11454 * jQuery-like collections are considered empty if they have a `length` of `0`. |
|
11455 * Similarly, maps and sets are considered empty if they have a `size` of `0`. |
|
11456 * |
|
11457 * @static |
|
11458 * @memberOf _ |
|
11459 * @since 0.1.0 |
|
11460 * @category Lang |
|
11461 * @param {*} value The value to check. |
|
11462 * @returns {boolean} Returns `true` if `value` is empty, else `false`. |
|
11463 * @example |
|
11464 * |
|
11465 * _.isEmpty(null); |
|
11466 * // => true |
|
11467 * |
|
11468 * _.isEmpty(true); |
|
11469 * // => true |
|
11470 * |
|
11471 * _.isEmpty(1); |
|
11472 * // => true |
|
11473 * |
|
11474 * _.isEmpty([1, 2, 3]); |
|
11475 * // => false |
|
11476 * |
|
11477 * _.isEmpty({ 'a': 1 }); |
|
11478 * // => false |
|
11479 */ |
|
11480 function isEmpty(value) { |
|
11481 if (value == null) { |
|
11482 return true; |
|
11483 } |
|
11484 if (isArrayLike(value) && |
|
11485 (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || |
|
11486 isBuffer(value) || isTypedArray(value) || isArguments(value))) { |
|
11487 return !value.length; |
|
11488 } |
|
11489 var tag = getTag(value); |
|
11490 if (tag == mapTag || tag == setTag) { |
|
11491 return !value.size; |
|
11492 } |
|
11493 if (isPrototype(value)) { |
|
11494 return !baseKeys(value).length; |
|
11495 } |
|
11496 for (var key in value) { |
|
11497 if (hasOwnProperty.call(value, key)) { |
|
11498 return false; |
|
11499 } |
|
11500 } |
|
11501 return true; |
|
11502 } |
|
11503 |
|
11504 /** |
|
11505 * Performs a deep comparison between two values to determine if they are |
|
11506 * equivalent. |
|
11507 * |
|
11508 * **Note:** This method supports comparing arrays, array buffers, booleans, |
|
11509 * date objects, error objects, maps, numbers, `Object` objects, regexes, |
|
11510 * sets, strings, symbols, and typed arrays. `Object` objects are compared |
|
11511 * by their own, not inherited, enumerable properties. Functions and DOM |
|
11512 * nodes are compared by strict equality, i.e. `===`. |
|
11513 * |
|
11514 * @static |
|
11515 * @memberOf _ |
|
11516 * @since 0.1.0 |
|
11517 * @category Lang |
|
11518 * @param {*} value The value to compare. |
|
11519 * @param {*} other The other value to compare. |
|
11520 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
|
11521 * @example |
|
11522 * |
|
11523 * var object = { 'a': 1 }; |
|
11524 * var other = { 'a': 1 }; |
|
11525 * |
|
11526 * _.isEqual(object, other); |
|
11527 * // => true |
|
11528 * |
|
11529 * object === other; |
|
11530 * // => false |
|
11531 */ |
|
11532 function isEqual(value, other) { |
|
11533 return baseIsEqual(value, other); |
|
11534 } |
|
11535 |
|
11536 /** |
|
11537 * This method is like `_.isEqual` except that it accepts `customizer` which |
|
11538 * is invoked to compare values. If `customizer` returns `undefined`, comparisons |
|
11539 * are handled by the method instead. The `customizer` is invoked with up to |
|
11540 * six arguments: (objValue, othValue [, index|key, object, other, stack]). |
|
11541 * |
|
11542 * @static |
|
11543 * @memberOf _ |
|
11544 * @since 4.0.0 |
|
11545 * @category Lang |
|
11546 * @param {*} value The value to compare. |
|
11547 * @param {*} other The other value to compare. |
|
11548 * @param {Function} [customizer] The function to customize comparisons. |
|
11549 * @returns {boolean} Returns `true` if the values are equivalent, else `false`. |
|
11550 * @example |
|
11551 * |
|
11552 * function isGreeting(value) { |
|
11553 * return /^h(?:i|ello)$/.test(value); |
|
11554 * } |
|
11555 * |
|
11556 * function customizer(objValue, othValue) { |
|
11557 * if (isGreeting(objValue) && isGreeting(othValue)) { |
|
11558 * return true; |
|
11559 * } |
|
11560 * } |
|
11561 * |
|
11562 * var array = ['hello', 'goodbye']; |
|
11563 * var other = ['hi', 'goodbye']; |
|
11564 * |
|
11565 * _.isEqualWith(array, other, customizer); |
|
11566 * // => true |
|
11567 */ |
|
11568 function isEqualWith(value, other, customizer) { |
|
11569 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
11570 var result = customizer ? customizer(value, other) : undefined; |
|
11571 return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; |
|
11572 } |
|
11573 |
|
11574 /** |
|
11575 * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, |
|
11576 * `SyntaxError`, `TypeError`, or `URIError` object. |
|
11577 * |
|
11578 * @static |
|
11579 * @memberOf _ |
|
11580 * @since 3.0.0 |
|
11581 * @category Lang |
|
11582 * @param {*} value The value to check. |
|
11583 * @returns {boolean} Returns `true` if `value` is an error object, else `false`. |
|
11584 * @example |
|
11585 * |
|
11586 * _.isError(new Error); |
|
11587 * // => true |
|
11588 * |
|
11589 * _.isError(Error); |
|
11590 * // => false |
|
11591 */ |
|
11592 function isError(value) { |
|
11593 if (!isObjectLike(value)) { |
|
11594 return false; |
|
11595 } |
|
11596 var tag = baseGetTag(value); |
|
11597 return tag == errorTag || tag == domExcTag || |
|
11598 (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); |
|
11599 } |
|
11600 |
|
11601 /** |
|
11602 * Checks if `value` is a finite primitive number. |
|
11603 * |
|
11604 * **Note:** This method is based on |
|
11605 * [`Number.isFinite`](https://mdn.io/Number/isFinite). |
|
11606 * |
|
11607 * @static |
|
11608 * @memberOf _ |
|
11609 * @since 0.1.0 |
|
11610 * @category Lang |
|
11611 * @param {*} value The value to check. |
|
11612 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. |
|
11613 * @example |
|
11614 * |
|
11615 * _.isFinite(3); |
|
11616 * // => true |
|
11617 * |
|
11618 * _.isFinite(Number.MIN_VALUE); |
|
11619 * // => true |
|
11620 * |
|
11621 * _.isFinite(Infinity); |
|
11622 * // => false |
|
11623 * |
|
11624 * _.isFinite('3'); |
|
11625 * // => false |
|
11626 */ |
|
11627 function isFinite(value) { |
|
11628 return typeof value == 'number' && nativeIsFinite(value); |
|
11629 } |
|
11630 |
|
11631 /** |
|
11632 * Checks if `value` is classified as a `Function` object. |
|
11633 * |
|
11634 * @static |
|
11635 * @memberOf _ |
|
11636 * @since 0.1.0 |
|
11637 * @category Lang |
|
11638 * @param {*} value The value to check. |
|
11639 * @returns {boolean} Returns `true` if `value` is a function, else `false`. |
|
11640 * @example |
|
11641 * |
|
11642 * _.isFunction(_); |
|
11643 * // => true |
|
11644 * |
|
11645 * _.isFunction(/abc/); |
|
11646 * // => false |
|
11647 */ |
|
11648 function isFunction(value) { |
|
11649 if (!isObject(value)) { |
|
11650 return false; |
|
11651 } |
|
11652 // The use of `Object#toString` avoids issues with the `typeof` operator |
|
11653 // in Safari 9 which returns 'object' for typed arrays and other constructors. |
|
11654 var tag = baseGetTag(value); |
|
11655 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; |
|
11656 } |
|
11657 |
|
11658 /** |
|
11659 * Checks if `value` is an integer. |
|
11660 * |
|
11661 * **Note:** This method is based on |
|
11662 * [`Number.isInteger`](https://mdn.io/Number/isInteger). |
|
11663 * |
|
11664 * @static |
|
11665 * @memberOf _ |
|
11666 * @since 4.0.0 |
|
11667 * @category Lang |
|
11668 * @param {*} value The value to check. |
|
11669 * @returns {boolean} Returns `true` if `value` is an integer, else `false`. |
|
11670 * @example |
|
11671 * |
|
11672 * _.isInteger(3); |
|
11673 * // => true |
|
11674 * |
|
11675 * _.isInteger(Number.MIN_VALUE); |
|
11676 * // => false |
|
11677 * |
|
11678 * _.isInteger(Infinity); |
|
11679 * // => false |
|
11680 * |
|
11681 * _.isInteger('3'); |
|
11682 * // => false |
|
11683 */ |
|
11684 function isInteger(value) { |
|
11685 return typeof value == 'number' && value == toInteger(value); |
|
11686 } |
|
11687 |
|
11688 /** |
|
11689 * Checks if `value` is a valid array-like length. |
|
11690 * |
|
11691 * **Note:** This method is loosely based on |
|
11692 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). |
|
11693 * |
|
11694 * @static |
|
11695 * @memberOf _ |
|
11696 * @since 4.0.0 |
|
11697 * @category Lang |
|
11698 * @param {*} value The value to check. |
|
11699 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. |
|
11700 * @example |
|
11701 * |
|
11702 * _.isLength(3); |
|
11703 * // => true |
|
11704 * |
|
11705 * _.isLength(Number.MIN_VALUE); |
|
11706 * // => false |
|
11707 * |
|
11708 * _.isLength(Infinity); |
|
11709 * // => false |
|
11710 * |
|
11711 * _.isLength('3'); |
|
11712 * // => false |
|
11713 */ |
|
11714 function isLength(value) { |
|
11715 return typeof value == 'number' && |
|
11716 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; |
|
11717 } |
|
11718 |
|
11719 /** |
|
11720 * Checks if `value` is the |
|
11721 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) |
|
11722 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) |
|
11723 * |
|
11724 * @static |
|
11725 * @memberOf _ |
|
11726 * @since 0.1.0 |
|
11727 * @category Lang |
|
11728 * @param {*} value The value to check. |
|
11729 * @returns {boolean} Returns `true` if `value` is an object, else `false`. |
|
11730 * @example |
|
11731 * |
|
11732 * _.isObject({}); |
|
11733 * // => true |
|
11734 * |
|
11735 * _.isObject([1, 2, 3]); |
|
11736 * // => true |
|
11737 * |
|
11738 * _.isObject(_.noop); |
|
11739 * // => true |
|
11740 * |
|
11741 * _.isObject(null); |
|
11742 * // => false |
|
11743 */ |
|
11744 function isObject(value) { |
|
11745 var type = typeof value; |
|
11746 return value != null && (type == 'object' || type == 'function'); |
|
11747 } |
|
11748 |
|
11749 /** |
|
11750 * Checks if `value` is object-like. A value is object-like if it's not `null` |
|
11751 * and has a `typeof` result of "object". |
|
11752 * |
|
11753 * @static |
|
11754 * @memberOf _ |
|
11755 * @since 4.0.0 |
|
11756 * @category Lang |
|
11757 * @param {*} value The value to check. |
|
11758 * @returns {boolean} Returns `true` if `value` is object-like, else `false`. |
|
11759 * @example |
|
11760 * |
|
11761 * _.isObjectLike({}); |
|
11762 * // => true |
|
11763 * |
|
11764 * _.isObjectLike([1, 2, 3]); |
|
11765 * // => true |
|
11766 * |
|
11767 * _.isObjectLike(_.noop); |
|
11768 * // => false |
|
11769 * |
|
11770 * _.isObjectLike(null); |
|
11771 * // => false |
|
11772 */ |
|
11773 function isObjectLike(value) { |
|
11774 return value != null && typeof value == 'object'; |
|
11775 } |
|
11776 |
|
11777 /** |
|
11778 * Checks if `value` is classified as a `Map` object. |
|
11779 * |
|
11780 * @static |
|
11781 * @memberOf _ |
|
11782 * @since 4.3.0 |
|
11783 * @category Lang |
|
11784 * @param {*} value The value to check. |
|
11785 * @returns {boolean} Returns `true` if `value` is a map, else `false`. |
|
11786 * @example |
|
11787 * |
|
11788 * _.isMap(new Map); |
|
11789 * // => true |
|
11790 * |
|
11791 * _.isMap(new WeakMap); |
|
11792 * // => false |
|
11793 */ |
|
11794 var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; |
|
11795 |
|
11796 /** |
|
11797 * Performs a partial deep comparison between `object` and `source` to |
|
11798 * determine if `object` contains equivalent property values. |
|
11799 * |
|
11800 * **Note:** This method is equivalent to `_.matches` when `source` is |
|
11801 * partially applied. |
|
11802 * |
|
11803 * Partial comparisons will match empty array and empty object `source` |
|
11804 * values against any array or object value, respectively. See `_.isEqual` |
|
11805 * for a list of supported value comparisons. |
|
11806 * |
|
11807 * @static |
|
11808 * @memberOf _ |
|
11809 * @since 3.0.0 |
|
11810 * @category Lang |
|
11811 * @param {Object} object The object to inspect. |
|
11812 * @param {Object} source The object of property values to match. |
|
11813 * @returns {boolean} Returns `true` if `object` is a match, else `false`. |
|
11814 * @example |
|
11815 * |
|
11816 * var object = { 'a': 1, 'b': 2 }; |
|
11817 * |
|
11818 * _.isMatch(object, { 'b': 2 }); |
|
11819 * // => true |
|
11820 * |
|
11821 * _.isMatch(object, { 'b': 1 }); |
|
11822 * // => false |
|
11823 */ |
|
11824 function isMatch(object, source) { |
|
11825 return object === source || baseIsMatch(object, source, getMatchData(source)); |
|
11826 } |
|
11827 |
|
11828 /** |
|
11829 * This method is like `_.isMatch` except that it accepts `customizer` which |
|
11830 * is invoked to compare values. If `customizer` returns `undefined`, comparisons |
|
11831 * are handled by the method instead. The `customizer` is invoked with five |
|
11832 * arguments: (objValue, srcValue, index|key, object, source). |
|
11833 * |
|
11834 * @static |
|
11835 * @memberOf _ |
|
11836 * @since 4.0.0 |
|
11837 * @category Lang |
|
11838 * @param {Object} object The object to inspect. |
|
11839 * @param {Object} source The object of property values to match. |
|
11840 * @param {Function} [customizer] The function to customize comparisons. |
|
11841 * @returns {boolean} Returns `true` if `object` is a match, else `false`. |
|
11842 * @example |
|
11843 * |
|
11844 * function isGreeting(value) { |
|
11845 * return /^h(?:i|ello)$/.test(value); |
|
11846 * } |
|
11847 * |
|
11848 * function customizer(objValue, srcValue) { |
|
11849 * if (isGreeting(objValue) && isGreeting(srcValue)) { |
|
11850 * return true; |
|
11851 * } |
|
11852 * } |
|
11853 * |
|
11854 * var object = { 'greeting': 'hello' }; |
|
11855 * var source = { 'greeting': 'hi' }; |
|
11856 * |
|
11857 * _.isMatchWith(object, source, customizer); |
|
11858 * // => true |
|
11859 */ |
|
11860 function isMatchWith(object, source, customizer) { |
|
11861 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
11862 return baseIsMatch(object, source, getMatchData(source), customizer); |
|
11863 } |
|
11864 |
|
11865 /** |
|
11866 * Checks if `value` is `NaN`. |
|
11867 * |
|
11868 * **Note:** This method is based on |
|
11869 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as |
|
11870 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for |
|
11871 * `undefined` and other non-number values. |
|
11872 * |
|
11873 * @static |
|
11874 * @memberOf _ |
|
11875 * @since 0.1.0 |
|
11876 * @category Lang |
|
11877 * @param {*} value The value to check. |
|
11878 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. |
|
11879 * @example |
|
11880 * |
|
11881 * _.isNaN(NaN); |
|
11882 * // => true |
|
11883 * |
|
11884 * _.isNaN(new Number(NaN)); |
|
11885 * // => true |
|
11886 * |
|
11887 * isNaN(undefined); |
|
11888 * // => true |
|
11889 * |
|
11890 * _.isNaN(undefined); |
|
11891 * // => false |
|
11892 */ |
|
11893 function isNaN(value) { |
|
11894 // An `NaN` primitive is the only value that is not equal to itself. |
|
11895 // Perform the `toStringTag` check first to avoid errors with some |
|
11896 // ActiveX objects in IE. |
|
11897 return isNumber(value) && value != +value; |
|
11898 } |
|
11899 |
|
11900 /** |
|
11901 * Checks if `value` is a pristine native function. |
|
11902 * |
|
11903 * **Note:** This method can't reliably detect native functions in the presence |
|
11904 * of the core-js package because core-js circumvents this kind of detection. |
|
11905 * Despite multiple requests, the core-js maintainer has made it clear: any |
|
11906 * attempt to fix the detection will be obstructed. As a result, we're left |
|
11907 * with little choice but to throw an error. Unfortunately, this also affects |
|
11908 * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), |
|
11909 * which rely on core-js. |
|
11910 * |
|
11911 * @static |
|
11912 * @memberOf _ |
|
11913 * @since 3.0.0 |
|
11914 * @category Lang |
|
11915 * @param {*} value The value to check. |
|
11916 * @returns {boolean} Returns `true` if `value` is a native function, |
|
11917 * else `false`. |
|
11918 * @example |
|
11919 * |
|
11920 * _.isNative(Array.prototype.push); |
|
11921 * // => true |
|
11922 * |
|
11923 * _.isNative(_); |
|
11924 * // => false |
|
11925 */ |
|
11926 function isNative(value) { |
|
11927 if (isMaskable(value)) { |
|
11928 throw new Error(CORE_ERROR_TEXT); |
|
11929 } |
|
11930 return baseIsNative(value); |
|
11931 } |
|
11932 |
|
11933 /** |
|
11934 * Checks if `value` is `null`. |
|
11935 * |
|
11936 * @static |
|
11937 * @memberOf _ |
|
11938 * @since 0.1.0 |
|
11939 * @category Lang |
|
11940 * @param {*} value The value to check. |
|
11941 * @returns {boolean} Returns `true` if `value` is `null`, else `false`. |
|
11942 * @example |
|
11943 * |
|
11944 * _.isNull(null); |
|
11945 * // => true |
|
11946 * |
|
11947 * _.isNull(void 0); |
|
11948 * // => false |
|
11949 */ |
|
11950 function isNull(value) { |
|
11951 return value === null; |
|
11952 } |
|
11953 |
|
11954 /** |
|
11955 * Checks if `value` is `null` or `undefined`. |
|
11956 * |
|
11957 * @static |
|
11958 * @memberOf _ |
|
11959 * @since 4.0.0 |
|
11960 * @category Lang |
|
11961 * @param {*} value The value to check. |
|
11962 * @returns {boolean} Returns `true` if `value` is nullish, else `false`. |
|
11963 * @example |
|
11964 * |
|
11965 * _.isNil(null); |
|
11966 * // => true |
|
11967 * |
|
11968 * _.isNil(void 0); |
|
11969 * // => true |
|
11970 * |
|
11971 * _.isNil(NaN); |
|
11972 * // => false |
|
11973 */ |
|
11974 function isNil(value) { |
|
11975 return value == null; |
|
11976 } |
|
11977 |
|
11978 /** |
|
11979 * Checks if `value` is classified as a `Number` primitive or object. |
|
11980 * |
|
11981 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are |
|
11982 * classified as numbers, use the `_.isFinite` method. |
|
11983 * |
|
11984 * @static |
|
11985 * @memberOf _ |
|
11986 * @since 0.1.0 |
|
11987 * @category Lang |
|
11988 * @param {*} value The value to check. |
|
11989 * @returns {boolean} Returns `true` if `value` is a number, else `false`. |
|
11990 * @example |
|
11991 * |
|
11992 * _.isNumber(3); |
|
11993 * // => true |
|
11994 * |
|
11995 * _.isNumber(Number.MIN_VALUE); |
|
11996 * // => true |
|
11997 * |
|
11998 * _.isNumber(Infinity); |
|
11999 * // => true |
|
12000 * |
|
12001 * _.isNumber('3'); |
|
12002 * // => false |
|
12003 */ |
|
12004 function isNumber(value) { |
|
12005 return typeof value == 'number' || |
|
12006 (isObjectLike(value) && baseGetTag(value) == numberTag); |
|
12007 } |
|
12008 |
|
12009 /** |
|
12010 * Checks if `value` is a plain object, that is, an object created by the |
|
12011 * `Object` constructor or one with a `[[Prototype]]` of `null`. |
|
12012 * |
|
12013 * @static |
|
12014 * @memberOf _ |
|
12015 * @since 0.8.0 |
|
12016 * @category Lang |
|
12017 * @param {*} value The value to check. |
|
12018 * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. |
|
12019 * @example |
|
12020 * |
|
12021 * function Foo() { |
|
12022 * this.a = 1; |
|
12023 * } |
|
12024 * |
|
12025 * _.isPlainObject(new Foo); |
|
12026 * // => false |
|
12027 * |
|
12028 * _.isPlainObject([1, 2, 3]); |
|
12029 * // => false |
|
12030 * |
|
12031 * _.isPlainObject({ 'x': 0, 'y': 0 }); |
|
12032 * // => true |
|
12033 * |
|
12034 * _.isPlainObject(Object.create(null)); |
|
12035 * // => true |
|
12036 */ |
|
12037 function isPlainObject(value) { |
|
12038 if (!isObjectLike(value) || baseGetTag(value) != objectTag) { |
|
12039 return false; |
|
12040 } |
|
12041 var proto = getPrototype(value); |
|
12042 if (proto === null) { |
|
12043 return true; |
|
12044 } |
|
12045 var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; |
|
12046 return typeof Ctor == 'function' && Ctor instanceof Ctor && |
|
12047 funcToString.call(Ctor) == objectCtorString; |
|
12048 } |
|
12049 |
|
12050 /** |
|
12051 * Checks if `value` is classified as a `RegExp` object. |
|
12052 * |
|
12053 * @static |
|
12054 * @memberOf _ |
|
12055 * @since 0.1.0 |
|
12056 * @category Lang |
|
12057 * @param {*} value The value to check. |
|
12058 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. |
|
12059 * @example |
|
12060 * |
|
12061 * _.isRegExp(/abc/); |
|
12062 * // => true |
|
12063 * |
|
12064 * _.isRegExp('/abc/'); |
|
12065 * // => false |
|
12066 */ |
|
12067 var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; |
|
12068 |
|
12069 /** |
|
12070 * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 |
|
12071 * double precision number which isn't the result of a rounded unsafe integer. |
|
12072 * |
|
12073 * **Note:** This method is based on |
|
12074 * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). |
|
12075 * |
|
12076 * @static |
|
12077 * @memberOf _ |
|
12078 * @since 4.0.0 |
|
12079 * @category Lang |
|
12080 * @param {*} value The value to check. |
|
12081 * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. |
|
12082 * @example |
|
12083 * |
|
12084 * _.isSafeInteger(3); |
|
12085 * // => true |
|
12086 * |
|
12087 * _.isSafeInteger(Number.MIN_VALUE); |
|
12088 * // => false |
|
12089 * |
|
12090 * _.isSafeInteger(Infinity); |
|
12091 * // => false |
|
12092 * |
|
12093 * _.isSafeInteger('3'); |
|
12094 * // => false |
|
12095 */ |
|
12096 function isSafeInteger(value) { |
|
12097 return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; |
|
12098 } |
|
12099 |
|
12100 /** |
|
12101 * Checks if `value` is classified as a `Set` object. |
|
12102 * |
|
12103 * @static |
|
12104 * @memberOf _ |
|
12105 * @since 4.3.0 |
|
12106 * @category Lang |
|
12107 * @param {*} value The value to check. |
|
12108 * @returns {boolean} Returns `true` if `value` is a set, else `false`. |
|
12109 * @example |
|
12110 * |
|
12111 * _.isSet(new Set); |
|
12112 * // => true |
|
12113 * |
|
12114 * _.isSet(new WeakSet); |
|
12115 * // => false |
|
12116 */ |
|
12117 var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; |
|
12118 |
|
12119 /** |
|
12120 * Checks if `value` is classified as a `String` primitive or object. |
|
12121 * |
|
12122 * @static |
|
12123 * @since 0.1.0 |
|
12124 * @memberOf _ |
|
12125 * @category Lang |
|
12126 * @param {*} value The value to check. |
|
12127 * @returns {boolean} Returns `true` if `value` is a string, else `false`. |
|
12128 * @example |
|
12129 * |
|
12130 * _.isString('abc'); |
|
12131 * // => true |
|
12132 * |
|
12133 * _.isString(1); |
|
12134 * // => false |
|
12135 */ |
|
12136 function isString(value) { |
|
12137 return typeof value == 'string' || |
|
12138 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); |
|
12139 } |
|
12140 |
|
12141 /** |
|
12142 * Checks if `value` is classified as a `Symbol` primitive or object. |
|
12143 * |
|
12144 * @static |
|
12145 * @memberOf _ |
|
12146 * @since 4.0.0 |
|
12147 * @category Lang |
|
12148 * @param {*} value The value to check. |
|
12149 * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. |
|
12150 * @example |
|
12151 * |
|
12152 * _.isSymbol(Symbol.iterator); |
|
12153 * // => true |
|
12154 * |
|
12155 * _.isSymbol('abc'); |
|
12156 * // => false |
|
12157 */ |
|
12158 function isSymbol(value) { |
|
12159 return typeof value == 'symbol' || |
|
12160 (isObjectLike(value) && baseGetTag(value) == symbolTag); |
|
12161 } |
|
12162 |
|
12163 /** |
|
12164 * Checks if `value` is classified as a typed array. |
|
12165 * |
|
12166 * @static |
|
12167 * @memberOf _ |
|
12168 * @since 3.0.0 |
|
12169 * @category Lang |
|
12170 * @param {*} value The value to check. |
|
12171 * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. |
|
12172 * @example |
|
12173 * |
|
12174 * _.isTypedArray(new Uint8Array); |
|
12175 * // => true |
|
12176 * |
|
12177 * _.isTypedArray([]); |
|
12178 * // => false |
|
12179 */ |
|
12180 var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; |
|
12181 |
|
12182 /** |
|
12183 * Checks if `value` is `undefined`. |
|
12184 * |
|
12185 * @static |
|
12186 * @since 0.1.0 |
|
12187 * @memberOf _ |
|
12188 * @category Lang |
|
12189 * @param {*} value The value to check. |
|
12190 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. |
|
12191 * @example |
|
12192 * |
|
12193 * _.isUndefined(void 0); |
|
12194 * // => true |
|
12195 * |
|
12196 * _.isUndefined(null); |
|
12197 * // => false |
|
12198 */ |
|
12199 function isUndefined(value) { |
|
12200 return value === undefined; |
|
12201 } |
|
12202 |
|
12203 /** |
|
12204 * Checks if `value` is classified as a `WeakMap` object. |
|
12205 * |
|
12206 * @static |
|
12207 * @memberOf _ |
|
12208 * @since 4.3.0 |
|
12209 * @category Lang |
|
12210 * @param {*} value The value to check. |
|
12211 * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. |
|
12212 * @example |
|
12213 * |
|
12214 * _.isWeakMap(new WeakMap); |
|
12215 * // => true |
|
12216 * |
|
12217 * _.isWeakMap(new Map); |
|
12218 * // => false |
|
12219 */ |
|
12220 function isWeakMap(value) { |
|
12221 return isObjectLike(value) && getTag(value) == weakMapTag; |
|
12222 } |
|
12223 |
|
12224 /** |
|
12225 * Checks if `value` is classified as a `WeakSet` object. |
|
12226 * |
|
12227 * @static |
|
12228 * @memberOf _ |
|
12229 * @since 4.3.0 |
|
12230 * @category Lang |
|
12231 * @param {*} value The value to check. |
|
12232 * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. |
|
12233 * @example |
|
12234 * |
|
12235 * _.isWeakSet(new WeakSet); |
|
12236 * // => true |
|
12237 * |
|
12238 * _.isWeakSet(new Set); |
|
12239 * // => false |
|
12240 */ |
|
12241 function isWeakSet(value) { |
|
12242 return isObjectLike(value) && baseGetTag(value) == weakSetTag; |
|
12243 } |
|
12244 |
|
12245 /** |
|
12246 * Checks if `value` is less than `other`. |
|
12247 * |
|
12248 * @static |
|
12249 * @memberOf _ |
|
12250 * @since 3.9.0 |
|
12251 * @category Lang |
|
12252 * @param {*} value The value to compare. |
|
12253 * @param {*} other The other value to compare. |
|
12254 * @returns {boolean} Returns `true` if `value` is less than `other`, |
|
12255 * else `false`. |
|
12256 * @see _.gt |
|
12257 * @example |
|
12258 * |
|
12259 * _.lt(1, 3); |
|
12260 * // => true |
|
12261 * |
|
12262 * _.lt(3, 3); |
|
12263 * // => false |
|
12264 * |
|
12265 * _.lt(3, 1); |
|
12266 * // => false |
|
12267 */ |
|
12268 var lt = createRelationalOperation(baseLt); |
|
12269 |
|
12270 /** |
|
12271 * Checks if `value` is less than or equal to `other`. |
|
12272 * |
|
12273 * @static |
|
12274 * @memberOf _ |
|
12275 * @since 3.9.0 |
|
12276 * @category Lang |
|
12277 * @param {*} value The value to compare. |
|
12278 * @param {*} other The other value to compare. |
|
12279 * @returns {boolean} Returns `true` if `value` is less than or equal to |
|
12280 * `other`, else `false`. |
|
12281 * @see _.gte |
|
12282 * @example |
|
12283 * |
|
12284 * _.lte(1, 3); |
|
12285 * // => true |
|
12286 * |
|
12287 * _.lte(3, 3); |
|
12288 * // => true |
|
12289 * |
|
12290 * _.lte(3, 1); |
|
12291 * // => false |
|
12292 */ |
|
12293 var lte = createRelationalOperation(function(value, other) { |
|
12294 return value <= other; |
|
12295 }); |
|
12296 |
|
12297 /** |
|
12298 * Converts `value` to an array. |
|
12299 * |
|
12300 * @static |
|
12301 * @since 0.1.0 |
|
12302 * @memberOf _ |
|
12303 * @category Lang |
|
12304 * @param {*} value The value to convert. |
|
12305 * @returns {Array} Returns the converted array. |
|
12306 * @example |
|
12307 * |
|
12308 * _.toArray({ 'a': 1, 'b': 2 }); |
|
12309 * // => [1, 2] |
|
12310 * |
|
12311 * _.toArray('abc'); |
|
12312 * // => ['a', 'b', 'c'] |
|
12313 * |
|
12314 * _.toArray(1); |
|
12315 * // => [] |
|
12316 * |
|
12317 * _.toArray(null); |
|
12318 * // => [] |
|
12319 */ |
|
12320 function toArray(value) { |
|
12321 if (!value) { |
|
12322 return []; |
|
12323 } |
|
12324 if (isArrayLike(value)) { |
|
12325 return isString(value) ? stringToArray(value) : copyArray(value); |
|
12326 } |
|
12327 if (symIterator && value[symIterator]) { |
|
12328 return iteratorToArray(value[symIterator]()); |
|
12329 } |
|
12330 var tag = getTag(value), |
|
12331 func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); |
|
12332 |
|
12333 return func(value); |
|
12334 } |
|
12335 |
|
12336 /** |
|
12337 * Converts `value` to a finite number. |
|
12338 * |
|
12339 * @static |
|
12340 * @memberOf _ |
|
12341 * @since 4.12.0 |
|
12342 * @category Lang |
|
12343 * @param {*} value The value to convert. |
|
12344 * @returns {number} Returns the converted number. |
|
12345 * @example |
|
12346 * |
|
12347 * _.toFinite(3.2); |
|
12348 * // => 3.2 |
|
12349 * |
|
12350 * _.toFinite(Number.MIN_VALUE); |
|
12351 * // => 5e-324 |
|
12352 * |
|
12353 * _.toFinite(Infinity); |
|
12354 * // => 1.7976931348623157e+308 |
|
12355 * |
|
12356 * _.toFinite('3.2'); |
|
12357 * // => 3.2 |
|
12358 */ |
|
12359 function toFinite(value) { |
|
12360 if (!value) { |
|
12361 return value === 0 ? value : 0; |
|
12362 } |
|
12363 value = toNumber(value); |
|
12364 if (value === INFINITY || value === -INFINITY) { |
|
12365 var sign = (value < 0 ? -1 : 1); |
|
12366 return sign * MAX_INTEGER; |
|
12367 } |
|
12368 return value === value ? value : 0; |
|
12369 } |
|
12370 |
|
12371 /** |
|
12372 * Converts `value` to an integer. |
|
12373 * |
|
12374 * **Note:** This method is loosely based on |
|
12375 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). |
|
12376 * |
|
12377 * @static |
|
12378 * @memberOf _ |
|
12379 * @since 4.0.0 |
|
12380 * @category Lang |
|
12381 * @param {*} value The value to convert. |
|
12382 * @returns {number} Returns the converted integer. |
|
12383 * @example |
|
12384 * |
|
12385 * _.toInteger(3.2); |
|
12386 * // => 3 |
|
12387 * |
|
12388 * _.toInteger(Number.MIN_VALUE); |
|
12389 * // => 0 |
|
12390 * |
|
12391 * _.toInteger(Infinity); |
|
12392 * // => 1.7976931348623157e+308 |
|
12393 * |
|
12394 * _.toInteger('3.2'); |
|
12395 * // => 3 |
|
12396 */ |
|
12397 function toInteger(value) { |
|
12398 var result = toFinite(value), |
|
12399 remainder = result % 1; |
|
12400 |
|
12401 return result === result ? (remainder ? result - remainder : result) : 0; |
|
12402 } |
|
12403 |
|
12404 /** |
|
12405 * Converts `value` to an integer suitable for use as the length of an |
|
12406 * array-like object. |
|
12407 * |
|
12408 * **Note:** This method is based on |
|
12409 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). |
|
12410 * |
|
12411 * @static |
|
12412 * @memberOf _ |
|
12413 * @since 4.0.0 |
|
12414 * @category Lang |
|
12415 * @param {*} value The value to convert. |
|
12416 * @returns {number} Returns the converted integer. |
|
12417 * @example |
|
12418 * |
|
12419 * _.toLength(3.2); |
|
12420 * // => 3 |
|
12421 * |
|
12422 * _.toLength(Number.MIN_VALUE); |
|
12423 * // => 0 |
|
12424 * |
|
12425 * _.toLength(Infinity); |
|
12426 * // => 4294967295 |
|
12427 * |
|
12428 * _.toLength('3.2'); |
|
12429 * // => 3 |
|
12430 */ |
|
12431 function toLength(value) { |
|
12432 return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; |
|
12433 } |
|
12434 |
|
12435 /** |
|
12436 * Converts `value` to a number. |
|
12437 * |
|
12438 * @static |
|
12439 * @memberOf _ |
|
12440 * @since 4.0.0 |
|
12441 * @category Lang |
|
12442 * @param {*} value The value to process. |
|
12443 * @returns {number} Returns the number. |
|
12444 * @example |
|
12445 * |
|
12446 * _.toNumber(3.2); |
|
12447 * // => 3.2 |
|
12448 * |
|
12449 * _.toNumber(Number.MIN_VALUE); |
|
12450 * // => 5e-324 |
|
12451 * |
|
12452 * _.toNumber(Infinity); |
|
12453 * // => Infinity |
|
12454 * |
|
12455 * _.toNumber('3.2'); |
|
12456 * // => 3.2 |
|
12457 */ |
|
12458 function toNumber(value) { |
|
12459 if (typeof value == 'number') { |
|
12460 return value; |
|
12461 } |
|
12462 if (isSymbol(value)) { |
|
12463 return NAN; |
|
12464 } |
|
12465 if (isObject(value)) { |
|
12466 var other = typeof value.valueOf == 'function' ? value.valueOf() : value; |
|
12467 value = isObject(other) ? (other + '') : other; |
|
12468 } |
|
12469 if (typeof value != 'string') { |
|
12470 return value === 0 ? value : +value; |
|
12471 } |
|
12472 value = value.replace(reTrim, ''); |
|
12473 var isBinary = reIsBinary.test(value); |
|
12474 return (isBinary || reIsOctal.test(value)) |
|
12475 ? freeParseInt(value.slice(2), isBinary ? 2 : 8) |
|
12476 : (reIsBadHex.test(value) ? NAN : +value); |
|
12477 } |
|
12478 |
|
12479 /** |
|
12480 * Converts `value` to a plain object flattening inherited enumerable string |
|
12481 * keyed properties of `value` to own properties of the plain object. |
|
12482 * |
|
12483 * @static |
|
12484 * @memberOf _ |
|
12485 * @since 3.0.0 |
|
12486 * @category Lang |
|
12487 * @param {*} value The value to convert. |
|
12488 * @returns {Object} Returns the converted plain object. |
|
12489 * @example |
|
12490 * |
|
12491 * function Foo() { |
|
12492 * this.b = 2; |
|
12493 * } |
|
12494 * |
|
12495 * Foo.prototype.c = 3; |
|
12496 * |
|
12497 * _.assign({ 'a': 1 }, new Foo); |
|
12498 * // => { 'a': 1, 'b': 2 } |
|
12499 * |
|
12500 * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); |
|
12501 * // => { 'a': 1, 'b': 2, 'c': 3 } |
|
12502 */ |
|
12503 function toPlainObject(value) { |
|
12504 return copyObject(value, keysIn(value)); |
|
12505 } |
|
12506 |
|
12507 /** |
|
12508 * Converts `value` to a safe integer. A safe integer can be compared and |
|
12509 * represented correctly. |
|
12510 * |
|
12511 * @static |
|
12512 * @memberOf _ |
|
12513 * @since 4.0.0 |
|
12514 * @category Lang |
|
12515 * @param {*} value The value to convert. |
|
12516 * @returns {number} Returns the converted integer. |
|
12517 * @example |
|
12518 * |
|
12519 * _.toSafeInteger(3.2); |
|
12520 * // => 3 |
|
12521 * |
|
12522 * _.toSafeInteger(Number.MIN_VALUE); |
|
12523 * // => 0 |
|
12524 * |
|
12525 * _.toSafeInteger(Infinity); |
|
12526 * // => 9007199254740991 |
|
12527 * |
|
12528 * _.toSafeInteger('3.2'); |
|
12529 * // => 3 |
|
12530 */ |
|
12531 function toSafeInteger(value) { |
|
12532 return value |
|
12533 ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) |
|
12534 : (value === 0 ? value : 0); |
|
12535 } |
|
12536 |
|
12537 /** |
|
12538 * Converts `value` to a string. An empty string is returned for `null` |
|
12539 * and `undefined` values. The sign of `-0` is preserved. |
|
12540 * |
|
12541 * @static |
|
12542 * @memberOf _ |
|
12543 * @since 4.0.0 |
|
12544 * @category Lang |
|
12545 * @param {*} value The value to convert. |
|
12546 * @returns {string} Returns the converted string. |
|
12547 * @example |
|
12548 * |
|
12549 * _.toString(null); |
|
12550 * // => '' |
|
12551 * |
|
12552 * _.toString(-0); |
|
12553 * // => '-0' |
|
12554 * |
|
12555 * _.toString([1, 2, 3]); |
|
12556 * // => '1,2,3' |
|
12557 */ |
|
12558 function toString(value) { |
|
12559 return value == null ? '' : baseToString(value); |
|
12560 } |
|
12561 |
|
12562 /*------------------------------------------------------------------------*/ |
|
12563 |
|
12564 /** |
|
12565 * Assigns own enumerable string keyed properties of source objects to the |
|
12566 * destination object. Source objects are applied from left to right. |
|
12567 * Subsequent sources overwrite property assignments of previous sources. |
|
12568 * |
|
12569 * **Note:** This method mutates `object` and is loosely based on |
|
12570 * [`Object.assign`](https://mdn.io/Object/assign). |
|
12571 * |
|
12572 * @static |
|
12573 * @memberOf _ |
|
12574 * @since 0.10.0 |
|
12575 * @category Object |
|
12576 * @param {Object} object The destination object. |
|
12577 * @param {...Object} [sources] The source objects. |
|
12578 * @returns {Object} Returns `object`. |
|
12579 * @see _.assignIn |
|
12580 * @example |
|
12581 * |
|
12582 * function Foo() { |
|
12583 * this.a = 1; |
|
12584 * } |
|
12585 * |
|
12586 * function Bar() { |
|
12587 * this.c = 3; |
|
12588 * } |
|
12589 * |
|
12590 * Foo.prototype.b = 2; |
|
12591 * Bar.prototype.d = 4; |
|
12592 * |
|
12593 * _.assign({ 'a': 0 }, new Foo, new Bar); |
|
12594 * // => { 'a': 1, 'c': 3 } |
|
12595 */ |
|
12596 var assign = createAssigner(function(object, source) { |
|
12597 if (isPrototype(source) || isArrayLike(source)) { |
|
12598 copyObject(source, keys(source), object); |
|
12599 return; |
|
12600 } |
|
12601 for (var key in source) { |
|
12602 if (hasOwnProperty.call(source, key)) { |
|
12603 assignValue(object, key, source[key]); |
|
12604 } |
|
12605 } |
|
12606 }); |
|
12607 |
|
12608 /** |
|
12609 * This method is like `_.assign` except that it iterates over own and |
|
12610 * inherited source properties. |
|
12611 * |
|
12612 * **Note:** This method mutates `object`. |
|
12613 * |
|
12614 * @static |
|
12615 * @memberOf _ |
|
12616 * @since 4.0.0 |
|
12617 * @alias extend |
|
12618 * @category Object |
|
12619 * @param {Object} object The destination object. |
|
12620 * @param {...Object} [sources] The source objects. |
|
12621 * @returns {Object} Returns `object`. |
|
12622 * @see _.assign |
|
12623 * @example |
|
12624 * |
|
12625 * function Foo() { |
|
12626 * this.a = 1; |
|
12627 * } |
|
12628 * |
|
12629 * function Bar() { |
|
12630 * this.c = 3; |
|
12631 * } |
|
12632 * |
|
12633 * Foo.prototype.b = 2; |
|
12634 * Bar.prototype.d = 4; |
|
12635 * |
|
12636 * _.assignIn({ 'a': 0 }, new Foo, new Bar); |
|
12637 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } |
|
12638 */ |
|
12639 var assignIn = createAssigner(function(object, source) { |
|
12640 copyObject(source, keysIn(source), object); |
|
12641 }); |
|
12642 |
|
12643 /** |
|
12644 * This method is like `_.assignIn` except that it accepts `customizer` |
|
12645 * which is invoked to produce the assigned values. If `customizer` returns |
|
12646 * `undefined`, assignment is handled by the method instead. The `customizer` |
|
12647 * is invoked with five arguments: (objValue, srcValue, key, object, source). |
|
12648 * |
|
12649 * **Note:** This method mutates `object`. |
|
12650 * |
|
12651 * @static |
|
12652 * @memberOf _ |
|
12653 * @since 4.0.0 |
|
12654 * @alias extendWith |
|
12655 * @category Object |
|
12656 * @param {Object} object The destination object. |
|
12657 * @param {...Object} sources The source objects. |
|
12658 * @param {Function} [customizer] The function to customize assigned values. |
|
12659 * @returns {Object} Returns `object`. |
|
12660 * @see _.assignWith |
|
12661 * @example |
|
12662 * |
|
12663 * function customizer(objValue, srcValue) { |
|
12664 * return _.isUndefined(objValue) ? srcValue : objValue; |
|
12665 * } |
|
12666 * |
|
12667 * var defaults = _.partialRight(_.assignInWith, customizer); |
|
12668 * |
|
12669 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); |
|
12670 * // => { 'a': 1, 'b': 2 } |
|
12671 */ |
|
12672 var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { |
|
12673 copyObject(source, keysIn(source), object, customizer); |
|
12674 }); |
|
12675 |
|
12676 /** |
|
12677 * This method is like `_.assign` except that it accepts `customizer` |
|
12678 * which is invoked to produce the assigned values. If `customizer` returns |
|
12679 * `undefined`, assignment is handled by the method instead. The `customizer` |
|
12680 * is invoked with five arguments: (objValue, srcValue, key, object, source). |
|
12681 * |
|
12682 * **Note:** This method mutates `object`. |
|
12683 * |
|
12684 * @static |
|
12685 * @memberOf _ |
|
12686 * @since 4.0.0 |
|
12687 * @category Object |
|
12688 * @param {Object} object The destination object. |
|
12689 * @param {...Object} sources The source objects. |
|
12690 * @param {Function} [customizer] The function to customize assigned values. |
|
12691 * @returns {Object} Returns `object`. |
|
12692 * @see _.assignInWith |
|
12693 * @example |
|
12694 * |
|
12695 * function customizer(objValue, srcValue) { |
|
12696 * return _.isUndefined(objValue) ? srcValue : objValue; |
|
12697 * } |
|
12698 * |
|
12699 * var defaults = _.partialRight(_.assignWith, customizer); |
|
12700 * |
|
12701 * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); |
|
12702 * // => { 'a': 1, 'b': 2 } |
|
12703 */ |
|
12704 var assignWith = createAssigner(function(object, source, srcIndex, customizer) { |
|
12705 copyObject(source, keys(source), object, customizer); |
|
12706 }); |
|
12707 |
|
12708 /** |
|
12709 * Creates an array of values corresponding to `paths` of `object`. |
|
12710 * |
|
12711 * @static |
|
12712 * @memberOf _ |
|
12713 * @since 1.0.0 |
|
12714 * @category Object |
|
12715 * @param {Object} object The object to iterate over. |
|
12716 * @param {...(string|string[])} [paths] The property paths to pick. |
|
12717 * @returns {Array} Returns the picked values. |
|
12718 * @example |
|
12719 * |
|
12720 * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; |
|
12721 * |
|
12722 * _.at(object, ['a[0].b.c', 'a[1]']); |
|
12723 * // => [3, 4] |
|
12724 */ |
|
12725 var at = flatRest(baseAt); |
|
12726 |
|
12727 /** |
|
12728 * Creates an object that inherits from the `prototype` object. If a |
|
12729 * `properties` object is given, its own enumerable string keyed properties |
|
12730 * are assigned to the created object. |
|
12731 * |
|
12732 * @static |
|
12733 * @memberOf _ |
|
12734 * @since 2.3.0 |
|
12735 * @category Object |
|
12736 * @param {Object} prototype The object to inherit from. |
|
12737 * @param {Object} [properties] The properties to assign to the object. |
|
12738 * @returns {Object} Returns the new object. |
|
12739 * @example |
|
12740 * |
|
12741 * function Shape() { |
|
12742 * this.x = 0; |
|
12743 * this.y = 0; |
|
12744 * } |
|
12745 * |
|
12746 * function Circle() { |
|
12747 * Shape.call(this); |
|
12748 * } |
|
12749 * |
|
12750 * Circle.prototype = _.create(Shape.prototype, { |
|
12751 * 'constructor': Circle |
|
12752 * }); |
|
12753 * |
|
12754 * var circle = new Circle; |
|
12755 * circle instanceof Circle; |
|
12756 * // => true |
|
12757 * |
|
12758 * circle instanceof Shape; |
|
12759 * // => true |
|
12760 */ |
|
12761 function create(prototype, properties) { |
|
12762 var result = baseCreate(prototype); |
|
12763 return properties == null ? result : baseAssign(result, properties); |
|
12764 } |
|
12765 |
|
12766 /** |
|
12767 * Assigns own and inherited enumerable string keyed properties of source |
|
12768 * objects to the destination object for all destination properties that |
|
12769 * resolve to `undefined`. Source objects are applied from left to right. |
|
12770 * Once a property is set, additional values of the same property are ignored. |
|
12771 * |
|
12772 * **Note:** This method mutates `object`. |
|
12773 * |
|
12774 * @static |
|
12775 * @since 0.1.0 |
|
12776 * @memberOf _ |
|
12777 * @category Object |
|
12778 * @param {Object} object The destination object. |
|
12779 * @param {...Object} [sources] The source objects. |
|
12780 * @returns {Object} Returns `object`. |
|
12781 * @see _.defaultsDeep |
|
12782 * @example |
|
12783 * |
|
12784 * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); |
|
12785 * // => { 'a': 1, 'b': 2 } |
|
12786 */ |
|
12787 var defaults = baseRest(function(object, sources) { |
|
12788 object = Object(object); |
|
12789 |
|
12790 var index = -1; |
|
12791 var length = sources.length; |
|
12792 var guard = length > 2 ? sources[2] : undefined; |
|
12793 |
|
12794 if (guard && isIterateeCall(sources[0], sources[1], guard)) { |
|
12795 length = 1; |
|
12796 } |
|
12797 |
|
12798 while (++index < length) { |
|
12799 var source = sources[index]; |
|
12800 var props = keysIn(source); |
|
12801 var propsIndex = -1; |
|
12802 var propsLength = props.length; |
|
12803 |
|
12804 while (++propsIndex < propsLength) { |
|
12805 var key = props[propsIndex]; |
|
12806 var value = object[key]; |
|
12807 |
|
12808 if (value === undefined || |
|
12809 (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { |
|
12810 object[key] = source[key]; |
|
12811 } |
|
12812 } |
|
12813 } |
|
12814 |
|
12815 return object; |
|
12816 }); |
|
12817 |
|
12818 /** |
|
12819 * This method is like `_.defaults` except that it recursively assigns |
|
12820 * default properties. |
|
12821 * |
|
12822 * **Note:** This method mutates `object`. |
|
12823 * |
|
12824 * @static |
|
12825 * @memberOf _ |
|
12826 * @since 3.10.0 |
|
12827 * @category Object |
|
12828 * @param {Object} object The destination object. |
|
12829 * @param {...Object} [sources] The source objects. |
|
12830 * @returns {Object} Returns `object`. |
|
12831 * @see _.defaults |
|
12832 * @example |
|
12833 * |
|
12834 * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); |
|
12835 * // => { 'a': { 'b': 2, 'c': 3 } } |
|
12836 */ |
|
12837 var defaultsDeep = baseRest(function(args) { |
|
12838 args.push(undefined, customDefaultsMerge); |
|
12839 return apply(mergeWith, undefined, args); |
|
12840 }); |
|
12841 |
|
12842 /** |
|
12843 * This method is like `_.find` except that it returns the key of the first |
|
12844 * element `predicate` returns truthy for instead of the element itself. |
|
12845 * |
|
12846 * @static |
|
12847 * @memberOf _ |
|
12848 * @since 1.1.0 |
|
12849 * @category Object |
|
12850 * @param {Object} object The object to inspect. |
|
12851 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
12852 * @returns {string|undefined} Returns the key of the matched element, |
|
12853 * else `undefined`. |
|
12854 * @example |
|
12855 * |
|
12856 * var users = { |
|
12857 * 'barney': { 'age': 36, 'active': true }, |
|
12858 * 'fred': { 'age': 40, 'active': false }, |
|
12859 * 'pebbles': { 'age': 1, 'active': true } |
|
12860 * }; |
|
12861 * |
|
12862 * _.findKey(users, function(o) { return o.age < 40; }); |
|
12863 * // => 'barney' (iteration order is not guaranteed) |
|
12864 * |
|
12865 * // The `_.matches` iteratee shorthand. |
|
12866 * _.findKey(users, { 'age': 1, 'active': true }); |
|
12867 * // => 'pebbles' |
|
12868 * |
|
12869 * // The `_.matchesProperty` iteratee shorthand. |
|
12870 * _.findKey(users, ['active', false]); |
|
12871 * // => 'fred' |
|
12872 * |
|
12873 * // The `_.property` iteratee shorthand. |
|
12874 * _.findKey(users, 'active'); |
|
12875 * // => 'barney' |
|
12876 */ |
|
12877 function findKey(object, predicate) { |
|
12878 return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); |
|
12879 } |
|
12880 |
|
12881 /** |
|
12882 * This method is like `_.findKey` except that it iterates over elements of |
|
12883 * a collection in the opposite order. |
|
12884 * |
|
12885 * @static |
|
12886 * @memberOf _ |
|
12887 * @since 2.0.0 |
|
12888 * @category Object |
|
12889 * @param {Object} object The object to inspect. |
|
12890 * @param {Function} [predicate=_.identity] The function invoked per iteration. |
|
12891 * @returns {string|undefined} Returns the key of the matched element, |
|
12892 * else `undefined`. |
|
12893 * @example |
|
12894 * |
|
12895 * var users = { |
|
12896 * 'barney': { 'age': 36, 'active': true }, |
|
12897 * 'fred': { 'age': 40, 'active': false }, |
|
12898 * 'pebbles': { 'age': 1, 'active': true } |
|
12899 * }; |
|
12900 * |
|
12901 * _.findLastKey(users, function(o) { return o.age < 40; }); |
|
12902 * // => returns 'pebbles' assuming `_.findKey` returns 'barney' |
|
12903 * |
|
12904 * // The `_.matches` iteratee shorthand. |
|
12905 * _.findLastKey(users, { 'age': 36, 'active': true }); |
|
12906 * // => 'barney' |
|
12907 * |
|
12908 * // The `_.matchesProperty` iteratee shorthand. |
|
12909 * _.findLastKey(users, ['active', false]); |
|
12910 * // => 'fred' |
|
12911 * |
|
12912 * // The `_.property` iteratee shorthand. |
|
12913 * _.findLastKey(users, 'active'); |
|
12914 * // => 'pebbles' |
|
12915 */ |
|
12916 function findLastKey(object, predicate) { |
|
12917 return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); |
|
12918 } |
|
12919 |
|
12920 /** |
|
12921 * Iterates over own and inherited enumerable string keyed properties of an |
|
12922 * object and invokes `iteratee` for each property. The iteratee is invoked |
|
12923 * with three arguments: (value, key, object). Iteratee functions may exit |
|
12924 * iteration early by explicitly returning `false`. |
|
12925 * |
|
12926 * @static |
|
12927 * @memberOf _ |
|
12928 * @since 0.3.0 |
|
12929 * @category Object |
|
12930 * @param {Object} object The object to iterate over. |
|
12931 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
12932 * @returns {Object} Returns `object`. |
|
12933 * @see _.forInRight |
|
12934 * @example |
|
12935 * |
|
12936 * function Foo() { |
|
12937 * this.a = 1; |
|
12938 * this.b = 2; |
|
12939 * } |
|
12940 * |
|
12941 * Foo.prototype.c = 3; |
|
12942 * |
|
12943 * _.forIn(new Foo, function(value, key) { |
|
12944 * console.log(key); |
|
12945 * }); |
|
12946 * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). |
|
12947 */ |
|
12948 function forIn(object, iteratee) { |
|
12949 return object == null |
|
12950 ? object |
|
12951 : baseFor(object, getIteratee(iteratee, 3), keysIn); |
|
12952 } |
|
12953 |
|
12954 /** |
|
12955 * This method is like `_.forIn` except that it iterates over properties of |
|
12956 * `object` in the opposite order. |
|
12957 * |
|
12958 * @static |
|
12959 * @memberOf _ |
|
12960 * @since 2.0.0 |
|
12961 * @category Object |
|
12962 * @param {Object} object The object to iterate over. |
|
12963 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
12964 * @returns {Object} Returns `object`. |
|
12965 * @see _.forIn |
|
12966 * @example |
|
12967 * |
|
12968 * function Foo() { |
|
12969 * this.a = 1; |
|
12970 * this.b = 2; |
|
12971 * } |
|
12972 * |
|
12973 * Foo.prototype.c = 3; |
|
12974 * |
|
12975 * _.forInRight(new Foo, function(value, key) { |
|
12976 * console.log(key); |
|
12977 * }); |
|
12978 * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. |
|
12979 */ |
|
12980 function forInRight(object, iteratee) { |
|
12981 return object == null |
|
12982 ? object |
|
12983 : baseForRight(object, getIteratee(iteratee, 3), keysIn); |
|
12984 } |
|
12985 |
|
12986 /** |
|
12987 * Iterates over own enumerable string keyed properties of an object and |
|
12988 * invokes `iteratee` for each property. The iteratee is invoked with three |
|
12989 * arguments: (value, key, object). Iteratee functions may exit iteration |
|
12990 * early by explicitly returning `false`. |
|
12991 * |
|
12992 * @static |
|
12993 * @memberOf _ |
|
12994 * @since 0.3.0 |
|
12995 * @category Object |
|
12996 * @param {Object} object The object to iterate over. |
|
12997 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
12998 * @returns {Object} Returns `object`. |
|
12999 * @see _.forOwnRight |
|
13000 * @example |
|
13001 * |
|
13002 * function Foo() { |
|
13003 * this.a = 1; |
|
13004 * this.b = 2; |
|
13005 * } |
|
13006 * |
|
13007 * Foo.prototype.c = 3; |
|
13008 * |
|
13009 * _.forOwn(new Foo, function(value, key) { |
|
13010 * console.log(key); |
|
13011 * }); |
|
13012 * // => Logs 'a' then 'b' (iteration order is not guaranteed). |
|
13013 */ |
|
13014 function forOwn(object, iteratee) { |
|
13015 return object && baseForOwn(object, getIteratee(iteratee, 3)); |
|
13016 } |
|
13017 |
|
13018 /** |
|
13019 * This method is like `_.forOwn` except that it iterates over properties of |
|
13020 * `object` in the opposite order. |
|
13021 * |
|
13022 * @static |
|
13023 * @memberOf _ |
|
13024 * @since 2.0.0 |
|
13025 * @category Object |
|
13026 * @param {Object} object The object to iterate over. |
|
13027 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
13028 * @returns {Object} Returns `object`. |
|
13029 * @see _.forOwn |
|
13030 * @example |
|
13031 * |
|
13032 * function Foo() { |
|
13033 * this.a = 1; |
|
13034 * this.b = 2; |
|
13035 * } |
|
13036 * |
|
13037 * Foo.prototype.c = 3; |
|
13038 * |
|
13039 * _.forOwnRight(new Foo, function(value, key) { |
|
13040 * console.log(key); |
|
13041 * }); |
|
13042 * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. |
|
13043 */ |
|
13044 function forOwnRight(object, iteratee) { |
|
13045 return object && baseForOwnRight(object, getIteratee(iteratee, 3)); |
|
13046 } |
|
13047 |
|
13048 /** |
|
13049 * Creates an array of function property names from own enumerable properties |
|
13050 * of `object`. |
|
13051 * |
|
13052 * @static |
|
13053 * @since 0.1.0 |
|
13054 * @memberOf _ |
|
13055 * @category Object |
|
13056 * @param {Object} object The object to inspect. |
|
13057 * @returns {Array} Returns the function names. |
|
13058 * @see _.functionsIn |
|
13059 * @example |
|
13060 * |
|
13061 * function Foo() { |
|
13062 * this.a = _.constant('a'); |
|
13063 * this.b = _.constant('b'); |
|
13064 * } |
|
13065 * |
|
13066 * Foo.prototype.c = _.constant('c'); |
|
13067 * |
|
13068 * _.functions(new Foo); |
|
13069 * // => ['a', 'b'] |
|
13070 */ |
|
13071 function functions(object) { |
|
13072 return object == null ? [] : baseFunctions(object, keys(object)); |
|
13073 } |
|
13074 |
|
13075 /** |
|
13076 * Creates an array of function property names from own and inherited |
|
13077 * enumerable properties of `object`. |
|
13078 * |
|
13079 * @static |
|
13080 * @memberOf _ |
|
13081 * @since 4.0.0 |
|
13082 * @category Object |
|
13083 * @param {Object} object The object to inspect. |
|
13084 * @returns {Array} Returns the function names. |
|
13085 * @see _.functions |
|
13086 * @example |
|
13087 * |
|
13088 * function Foo() { |
|
13089 * this.a = _.constant('a'); |
|
13090 * this.b = _.constant('b'); |
|
13091 * } |
|
13092 * |
|
13093 * Foo.prototype.c = _.constant('c'); |
|
13094 * |
|
13095 * _.functionsIn(new Foo); |
|
13096 * // => ['a', 'b', 'c'] |
|
13097 */ |
|
13098 function functionsIn(object) { |
|
13099 return object == null ? [] : baseFunctions(object, keysIn(object)); |
|
13100 } |
|
13101 |
|
13102 /** |
|
13103 * Gets the value at `path` of `object`. If the resolved value is |
|
13104 * `undefined`, the `defaultValue` is returned in its place. |
|
13105 * |
|
13106 * @static |
|
13107 * @memberOf _ |
|
13108 * @since 3.7.0 |
|
13109 * @category Object |
|
13110 * @param {Object} object The object to query. |
|
13111 * @param {Array|string} path The path of the property to get. |
|
13112 * @param {*} [defaultValue] The value returned for `undefined` resolved values. |
|
13113 * @returns {*} Returns the resolved value. |
|
13114 * @example |
|
13115 * |
|
13116 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; |
|
13117 * |
|
13118 * _.get(object, 'a[0].b.c'); |
|
13119 * // => 3 |
|
13120 * |
|
13121 * _.get(object, ['a', '0', 'b', 'c']); |
|
13122 * // => 3 |
|
13123 * |
|
13124 * _.get(object, 'a.b.c', 'default'); |
|
13125 * // => 'default' |
|
13126 */ |
|
13127 function get(object, path, defaultValue) { |
|
13128 var result = object == null ? undefined : baseGet(object, path); |
|
13129 return result === undefined ? defaultValue : result; |
|
13130 } |
|
13131 |
|
13132 /** |
|
13133 * Checks if `path` is a direct property of `object`. |
|
13134 * |
|
13135 * @static |
|
13136 * @since 0.1.0 |
|
13137 * @memberOf _ |
|
13138 * @category Object |
|
13139 * @param {Object} object The object to query. |
|
13140 * @param {Array|string} path The path to check. |
|
13141 * @returns {boolean} Returns `true` if `path` exists, else `false`. |
|
13142 * @example |
|
13143 * |
|
13144 * var object = { 'a': { 'b': 2 } }; |
|
13145 * var other = _.create({ 'a': _.create({ 'b': 2 }) }); |
|
13146 * |
|
13147 * _.has(object, 'a'); |
|
13148 * // => true |
|
13149 * |
|
13150 * _.has(object, 'a.b'); |
|
13151 * // => true |
|
13152 * |
|
13153 * _.has(object, ['a', 'b']); |
|
13154 * // => true |
|
13155 * |
|
13156 * _.has(other, 'a'); |
|
13157 * // => false |
|
13158 */ |
|
13159 function has(object, path) { |
|
13160 return object != null && hasPath(object, path, baseHas); |
|
13161 } |
|
13162 |
|
13163 /** |
|
13164 * Checks if `path` is a direct or inherited property of `object`. |
|
13165 * |
|
13166 * @static |
|
13167 * @memberOf _ |
|
13168 * @since 4.0.0 |
|
13169 * @category Object |
|
13170 * @param {Object} object The object to query. |
|
13171 * @param {Array|string} path The path to check. |
|
13172 * @returns {boolean} Returns `true` if `path` exists, else `false`. |
|
13173 * @example |
|
13174 * |
|
13175 * var object = _.create({ 'a': _.create({ 'b': 2 }) }); |
|
13176 * |
|
13177 * _.hasIn(object, 'a'); |
|
13178 * // => true |
|
13179 * |
|
13180 * _.hasIn(object, 'a.b'); |
|
13181 * // => true |
|
13182 * |
|
13183 * _.hasIn(object, ['a', 'b']); |
|
13184 * // => true |
|
13185 * |
|
13186 * _.hasIn(object, 'b'); |
|
13187 * // => false |
|
13188 */ |
|
13189 function hasIn(object, path) { |
|
13190 return object != null && hasPath(object, path, baseHasIn); |
|
13191 } |
|
13192 |
|
13193 /** |
|
13194 * Creates an object composed of the inverted keys and values of `object`. |
|
13195 * If `object` contains duplicate values, subsequent values overwrite |
|
13196 * property assignments of previous values. |
|
13197 * |
|
13198 * @static |
|
13199 * @memberOf _ |
|
13200 * @since 0.7.0 |
|
13201 * @category Object |
|
13202 * @param {Object} object The object to invert. |
|
13203 * @returns {Object} Returns the new inverted object. |
|
13204 * @example |
|
13205 * |
|
13206 * var object = { 'a': 1, 'b': 2, 'c': 1 }; |
|
13207 * |
|
13208 * _.invert(object); |
|
13209 * // => { '1': 'c', '2': 'b' } |
|
13210 */ |
|
13211 var invert = createInverter(function(result, value, key) { |
|
13212 if (value != null && |
|
13213 typeof value.toString != 'function') { |
|
13214 value = nativeObjectToString.call(value); |
|
13215 } |
|
13216 |
|
13217 result[value] = key; |
|
13218 }, constant(identity)); |
|
13219 |
|
13220 /** |
|
13221 * This method is like `_.invert` except that the inverted object is generated |
|
13222 * from the results of running each element of `object` thru `iteratee`. The |
|
13223 * corresponding inverted value of each inverted key is an array of keys |
|
13224 * responsible for generating the inverted value. The iteratee is invoked |
|
13225 * with one argument: (value). |
|
13226 * |
|
13227 * @static |
|
13228 * @memberOf _ |
|
13229 * @since 4.1.0 |
|
13230 * @category Object |
|
13231 * @param {Object} object The object to invert. |
|
13232 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
13233 * @returns {Object} Returns the new inverted object. |
|
13234 * @example |
|
13235 * |
|
13236 * var object = { 'a': 1, 'b': 2, 'c': 1 }; |
|
13237 * |
|
13238 * _.invertBy(object); |
|
13239 * // => { '1': ['a', 'c'], '2': ['b'] } |
|
13240 * |
|
13241 * _.invertBy(object, function(value) { |
|
13242 * return 'group' + value; |
|
13243 * }); |
|
13244 * // => { 'group1': ['a', 'c'], 'group2': ['b'] } |
|
13245 */ |
|
13246 var invertBy = createInverter(function(result, value, key) { |
|
13247 if (value != null && |
|
13248 typeof value.toString != 'function') { |
|
13249 value = nativeObjectToString.call(value); |
|
13250 } |
|
13251 |
|
13252 if (hasOwnProperty.call(result, value)) { |
|
13253 result[value].push(key); |
|
13254 } else { |
|
13255 result[value] = [key]; |
|
13256 } |
|
13257 }, getIteratee); |
|
13258 |
|
13259 /** |
|
13260 * Invokes the method at `path` of `object`. |
|
13261 * |
|
13262 * @static |
|
13263 * @memberOf _ |
|
13264 * @since 4.0.0 |
|
13265 * @category Object |
|
13266 * @param {Object} object The object to query. |
|
13267 * @param {Array|string} path The path of the method to invoke. |
|
13268 * @param {...*} [args] The arguments to invoke the method with. |
|
13269 * @returns {*} Returns the result of the invoked method. |
|
13270 * @example |
|
13271 * |
|
13272 * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; |
|
13273 * |
|
13274 * _.invoke(object, 'a[0].b.c.slice', 1, 3); |
|
13275 * // => [2, 3] |
|
13276 */ |
|
13277 var invoke = baseRest(baseInvoke); |
|
13278 |
|
13279 /** |
|
13280 * Creates an array of the own enumerable property names of `object`. |
|
13281 * |
|
13282 * **Note:** Non-object values are coerced to objects. See the |
|
13283 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) |
|
13284 * for more details. |
|
13285 * |
|
13286 * @static |
|
13287 * @since 0.1.0 |
|
13288 * @memberOf _ |
|
13289 * @category Object |
|
13290 * @param {Object} object The object to query. |
|
13291 * @returns {Array} Returns the array of property names. |
|
13292 * @example |
|
13293 * |
|
13294 * function Foo() { |
|
13295 * this.a = 1; |
|
13296 * this.b = 2; |
|
13297 * } |
|
13298 * |
|
13299 * Foo.prototype.c = 3; |
|
13300 * |
|
13301 * _.keys(new Foo); |
|
13302 * // => ['a', 'b'] (iteration order is not guaranteed) |
|
13303 * |
|
13304 * _.keys('hi'); |
|
13305 * // => ['0', '1'] |
|
13306 */ |
|
13307 function keys(object) { |
|
13308 return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); |
|
13309 } |
|
13310 |
|
13311 /** |
|
13312 * Creates an array of the own and inherited enumerable property names of `object`. |
|
13313 * |
|
13314 * **Note:** Non-object values are coerced to objects. |
|
13315 * |
|
13316 * @static |
|
13317 * @memberOf _ |
|
13318 * @since 3.0.0 |
|
13319 * @category Object |
|
13320 * @param {Object} object The object to query. |
|
13321 * @returns {Array} Returns the array of property names. |
|
13322 * @example |
|
13323 * |
|
13324 * function Foo() { |
|
13325 * this.a = 1; |
|
13326 * this.b = 2; |
|
13327 * } |
|
13328 * |
|
13329 * Foo.prototype.c = 3; |
|
13330 * |
|
13331 * _.keysIn(new Foo); |
|
13332 * // => ['a', 'b', 'c'] (iteration order is not guaranteed) |
|
13333 */ |
|
13334 function keysIn(object) { |
|
13335 return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); |
|
13336 } |
|
13337 |
|
13338 /** |
|
13339 * The opposite of `_.mapValues`; this method creates an object with the |
|
13340 * same values as `object` and keys generated by running each own enumerable |
|
13341 * string keyed property of `object` thru `iteratee`. The iteratee is invoked |
|
13342 * with three arguments: (value, key, object). |
|
13343 * |
|
13344 * @static |
|
13345 * @memberOf _ |
|
13346 * @since 3.8.0 |
|
13347 * @category Object |
|
13348 * @param {Object} object The object to iterate over. |
|
13349 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
13350 * @returns {Object} Returns the new mapped object. |
|
13351 * @see _.mapValues |
|
13352 * @example |
|
13353 * |
|
13354 * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { |
|
13355 * return key + value; |
|
13356 * }); |
|
13357 * // => { 'a1': 1, 'b2': 2 } |
|
13358 */ |
|
13359 function mapKeys(object, iteratee) { |
|
13360 var result = {}; |
|
13361 iteratee = getIteratee(iteratee, 3); |
|
13362 |
|
13363 baseForOwn(object, function(value, key, object) { |
|
13364 baseAssignValue(result, iteratee(value, key, object), value); |
|
13365 }); |
|
13366 return result; |
|
13367 } |
|
13368 |
|
13369 /** |
|
13370 * Creates an object with the same keys as `object` and values generated |
|
13371 * by running each own enumerable string keyed property of `object` thru |
|
13372 * `iteratee`. The iteratee is invoked with three arguments: |
|
13373 * (value, key, object). |
|
13374 * |
|
13375 * @static |
|
13376 * @memberOf _ |
|
13377 * @since 2.4.0 |
|
13378 * @category Object |
|
13379 * @param {Object} object The object to iterate over. |
|
13380 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
13381 * @returns {Object} Returns the new mapped object. |
|
13382 * @see _.mapKeys |
|
13383 * @example |
|
13384 * |
|
13385 * var users = { |
|
13386 * 'fred': { 'user': 'fred', 'age': 40 }, |
|
13387 * 'pebbles': { 'user': 'pebbles', 'age': 1 } |
|
13388 * }; |
|
13389 * |
|
13390 * _.mapValues(users, function(o) { return o.age; }); |
|
13391 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) |
|
13392 * |
|
13393 * // The `_.property` iteratee shorthand. |
|
13394 * _.mapValues(users, 'age'); |
|
13395 * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) |
|
13396 */ |
|
13397 function mapValues(object, iteratee) { |
|
13398 var result = {}; |
|
13399 iteratee = getIteratee(iteratee, 3); |
|
13400 |
|
13401 baseForOwn(object, function(value, key, object) { |
|
13402 baseAssignValue(result, key, iteratee(value, key, object)); |
|
13403 }); |
|
13404 return result; |
|
13405 } |
|
13406 |
|
13407 /** |
|
13408 * This method is like `_.assign` except that it recursively merges own and |
|
13409 * inherited enumerable string keyed properties of source objects into the |
|
13410 * destination object. Source properties that resolve to `undefined` are |
|
13411 * skipped if a destination value exists. Array and plain object properties |
|
13412 * are merged recursively. Other objects and value types are overridden by |
|
13413 * assignment. Source objects are applied from left to right. Subsequent |
|
13414 * sources overwrite property assignments of previous sources. |
|
13415 * |
|
13416 * **Note:** This method mutates `object`. |
|
13417 * |
|
13418 * @static |
|
13419 * @memberOf _ |
|
13420 * @since 0.5.0 |
|
13421 * @category Object |
|
13422 * @param {Object} object The destination object. |
|
13423 * @param {...Object} [sources] The source objects. |
|
13424 * @returns {Object} Returns `object`. |
|
13425 * @example |
|
13426 * |
|
13427 * var object = { |
|
13428 * 'a': [{ 'b': 2 }, { 'd': 4 }] |
|
13429 * }; |
|
13430 * |
|
13431 * var other = { |
|
13432 * 'a': [{ 'c': 3 }, { 'e': 5 }] |
|
13433 * }; |
|
13434 * |
|
13435 * _.merge(object, other); |
|
13436 * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } |
|
13437 */ |
|
13438 var merge = createAssigner(function(object, source, srcIndex) { |
|
13439 baseMerge(object, source, srcIndex); |
|
13440 }); |
|
13441 |
|
13442 /** |
|
13443 * This method is like `_.merge` except that it accepts `customizer` which |
|
13444 * is invoked to produce the merged values of the destination and source |
|
13445 * properties. If `customizer` returns `undefined`, merging is handled by the |
|
13446 * method instead. The `customizer` is invoked with six arguments: |
|
13447 * (objValue, srcValue, key, object, source, stack). |
|
13448 * |
|
13449 * **Note:** This method mutates `object`. |
|
13450 * |
|
13451 * @static |
|
13452 * @memberOf _ |
|
13453 * @since 4.0.0 |
|
13454 * @category Object |
|
13455 * @param {Object} object The destination object. |
|
13456 * @param {...Object} sources The source objects. |
|
13457 * @param {Function} customizer The function to customize assigned values. |
|
13458 * @returns {Object} Returns `object`. |
|
13459 * @example |
|
13460 * |
|
13461 * function customizer(objValue, srcValue) { |
|
13462 * if (_.isArray(objValue)) { |
|
13463 * return objValue.concat(srcValue); |
|
13464 * } |
|
13465 * } |
|
13466 * |
|
13467 * var object = { 'a': [1], 'b': [2] }; |
|
13468 * var other = { 'a': [3], 'b': [4] }; |
|
13469 * |
|
13470 * _.mergeWith(object, other, customizer); |
|
13471 * // => { 'a': [1, 3], 'b': [2, 4] } |
|
13472 */ |
|
13473 var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { |
|
13474 baseMerge(object, source, srcIndex, customizer); |
|
13475 }); |
|
13476 |
|
13477 /** |
|
13478 * The opposite of `_.pick`; this method creates an object composed of the |
|
13479 * own and inherited enumerable property paths of `object` that are not omitted. |
|
13480 * |
|
13481 * **Note:** This method is considerably slower than `_.pick`. |
|
13482 * |
|
13483 * @static |
|
13484 * @since 0.1.0 |
|
13485 * @memberOf _ |
|
13486 * @category Object |
|
13487 * @param {Object} object The source object. |
|
13488 * @param {...(string|string[])} [paths] The property paths to omit. |
|
13489 * @returns {Object} Returns the new object. |
|
13490 * @example |
|
13491 * |
|
13492 * var object = { 'a': 1, 'b': '2', 'c': 3 }; |
|
13493 * |
|
13494 * _.omit(object, ['a', 'c']); |
|
13495 * // => { 'b': '2' } |
|
13496 */ |
|
13497 var omit = flatRest(function(object, paths) { |
|
13498 var result = {}; |
|
13499 if (object == null) { |
|
13500 return result; |
|
13501 } |
|
13502 var isDeep = false; |
|
13503 paths = arrayMap(paths, function(path) { |
|
13504 path = castPath(path, object); |
|
13505 isDeep || (isDeep = path.length > 1); |
|
13506 return path; |
|
13507 }); |
|
13508 copyObject(object, getAllKeysIn(object), result); |
|
13509 if (isDeep) { |
|
13510 result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); |
|
13511 } |
|
13512 var length = paths.length; |
|
13513 while (length--) { |
|
13514 baseUnset(result, paths[length]); |
|
13515 } |
|
13516 return result; |
|
13517 }); |
|
13518 |
|
13519 /** |
|
13520 * The opposite of `_.pickBy`; this method creates an object composed of |
|
13521 * the own and inherited enumerable string keyed properties of `object` that |
|
13522 * `predicate` doesn't return truthy for. The predicate is invoked with two |
|
13523 * arguments: (value, key). |
|
13524 * |
|
13525 * @static |
|
13526 * @memberOf _ |
|
13527 * @since 4.0.0 |
|
13528 * @category Object |
|
13529 * @param {Object} object The source object. |
|
13530 * @param {Function} [predicate=_.identity] The function invoked per property. |
|
13531 * @returns {Object} Returns the new object. |
|
13532 * @example |
|
13533 * |
|
13534 * var object = { 'a': 1, 'b': '2', 'c': 3 }; |
|
13535 * |
|
13536 * _.omitBy(object, _.isNumber); |
|
13537 * // => { 'b': '2' } |
|
13538 */ |
|
13539 function omitBy(object, predicate) { |
|
13540 return pickBy(object, negate(getIteratee(predicate))); |
|
13541 } |
|
13542 |
|
13543 /** |
|
13544 * Creates an object composed of the picked `object` properties. |
|
13545 * |
|
13546 * @static |
|
13547 * @since 0.1.0 |
|
13548 * @memberOf _ |
|
13549 * @category Object |
|
13550 * @param {Object} object The source object. |
|
13551 * @param {...(string|string[])} [paths] The property paths to pick. |
|
13552 * @returns {Object} Returns the new object. |
|
13553 * @example |
|
13554 * |
|
13555 * var object = { 'a': 1, 'b': '2', 'c': 3 }; |
|
13556 * |
|
13557 * _.pick(object, ['a', 'c']); |
|
13558 * // => { 'a': 1, 'c': 3 } |
|
13559 */ |
|
13560 var pick = flatRest(function(object, paths) { |
|
13561 return object == null ? {} : basePick(object, paths); |
|
13562 }); |
|
13563 |
|
13564 /** |
|
13565 * Creates an object composed of the `object` properties `predicate` returns |
|
13566 * truthy for. The predicate is invoked with two arguments: (value, key). |
|
13567 * |
|
13568 * @static |
|
13569 * @memberOf _ |
|
13570 * @since 4.0.0 |
|
13571 * @category Object |
|
13572 * @param {Object} object The source object. |
|
13573 * @param {Function} [predicate=_.identity] The function invoked per property. |
|
13574 * @returns {Object} Returns the new object. |
|
13575 * @example |
|
13576 * |
|
13577 * var object = { 'a': 1, 'b': '2', 'c': 3 }; |
|
13578 * |
|
13579 * _.pickBy(object, _.isNumber); |
|
13580 * // => { 'a': 1, 'c': 3 } |
|
13581 */ |
|
13582 function pickBy(object, predicate) { |
|
13583 if (object == null) { |
|
13584 return {}; |
|
13585 } |
|
13586 var props = arrayMap(getAllKeysIn(object), function(prop) { |
|
13587 return [prop]; |
|
13588 }); |
|
13589 predicate = getIteratee(predicate); |
|
13590 return basePickBy(object, props, function(value, path) { |
|
13591 return predicate(value, path[0]); |
|
13592 }); |
|
13593 } |
|
13594 |
|
13595 /** |
|
13596 * This method is like `_.get` except that if the resolved value is a |
|
13597 * function it's invoked with the `this` binding of its parent object and |
|
13598 * its result is returned. |
|
13599 * |
|
13600 * @static |
|
13601 * @since 0.1.0 |
|
13602 * @memberOf _ |
|
13603 * @category Object |
|
13604 * @param {Object} object The object to query. |
|
13605 * @param {Array|string} path The path of the property to resolve. |
|
13606 * @param {*} [defaultValue] The value returned for `undefined` resolved values. |
|
13607 * @returns {*} Returns the resolved value. |
|
13608 * @example |
|
13609 * |
|
13610 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; |
|
13611 * |
|
13612 * _.result(object, 'a[0].b.c1'); |
|
13613 * // => 3 |
|
13614 * |
|
13615 * _.result(object, 'a[0].b.c2'); |
|
13616 * // => 4 |
|
13617 * |
|
13618 * _.result(object, 'a[0].b.c3', 'default'); |
|
13619 * // => 'default' |
|
13620 * |
|
13621 * _.result(object, 'a[0].b.c3', _.constant('default')); |
|
13622 * // => 'default' |
|
13623 */ |
|
13624 function result(object, path, defaultValue) { |
|
13625 path = castPath(path, object); |
|
13626 |
|
13627 var index = -1, |
|
13628 length = path.length; |
|
13629 |
|
13630 // Ensure the loop is entered when path is empty. |
|
13631 if (!length) { |
|
13632 length = 1; |
|
13633 object = undefined; |
|
13634 } |
|
13635 while (++index < length) { |
|
13636 var value = object == null ? undefined : object[toKey(path[index])]; |
|
13637 if (value === undefined) { |
|
13638 index = length; |
|
13639 value = defaultValue; |
|
13640 } |
|
13641 object = isFunction(value) ? value.call(object) : value; |
|
13642 } |
|
13643 return object; |
|
13644 } |
|
13645 |
|
13646 /** |
|
13647 * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, |
|
13648 * it's created. Arrays are created for missing index properties while objects |
|
13649 * are created for all other missing properties. Use `_.setWith` to customize |
|
13650 * `path` creation. |
|
13651 * |
|
13652 * **Note:** This method mutates `object`. |
|
13653 * |
|
13654 * @static |
|
13655 * @memberOf _ |
|
13656 * @since 3.7.0 |
|
13657 * @category Object |
|
13658 * @param {Object} object The object to modify. |
|
13659 * @param {Array|string} path The path of the property to set. |
|
13660 * @param {*} value The value to set. |
|
13661 * @returns {Object} Returns `object`. |
|
13662 * @example |
|
13663 * |
|
13664 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; |
|
13665 * |
|
13666 * _.set(object, 'a[0].b.c', 4); |
|
13667 * console.log(object.a[0].b.c); |
|
13668 * // => 4 |
|
13669 * |
|
13670 * _.set(object, ['x', '0', 'y', 'z'], 5); |
|
13671 * console.log(object.x[0].y.z); |
|
13672 * // => 5 |
|
13673 */ |
|
13674 function set(object, path, value) { |
|
13675 return object == null ? object : baseSet(object, path, value); |
|
13676 } |
|
13677 |
|
13678 /** |
|
13679 * This method is like `_.set` except that it accepts `customizer` which is |
|
13680 * invoked to produce the objects of `path`. If `customizer` returns `undefined` |
|
13681 * path creation is handled by the method instead. The `customizer` is invoked |
|
13682 * with three arguments: (nsValue, key, nsObject). |
|
13683 * |
|
13684 * **Note:** This method mutates `object`. |
|
13685 * |
|
13686 * @static |
|
13687 * @memberOf _ |
|
13688 * @since 4.0.0 |
|
13689 * @category Object |
|
13690 * @param {Object} object The object to modify. |
|
13691 * @param {Array|string} path The path of the property to set. |
|
13692 * @param {*} value The value to set. |
|
13693 * @param {Function} [customizer] The function to customize assigned values. |
|
13694 * @returns {Object} Returns `object`. |
|
13695 * @example |
|
13696 * |
|
13697 * var object = {}; |
|
13698 * |
|
13699 * _.setWith(object, '[0][1]', 'a', Object); |
|
13700 * // => { '0': { '1': 'a' } } |
|
13701 */ |
|
13702 function setWith(object, path, value, customizer) { |
|
13703 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
13704 return object == null ? object : baseSet(object, path, value, customizer); |
|
13705 } |
|
13706 |
|
13707 /** |
|
13708 * Creates an array of own enumerable string keyed-value pairs for `object` |
|
13709 * which can be consumed by `_.fromPairs`. If `object` is a map or set, its |
|
13710 * entries are returned. |
|
13711 * |
|
13712 * @static |
|
13713 * @memberOf _ |
|
13714 * @since 4.0.0 |
|
13715 * @alias entries |
|
13716 * @category Object |
|
13717 * @param {Object} object The object to query. |
|
13718 * @returns {Array} Returns the key-value pairs. |
|
13719 * @example |
|
13720 * |
|
13721 * function Foo() { |
|
13722 * this.a = 1; |
|
13723 * this.b = 2; |
|
13724 * } |
|
13725 * |
|
13726 * Foo.prototype.c = 3; |
|
13727 * |
|
13728 * _.toPairs(new Foo); |
|
13729 * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) |
|
13730 */ |
|
13731 var toPairs = createToPairs(keys); |
|
13732 |
|
13733 /** |
|
13734 * Creates an array of own and inherited enumerable string keyed-value pairs |
|
13735 * for `object` which can be consumed by `_.fromPairs`. If `object` is a map |
|
13736 * or set, its entries are returned. |
|
13737 * |
|
13738 * @static |
|
13739 * @memberOf _ |
|
13740 * @since 4.0.0 |
|
13741 * @alias entriesIn |
|
13742 * @category Object |
|
13743 * @param {Object} object The object to query. |
|
13744 * @returns {Array} Returns the key-value pairs. |
|
13745 * @example |
|
13746 * |
|
13747 * function Foo() { |
|
13748 * this.a = 1; |
|
13749 * this.b = 2; |
|
13750 * } |
|
13751 * |
|
13752 * Foo.prototype.c = 3; |
|
13753 * |
|
13754 * _.toPairsIn(new Foo); |
|
13755 * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) |
|
13756 */ |
|
13757 var toPairsIn = createToPairs(keysIn); |
|
13758 |
|
13759 /** |
|
13760 * An alternative to `_.reduce`; this method transforms `object` to a new |
|
13761 * `accumulator` object which is the result of running each of its own |
|
13762 * enumerable string keyed properties thru `iteratee`, with each invocation |
|
13763 * potentially mutating the `accumulator` object. If `accumulator` is not |
|
13764 * provided, a new object with the same `[[Prototype]]` will be used. The |
|
13765 * iteratee is invoked with four arguments: (accumulator, value, key, object). |
|
13766 * Iteratee functions may exit iteration early by explicitly returning `false`. |
|
13767 * |
|
13768 * @static |
|
13769 * @memberOf _ |
|
13770 * @since 1.3.0 |
|
13771 * @category Object |
|
13772 * @param {Object} object The object to iterate over. |
|
13773 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
13774 * @param {*} [accumulator] The custom accumulator value. |
|
13775 * @returns {*} Returns the accumulated value. |
|
13776 * @example |
|
13777 * |
|
13778 * _.transform([2, 3, 4], function(result, n) { |
|
13779 * result.push(n *= n); |
|
13780 * return n % 2 == 0; |
|
13781 * }, []); |
|
13782 * // => [4, 9] |
|
13783 * |
|
13784 * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { |
|
13785 * (result[value] || (result[value] = [])).push(key); |
|
13786 * }, {}); |
|
13787 * // => { '1': ['a', 'c'], '2': ['b'] } |
|
13788 */ |
|
13789 function transform(object, iteratee, accumulator) { |
|
13790 var isArr = isArray(object), |
|
13791 isArrLike = isArr || isBuffer(object) || isTypedArray(object); |
|
13792 |
|
13793 iteratee = getIteratee(iteratee, 4); |
|
13794 if (accumulator == null) { |
|
13795 var Ctor = object && object.constructor; |
|
13796 if (isArrLike) { |
|
13797 accumulator = isArr ? new Ctor : []; |
|
13798 } |
|
13799 else if (isObject(object)) { |
|
13800 accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; |
|
13801 } |
|
13802 else { |
|
13803 accumulator = {}; |
|
13804 } |
|
13805 } |
|
13806 (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { |
|
13807 return iteratee(accumulator, value, index, object); |
|
13808 }); |
|
13809 return accumulator; |
|
13810 } |
|
13811 |
|
13812 /** |
|
13813 * Removes the property at `path` of `object`. |
|
13814 * |
|
13815 * **Note:** This method mutates `object`. |
|
13816 * |
|
13817 * @static |
|
13818 * @memberOf _ |
|
13819 * @since 4.0.0 |
|
13820 * @category Object |
|
13821 * @param {Object} object The object to modify. |
|
13822 * @param {Array|string} path The path of the property to unset. |
|
13823 * @returns {boolean} Returns `true` if the property is deleted, else `false`. |
|
13824 * @example |
|
13825 * |
|
13826 * var object = { 'a': [{ 'b': { 'c': 7 } }] }; |
|
13827 * _.unset(object, 'a[0].b.c'); |
|
13828 * // => true |
|
13829 * |
|
13830 * console.log(object); |
|
13831 * // => { 'a': [{ 'b': {} }] }; |
|
13832 * |
|
13833 * _.unset(object, ['a', '0', 'b', 'c']); |
|
13834 * // => true |
|
13835 * |
|
13836 * console.log(object); |
|
13837 * // => { 'a': [{ 'b': {} }] }; |
|
13838 */ |
|
13839 function unset(object, path) { |
|
13840 return object == null ? true : baseUnset(object, path); |
|
13841 } |
|
13842 |
|
13843 /** |
|
13844 * This method is like `_.set` except that accepts `updater` to produce the |
|
13845 * value to set. Use `_.updateWith` to customize `path` creation. The `updater` |
|
13846 * is invoked with one argument: (value). |
|
13847 * |
|
13848 * **Note:** This method mutates `object`. |
|
13849 * |
|
13850 * @static |
|
13851 * @memberOf _ |
|
13852 * @since 4.6.0 |
|
13853 * @category Object |
|
13854 * @param {Object} object The object to modify. |
|
13855 * @param {Array|string} path The path of the property to set. |
|
13856 * @param {Function} updater The function to produce the updated value. |
|
13857 * @returns {Object} Returns `object`. |
|
13858 * @example |
|
13859 * |
|
13860 * var object = { 'a': [{ 'b': { 'c': 3 } }] }; |
|
13861 * |
|
13862 * _.update(object, 'a[0].b.c', function(n) { return n * n; }); |
|
13863 * console.log(object.a[0].b.c); |
|
13864 * // => 9 |
|
13865 * |
|
13866 * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); |
|
13867 * console.log(object.x[0].y.z); |
|
13868 * // => 0 |
|
13869 */ |
|
13870 function update(object, path, updater) { |
|
13871 return object == null ? object : baseUpdate(object, path, castFunction(updater)); |
|
13872 } |
|
13873 |
|
13874 /** |
|
13875 * This method is like `_.update` except that it accepts `customizer` which is |
|
13876 * invoked to produce the objects of `path`. If `customizer` returns `undefined` |
|
13877 * path creation is handled by the method instead. The `customizer` is invoked |
|
13878 * with three arguments: (nsValue, key, nsObject). |
|
13879 * |
|
13880 * **Note:** This method mutates `object`. |
|
13881 * |
|
13882 * @static |
|
13883 * @memberOf _ |
|
13884 * @since 4.6.0 |
|
13885 * @category Object |
|
13886 * @param {Object} object The object to modify. |
|
13887 * @param {Array|string} path The path of the property to set. |
|
13888 * @param {Function} updater The function to produce the updated value. |
|
13889 * @param {Function} [customizer] The function to customize assigned values. |
|
13890 * @returns {Object} Returns `object`. |
|
13891 * @example |
|
13892 * |
|
13893 * var object = {}; |
|
13894 * |
|
13895 * _.updateWith(object, '[0][1]', _.constant('a'), Object); |
|
13896 * // => { '0': { '1': 'a' } } |
|
13897 */ |
|
13898 function updateWith(object, path, updater, customizer) { |
|
13899 customizer = typeof customizer == 'function' ? customizer : undefined; |
|
13900 return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); |
|
13901 } |
|
13902 |
|
13903 /** |
|
13904 * Creates an array of the own enumerable string keyed property values of `object`. |
|
13905 * |
|
13906 * **Note:** Non-object values are coerced to objects. |
|
13907 * |
|
13908 * @static |
|
13909 * @since 0.1.0 |
|
13910 * @memberOf _ |
|
13911 * @category Object |
|
13912 * @param {Object} object The object to query. |
|
13913 * @returns {Array} Returns the array of property values. |
|
13914 * @example |
|
13915 * |
|
13916 * function Foo() { |
|
13917 * this.a = 1; |
|
13918 * this.b = 2; |
|
13919 * } |
|
13920 * |
|
13921 * Foo.prototype.c = 3; |
|
13922 * |
|
13923 * _.values(new Foo); |
|
13924 * // => [1, 2] (iteration order is not guaranteed) |
|
13925 * |
|
13926 * _.values('hi'); |
|
13927 * // => ['h', 'i'] |
|
13928 */ |
|
13929 function values(object) { |
|
13930 return object == null ? [] : baseValues(object, keys(object)); |
|
13931 } |
|
13932 |
|
13933 /** |
|
13934 * Creates an array of the own and inherited enumerable string keyed property |
|
13935 * values of `object`. |
|
13936 * |
|
13937 * **Note:** Non-object values are coerced to objects. |
|
13938 * |
|
13939 * @static |
|
13940 * @memberOf _ |
|
13941 * @since 3.0.0 |
|
13942 * @category Object |
|
13943 * @param {Object} object The object to query. |
|
13944 * @returns {Array} Returns the array of property values. |
|
13945 * @example |
|
13946 * |
|
13947 * function Foo() { |
|
13948 * this.a = 1; |
|
13949 * this.b = 2; |
|
13950 * } |
|
13951 * |
|
13952 * Foo.prototype.c = 3; |
|
13953 * |
|
13954 * _.valuesIn(new Foo); |
|
13955 * // => [1, 2, 3] (iteration order is not guaranteed) |
|
13956 */ |
|
13957 function valuesIn(object) { |
|
13958 return object == null ? [] : baseValues(object, keysIn(object)); |
|
13959 } |
|
13960 |
|
13961 /*------------------------------------------------------------------------*/ |
|
13962 |
|
13963 /** |
|
13964 * Clamps `number` within the inclusive `lower` and `upper` bounds. |
|
13965 * |
|
13966 * @static |
|
13967 * @memberOf _ |
|
13968 * @since 4.0.0 |
|
13969 * @category Number |
|
13970 * @param {number} number The number to clamp. |
|
13971 * @param {number} [lower] The lower bound. |
|
13972 * @param {number} upper The upper bound. |
|
13973 * @returns {number} Returns the clamped number. |
|
13974 * @example |
|
13975 * |
|
13976 * _.clamp(-10, -5, 5); |
|
13977 * // => -5 |
|
13978 * |
|
13979 * _.clamp(10, -5, 5); |
|
13980 * // => 5 |
|
13981 */ |
|
13982 function clamp(number, lower, upper) { |
|
13983 if (upper === undefined) { |
|
13984 upper = lower; |
|
13985 lower = undefined; |
|
13986 } |
|
13987 if (upper !== undefined) { |
|
13988 upper = toNumber(upper); |
|
13989 upper = upper === upper ? upper : 0; |
|
13990 } |
|
13991 if (lower !== undefined) { |
|
13992 lower = toNumber(lower); |
|
13993 lower = lower === lower ? lower : 0; |
|
13994 } |
|
13995 return baseClamp(toNumber(number), lower, upper); |
|
13996 } |
|
13997 |
|
13998 /** |
|
13999 * Checks if `n` is between `start` and up to, but not including, `end`. If |
|
14000 * `end` is not specified, it's set to `start` with `start` then set to `0`. |
|
14001 * If `start` is greater than `end` the params are swapped to support |
|
14002 * negative ranges. |
|
14003 * |
|
14004 * @static |
|
14005 * @memberOf _ |
|
14006 * @since 3.3.0 |
|
14007 * @category Number |
|
14008 * @param {number} number The number to check. |
|
14009 * @param {number} [start=0] The start of the range. |
|
14010 * @param {number} end The end of the range. |
|
14011 * @returns {boolean} Returns `true` if `number` is in the range, else `false`. |
|
14012 * @see _.range, _.rangeRight |
|
14013 * @example |
|
14014 * |
|
14015 * _.inRange(3, 2, 4); |
|
14016 * // => true |
|
14017 * |
|
14018 * _.inRange(4, 8); |
|
14019 * // => true |
|
14020 * |
|
14021 * _.inRange(4, 2); |
|
14022 * // => false |
|
14023 * |
|
14024 * _.inRange(2, 2); |
|
14025 * // => false |
|
14026 * |
|
14027 * _.inRange(1.2, 2); |
|
14028 * // => true |
|
14029 * |
|
14030 * _.inRange(5.2, 4); |
|
14031 * // => false |
|
14032 * |
|
14033 * _.inRange(-3, -2, -6); |
|
14034 * // => true |
|
14035 */ |
|
14036 function inRange(number, start, end) { |
|
14037 start = toFinite(start); |
|
14038 if (end === undefined) { |
|
14039 end = start; |
|
14040 start = 0; |
|
14041 } else { |
|
14042 end = toFinite(end); |
|
14043 } |
|
14044 number = toNumber(number); |
|
14045 return baseInRange(number, start, end); |
|
14046 } |
|
14047 |
|
14048 /** |
|
14049 * Produces a random number between the inclusive `lower` and `upper` bounds. |
|
14050 * If only one argument is provided a number between `0` and the given number |
|
14051 * is returned. If `floating` is `true`, or either `lower` or `upper` are |
|
14052 * floats, a floating-point number is returned instead of an integer. |
|
14053 * |
|
14054 * **Note:** JavaScript follows the IEEE-754 standard for resolving |
|
14055 * floating-point values which can produce unexpected results. |
|
14056 * |
|
14057 * @static |
|
14058 * @memberOf _ |
|
14059 * @since 0.7.0 |
|
14060 * @category Number |
|
14061 * @param {number} [lower=0] The lower bound. |
|
14062 * @param {number} [upper=1] The upper bound. |
|
14063 * @param {boolean} [floating] Specify returning a floating-point number. |
|
14064 * @returns {number} Returns the random number. |
|
14065 * @example |
|
14066 * |
|
14067 * _.random(0, 5); |
|
14068 * // => an integer between 0 and 5 |
|
14069 * |
|
14070 * _.random(5); |
|
14071 * // => also an integer between 0 and 5 |
|
14072 * |
|
14073 * _.random(5, true); |
|
14074 * // => a floating-point number between 0 and 5 |
|
14075 * |
|
14076 * _.random(1.2, 5.2); |
|
14077 * // => a floating-point number between 1.2 and 5.2 |
|
14078 */ |
|
14079 function random(lower, upper, floating) { |
|
14080 if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { |
|
14081 upper = floating = undefined; |
|
14082 } |
|
14083 if (floating === undefined) { |
|
14084 if (typeof upper == 'boolean') { |
|
14085 floating = upper; |
|
14086 upper = undefined; |
|
14087 } |
|
14088 else if (typeof lower == 'boolean') { |
|
14089 floating = lower; |
|
14090 lower = undefined; |
|
14091 } |
|
14092 } |
|
14093 if (lower === undefined && upper === undefined) { |
|
14094 lower = 0; |
|
14095 upper = 1; |
|
14096 } |
|
14097 else { |
|
14098 lower = toFinite(lower); |
|
14099 if (upper === undefined) { |
|
14100 upper = lower; |
|
14101 lower = 0; |
|
14102 } else { |
|
14103 upper = toFinite(upper); |
|
14104 } |
|
14105 } |
|
14106 if (lower > upper) { |
|
14107 var temp = lower; |
|
14108 lower = upper; |
|
14109 upper = temp; |
|
14110 } |
|
14111 if (floating || lower % 1 || upper % 1) { |
|
14112 var rand = nativeRandom(); |
|
14113 return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); |
|
14114 } |
|
14115 return baseRandom(lower, upper); |
|
14116 } |
|
14117 |
|
14118 /*------------------------------------------------------------------------*/ |
|
14119 |
|
14120 /** |
|
14121 * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). |
|
14122 * |
|
14123 * @static |
|
14124 * @memberOf _ |
|
14125 * @since 3.0.0 |
|
14126 * @category String |
|
14127 * @param {string} [string=''] The string to convert. |
|
14128 * @returns {string} Returns the camel cased string. |
|
14129 * @example |
|
14130 * |
|
14131 * _.camelCase('Foo Bar'); |
|
14132 * // => 'fooBar' |
|
14133 * |
|
14134 * _.camelCase('--foo-bar--'); |
|
14135 * // => 'fooBar' |
|
14136 * |
|
14137 * _.camelCase('__FOO_BAR__'); |
|
14138 * // => 'fooBar' |
|
14139 */ |
|
14140 var camelCase = createCompounder(function(result, word, index) { |
|
14141 word = word.toLowerCase(); |
|
14142 return result + (index ? capitalize(word) : word); |
|
14143 }); |
|
14144 |
|
14145 /** |
|
14146 * Converts the first character of `string` to upper case and the remaining |
|
14147 * to lower case. |
|
14148 * |
|
14149 * @static |
|
14150 * @memberOf _ |
|
14151 * @since 3.0.0 |
|
14152 * @category String |
|
14153 * @param {string} [string=''] The string to capitalize. |
|
14154 * @returns {string} Returns the capitalized string. |
|
14155 * @example |
|
14156 * |
|
14157 * _.capitalize('FRED'); |
|
14158 * // => 'Fred' |
|
14159 */ |
|
14160 function capitalize(string) { |
|
14161 return upperFirst(toString(string).toLowerCase()); |
|
14162 } |
|
14163 |
|
14164 /** |
|
14165 * Deburrs `string` by converting |
|
14166 * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) |
|
14167 * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) |
|
14168 * letters to basic Latin letters and removing |
|
14169 * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). |
|
14170 * |
|
14171 * @static |
|
14172 * @memberOf _ |
|
14173 * @since 3.0.0 |
|
14174 * @category String |
|
14175 * @param {string} [string=''] The string to deburr. |
|
14176 * @returns {string} Returns the deburred string. |
|
14177 * @example |
|
14178 * |
|
14179 * _.deburr('déjà vu'); |
|
14180 * // => 'deja vu' |
|
14181 */ |
|
14182 function deburr(string) { |
|
14183 string = toString(string); |
|
14184 return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); |
|
14185 } |
|
14186 |
|
14187 /** |
|
14188 * Checks if `string` ends with the given target string. |
|
14189 * |
|
14190 * @static |
|
14191 * @memberOf _ |
|
14192 * @since 3.0.0 |
|
14193 * @category String |
|
14194 * @param {string} [string=''] The string to inspect. |
|
14195 * @param {string} [target] The string to search for. |
|
14196 * @param {number} [position=string.length] The position to search up to. |
|
14197 * @returns {boolean} Returns `true` if `string` ends with `target`, |
|
14198 * else `false`. |
|
14199 * @example |
|
14200 * |
|
14201 * _.endsWith('abc', 'c'); |
|
14202 * // => true |
|
14203 * |
|
14204 * _.endsWith('abc', 'b'); |
|
14205 * // => false |
|
14206 * |
|
14207 * _.endsWith('abc', 'b', 2); |
|
14208 * // => true |
|
14209 */ |
|
14210 function endsWith(string, target, position) { |
|
14211 string = toString(string); |
|
14212 target = baseToString(target); |
|
14213 |
|
14214 var length = string.length; |
|
14215 position = position === undefined |
|
14216 ? length |
|
14217 : baseClamp(toInteger(position), 0, length); |
|
14218 |
|
14219 var end = position; |
|
14220 position -= target.length; |
|
14221 return position >= 0 && string.slice(position, end) == target; |
|
14222 } |
|
14223 |
|
14224 /** |
|
14225 * Converts the characters "&", "<", ">", '"', and "'" in `string` to their |
|
14226 * corresponding HTML entities. |
|
14227 * |
|
14228 * **Note:** No other characters are escaped. To escape additional |
|
14229 * characters use a third-party library like [_he_](https://mths.be/he). |
|
14230 * |
|
14231 * Though the ">" character is escaped for symmetry, characters like |
|
14232 * ">" and "/" don't need escaping in HTML and have no special meaning |
|
14233 * unless they're part of a tag or unquoted attribute value. See |
|
14234 * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) |
|
14235 * (under "semi-related fun fact") for more details. |
|
14236 * |
|
14237 * When working with HTML you should always |
|
14238 * [quote attribute values](http://wonko.com/post/html-escaping) to reduce |
|
14239 * XSS vectors. |
|
14240 * |
|
14241 * @static |
|
14242 * @since 0.1.0 |
|
14243 * @memberOf _ |
|
14244 * @category String |
|
14245 * @param {string} [string=''] The string to escape. |
|
14246 * @returns {string} Returns the escaped string. |
|
14247 * @example |
|
14248 * |
|
14249 * _.escape('fred, barney, & pebbles'); |
|
14250 * // => 'fred, barney, & pebbles' |
|
14251 */ |
|
14252 function escape(string) { |
|
14253 string = toString(string); |
|
14254 return (string && reHasUnescapedHtml.test(string)) |
|
14255 ? string.replace(reUnescapedHtml, escapeHtmlChar) |
|
14256 : string; |
|
14257 } |
|
14258 |
|
14259 /** |
|
14260 * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", |
|
14261 * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. |
|
14262 * |
|
14263 * @static |
|
14264 * @memberOf _ |
|
14265 * @since 3.0.0 |
|
14266 * @category String |
|
14267 * @param {string} [string=''] The string to escape. |
|
14268 * @returns {string} Returns the escaped string. |
|
14269 * @example |
|
14270 * |
|
14271 * _.escapeRegExp('[lodash](https://lodash.com/)'); |
|
14272 * // => '\[lodash\]\(https://lodash\.com/\)' |
|
14273 */ |
|
14274 function escapeRegExp(string) { |
|
14275 string = toString(string); |
|
14276 return (string && reHasRegExpChar.test(string)) |
|
14277 ? string.replace(reRegExpChar, '\\$&') |
|
14278 : string; |
|
14279 } |
|
14280 |
|
14281 /** |
|
14282 * Converts `string` to |
|
14283 * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). |
|
14284 * |
|
14285 * @static |
|
14286 * @memberOf _ |
|
14287 * @since 3.0.0 |
|
14288 * @category String |
|
14289 * @param {string} [string=''] The string to convert. |
|
14290 * @returns {string} Returns the kebab cased string. |
|
14291 * @example |
|
14292 * |
|
14293 * _.kebabCase('Foo Bar'); |
|
14294 * // => 'foo-bar' |
|
14295 * |
|
14296 * _.kebabCase('fooBar'); |
|
14297 * // => 'foo-bar' |
|
14298 * |
|
14299 * _.kebabCase('__FOO_BAR__'); |
|
14300 * // => 'foo-bar' |
|
14301 */ |
|
14302 var kebabCase = createCompounder(function(result, word, index) { |
|
14303 return result + (index ? '-' : '') + word.toLowerCase(); |
|
14304 }); |
|
14305 |
|
14306 /** |
|
14307 * Converts `string`, as space separated words, to lower case. |
|
14308 * |
|
14309 * @static |
|
14310 * @memberOf _ |
|
14311 * @since 4.0.0 |
|
14312 * @category String |
|
14313 * @param {string} [string=''] The string to convert. |
|
14314 * @returns {string} Returns the lower cased string. |
|
14315 * @example |
|
14316 * |
|
14317 * _.lowerCase('--Foo-Bar--'); |
|
14318 * // => 'foo bar' |
|
14319 * |
|
14320 * _.lowerCase('fooBar'); |
|
14321 * // => 'foo bar' |
|
14322 * |
|
14323 * _.lowerCase('__FOO_BAR__'); |
|
14324 * // => 'foo bar' |
|
14325 */ |
|
14326 var lowerCase = createCompounder(function(result, word, index) { |
|
14327 return result + (index ? ' ' : '') + word.toLowerCase(); |
|
14328 }); |
|
14329 |
|
14330 /** |
|
14331 * Converts the first character of `string` to lower case. |
|
14332 * |
|
14333 * @static |
|
14334 * @memberOf _ |
|
14335 * @since 4.0.0 |
|
14336 * @category String |
|
14337 * @param {string} [string=''] The string to convert. |
|
14338 * @returns {string} Returns the converted string. |
|
14339 * @example |
|
14340 * |
|
14341 * _.lowerFirst('Fred'); |
|
14342 * // => 'fred' |
|
14343 * |
|
14344 * _.lowerFirst('FRED'); |
|
14345 * // => 'fRED' |
|
14346 */ |
|
14347 var lowerFirst = createCaseFirst('toLowerCase'); |
|
14348 |
|
14349 /** |
|
14350 * Pads `string` on the left and right sides if it's shorter than `length`. |
|
14351 * Padding characters are truncated if they can't be evenly divided by `length`. |
|
14352 * |
|
14353 * @static |
|
14354 * @memberOf _ |
|
14355 * @since 3.0.0 |
|
14356 * @category String |
|
14357 * @param {string} [string=''] The string to pad. |
|
14358 * @param {number} [length=0] The padding length. |
|
14359 * @param {string} [chars=' '] The string used as padding. |
|
14360 * @returns {string} Returns the padded string. |
|
14361 * @example |
|
14362 * |
|
14363 * _.pad('abc', 8); |
|
14364 * // => ' abc ' |
|
14365 * |
|
14366 * _.pad('abc', 8, '_-'); |
|
14367 * // => '_-abc_-_' |
|
14368 * |
|
14369 * _.pad('abc', 3); |
|
14370 * // => 'abc' |
|
14371 */ |
|
14372 function pad(string, length, chars) { |
|
14373 string = toString(string); |
|
14374 length = toInteger(length); |
|
14375 |
|
14376 var strLength = length ? stringSize(string) : 0; |
|
14377 if (!length || strLength >= length) { |
|
14378 return string; |
|
14379 } |
|
14380 var mid = (length - strLength) / 2; |
|
14381 return ( |
|
14382 createPadding(nativeFloor(mid), chars) + |
|
14383 string + |
|
14384 createPadding(nativeCeil(mid), chars) |
|
14385 ); |
|
14386 } |
|
14387 |
|
14388 /** |
|
14389 * Pads `string` on the right side if it's shorter than `length`. Padding |
|
14390 * characters are truncated if they exceed `length`. |
|
14391 * |
|
14392 * @static |
|
14393 * @memberOf _ |
|
14394 * @since 4.0.0 |
|
14395 * @category String |
|
14396 * @param {string} [string=''] The string to pad. |
|
14397 * @param {number} [length=0] The padding length. |
|
14398 * @param {string} [chars=' '] The string used as padding. |
|
14399 * @returns {string} Returns the padded string. |
|
14400 * @example |
|
14401 * |
|
14402 * _.padEnd('abc', 6); |
|
14403 * // => 'abc ' |
|
14404 * |
|
14405 * _.padEnd('abc', 6, '_-'); |
|
14406 * // => 'abc_-_' |
|
14407 * |
|
14408 * _.padEnd('abc', 3); |
|
14409 * // => 'abc' |
|
14410 */ |
|
14411 function padEnd(string, length, chars) { |
|
14412 string = toString(string); |
|
14413 length = toInteger(length); |
|
14414 |
|
14415 var strLength = length ? stringSize(string) : 0; |
|
14416 return (length && strLength < length) |
|
14417 ? (string + createPadding(length - strLength, chars)) |
|
14418 : string; |
|
14419 } |
|
14420 |
|
14421 /** |
|
14422 * Pads `string` on the left side if it's shorter than `length`. Padding |
|
14423 * characters are truncated if they exceed `length`. |
|
14424 * |
|
14425 * @static |
|
14426 * @memberOf _ |
|
14427 * @since 4.0.0 |
|
14428 * @category String |
|
14429 * @param {string} [string=''] The string to pad. |
|
14430 * @param {number} [length=0] The padding length. |
|
14431 * @param {string} [chars=' '] The string used as padding. |
|
14432 * @returns {string} Returns the padded string. |
|
14433 * @example |
|
14434 * |
|
14435 * _.padStart('abc', 6); |
|
14436 * // => ' abc' |
|
14437 * |
|
14438 * _.padStart('abc', 6, '_-'); |
|
14439 * // => '_-_abc' |
|
14440 * |
|
14441 * _.padStart('abc', 3); |
|
14442 * // => 'abc' |
|
14443 */ |
|
14444 function padStart(string, length, chars) { |
|
14445 string = toString(string); |
|
14446 length = toInteger(length); |
|
14447 |
|
14448 var strLength = length ? stringSize(string) : 0; |
|
14449 return (length && strLength < length) |
|
14450 ? (createPadding(length - strLength, chars) + string) |
|
14451 : string; |
|
14452 } |
|
14453 |
|
14454 /** |
|
14455 * Converts `string` to an integer of the specified radix. If `radix` is |
|
14456 * `undefined` or `0`, a `radix` of `10` is used unless `value` is a |
|
14457 * hexadecimal, in which case a `radix` of `16` is used. |
|
14458 * |
|
14459 * **Note:** This method aligns with the |
|
14460 * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. |
|
14461 * |
|
14462 * @static |
|
14463 * @memberOf _ |
|
14464 * @since 1.1.0 |
|
14465 * @category String |
|
14466 * @param {string} string The string to convert. |
|
14467 * @param {number} [radix=10] The radix to interpret `value` by. |
|
14468 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
14469 * @returns {number} Returns the converted integer. |
|
14470 * @example |
|
14471 * |
|
14472 * _.parseInt('08'); |
|
14473 * // => 8 |
|
14474 * |
|
14475 * _.map(['6', '08', '10'], _.parseInt); |
|
14476 * // => [6, 8, 10] |
|
14477 */ |
|
14478 function parseInt(string, radix, guard) { |
|
14479 if (guard || radix == null) { |
|
14480 radix = 0; |
|
14481 } else if (radix) { |
|
14482 radix = +radix; |
|
14483 } |
|
14484 return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); |
|
14485 } |
|
14486 |
|
14487 /** |
|
14488 * Repeats the given string `n` times. |
|
14489 * |
|
14490 * @static |
|
14491 * @memberOf _ |
|
14492 * @since 3.0.0 |
|
14493 * @category String |
|
14494 * @param {string} [string=''] The string to repeat. |
|
14495 * @param {number} [n=1] The number of times to repeat the string. |
|
14496 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
14497 * @returns {string} Returns the repeated string. |
|
14498 * @example |
|
14499 * |
|
14500 * _.repeat('*', 3); |
|
14501 * // => '***' |
|
14502 * |
|
14503 * _.repeat('abc', 2); |
|
14504 * // => 'abcabc' |
|
14505 * |
|
14506 * _.repeat('abc', 0); |
|
14507 * // => '' |
|
14508 */ |
|
14509 function repeat(string, n, guard) { |
|
14510 if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { |
|
14511 n = 1; |
|
14512 } else { |
|
14513 n = toInteger(n); |
|
14514 } |
|
14515 return baseRepeat(toString(string), n); |
|
14516 } |
|
14517 |
|
14518 /** |
|
14519 * Replaces matches for `pattern` in `string` with `replacement`. |
|
14520 * |
|
14521 * **Note:** This method is based on |
|
14522 * [`String#replace`](https://mdn.io/String/replace). |
|
14523 * |
|
14524 * @static |
|
14525 * @memberOf _ |
|
14526 * @since 4.0.0 |
|
14527 * @category String |
|
14528 * @param {string} [string=''] The string to modify. |
|
14529 * @param {RegExp|string} pattern The pattern to replace. |
|
14530 * @param {Function|string} replacement The match replacement. |
|
14531 * @returns {string} Returns the modified string. |
|
14532 * @example |
|
14533 * |
|
14534 * _.replace('Hi Fred', 'Fred', 'Barney'); |
|
14535 * // => 'Hi Barney' |
|
14536 */ |
|
14537 function replace() { |
|
14538 var args = arguments, |
|
14539 string = toString(args[0]); |
|
14540 |
|
14541 return args.length < 3 ? string : string.replace(args[1], args[2]); |
|
14542 } |
|
14543 |
|
14544 /** |
|
14545 * Converts `string` to |
|
14546 * [snake case](https://en.wikipedia.org/wiki/Snake_case). |
|
14547 * |
|
14548 * @static |
|
14549 * @memberOf _ |
|
14550 * @since 3.0.0 |
|
14551 * @category String |
|
14552 * @param {string} [string=''] The string to convert. |
|
14553 * @returns {string} Returns the snake cased string. |
|
14554 * @example |
|
14555 * |
|
14556 * _.snakeCase('Foo Bar'); |
|
14557 * // => 'foo_bar' |
|
14558 * |
|
14559 * _.snakeCase('fooBar'); |
|
14560 * // => 'foo_bar' |
|
14561 * |
|
14562 * _.snakeCase('--FOO-BAR--'); |
|
14563 * // => 'foo_bar' |
|
14564 */ |
|
14565 var snakeCase = createCompounder(function(result, word, index) { |
|
14566 return result + (index ? '_' : '') + word.toLowerCase(); |
|
14567 }); |
|
14568 |
|
14569 /** |
|
14570 * Splits `string` by `separator`. |
|
14571 * |
|
14572 * **Note:** This method is based on |
|
14573 * [`String#split`](https://mdn.io/String/split). |
|
14574 * |
|
14575 * @static |
|
14576 * @memberOf _ |
|
14577 * @since 4.0.0 |
|
14578 * @category String |
|
14579 * @param {string} [string=''] The string to split. |
|
14580 * @param {RegExp|string} separator The separator pattern to split by. |
|
14581 * @param {number} [limit] The length to truncate results to. |
|
14582 * @returns {Array} Returns the string segments. |
|
14583 * @example |
|
14584 * |
|
14585 * _.split('a-b-c', '-', 2); |
|
14586 * // => ['a', 'b'] |
|
14587 */ |
|
14588 function split(string, separator, limit) { |
|
14589 if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { |
|
14590 separator = limit = undefined; |
|
14591 } |
|
14592 limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; |
|
14593 if (!limit) { |
|
14594 return []; |
|
14595 } |
|
14596 string = toString(string); |
|
14597 if (string && ( |
|
14598 typeof separator == 'string' || |
|
14599 (separator != null && !isRegExp(separator)) |
|
14600 )) { |
|
14601 separator = baseToString(separator); |
|
14602 if (!separator && hasUnicode(string)) { |
|
14603 return castSlice(stringToArray(string), 0, limit); |
|
14604 } |
|
14605 } |
|
14606 return string.split(separator, limit); |
|
14607 } |
|
14608 |
|
14609 /** |
|
14610 * Converts `string` to |
|
14611 * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). |
|
14612 * |
|
14613 * @static |
|
14614 * @memberOf _ |
|
14615 * @since 3.1.0 |
|
14616 * @category String |
|
14617 * @param {string} [string=''] The string to convert. |
|
14618 * @returns {string} Returns the start cased string. |
|
14619 * @example |
|
14620 * |
|
14621 * _.startCase('--foo-bar--'); |
|
14622 * // => 'Foo Bar' |
|
14623 * |
|
14624 * _.startCase('fooBar'); |
|
14625 * // => 'Foo Bar' |
|
14626 * |
|
14627 * _.startCase('__FOO_BAR__'); |
|
14628 * // => 'FOO BAR' |
|
14629 */ |
|
14630 var startCase = createCompounder(function(result, word, index) { |
|
14631 return result + (index ? ' ' : '') + upperFirst(word); |
|
14632 }); |
|
14633 |
|
14634 /** |
|
14635 * Checks if `string` starts with the given target string. |
|
14636 * |
|
14637 * @static |
|
14638 * @memberOf _ |
|
14639 * @since 3.0.0 |
|
14640 * @category String |
|
14641 * @param {string} [string=''] The string to inspect. |
|
14642 * @param {string} [target] The string to search for. |
|
14643 * @param {number} [position=0] The position to search from. |
|
14644 * @returns {boolean} Returns `true` if `string` starts with `target`, |
|
14645 * else `false`. |
|
14646 * @example |
|
14647 * |
|
14648 * _.startsWith('abc', 'a'); |
|
14649 * // => true |
|
14650 * |
|
14651 * _.startsWith('abc', 'b'); |
|
14652 * // => false |
|
14653 * |
|
14654 * _.startsWith('abc', 'b', 1); |
|
14655 * // => true |
|
14656 */ |
|
14657 function startsWith(string, target, position) { |
|
14658 string = toString(string); |
|
14659 position = position == null |
|
14660 ? 0 |
|
14661 : baseClamp(toInteger(position), 0, string.length); |
|
14662 |
|
14663 target = baseToString(target); |
|
14664 return string.slice(position, position + target.length) == target; |
|
14665 } |
|
14666 |
|
14667 /** |
|
14668 * Creates a compiled template function that can interpolate data properties |
|
14669 * in "interpolate" delimiters, HTML-escape interpolated data properties in |
|
14670 * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data |
|
14671 * properties may be accessed as free variables in the template. If a setting |
|
14672 * object is given, it takes precedence over `_.templateSettings` values. |
|
14673 * |
|
14674 * **Note:** In the development build `_.template` utilizes |
|
14675 * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) |
|
14676 * for easier debugging. |
|
14677 * |
|
14678 * For more information on precompiling templates see |
|
14679 * [lodash's custom builds documentation](https://lodash.com/custom-builds). |
|
14680 * |
|
14681 * For more information on Chrome extension sandboxes see |
|
14682 * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). |
|
14683 * |
|
14684 * @static |
|
14685 * @since 0.1.0 |
|
14686 * @memberOf _ |
|
14687 * @category String |
|
14688 * @param {string} [string=''] The template string. |
|
14689 * @param {Object} [options={}] The options object. |
|
14690 * @param {RegExp} [options.escape=_.templateSettings.escape] |
|
14691 * The HTML "escape" delimiter. |
|
14692 * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] |
|
14693 * The "evaluate" delimiter. |
|
14694 * @param {Object} [options.imports=_.templateSettings.imports] |
|
14695 * An object to import into the template as free variables. |
|
14696 * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] |
|
14697 * The "interpolate" delimiter. |
|
14698 * @param {string} [options.sourceURL='lodash.templateSources[n]'] |
|
14699 * The sourceURL of the compiled template. |
|
14700 * @param {string} [options.variable='obj'] |
|
14701 * The data object variable name. |
|
14702 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
14703 * @returns {Function} Returns the compiled template function. |
|
14704 * @example |
|
14705 * |
|
14706 * // Use the "interpolate" delimiter to create a compiled template. |
|
14707 * var compiled = _.template('hello <%= user %>!'); |
|
14708 * compiled({ 'user': 'fred' }); |
|
14709 * // => 'hello fred!' |
|
14710 * |
|
14711 * // Use the HTML "escape" delimiter to escape data property values. |
|
14712 * var compiled = _.template('<b><%- value %></b>'); |
|
14713 * compiled({ 'value': '<script>' }); |
|
14714 * // => '<b><script></b>' |
|
14715 * |
|
14716 * // Use the "evaluate" delimiter to execute JavaScript and generate HTML. |
|
14717 * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>'); |
|
14718 * compiled({ 'users': ['fred', 'barney'] }); |
|
14719 * // => '<li>fred</li><li>barney</li>' |
|
14720 * |
|
14721 * // Use the internal `print` function in "evaluate" delimiters. |
|
14722 * var compiled = _.template('<% print("hello " + user); %>!'); |
|
14723 * compiled({ 'user': 'barney' }); |
|
14724 * // => 'hello barney!' |
|
14725 * |
|
14726 * // Use the ES template literal delimiter as an "interpolate" delimiter. |
|
14727 * // Disable support by replacing the "interpolate" delimiter. |
|
14728 * var compiled = _.template('hello ${ user }!'); |
|
14729 * compiled({ 'user': 'pebbles' }); |
|
14730 * // => 'hello pebbles!' |
|
14731 * |
|
14732 * // Use backslashes to treat delimiters as plain text. |
|
14733 * var compiled = _.template('<%= "\\<%- value %\\>" %>'); |
|
14734 * compiled({ 'value': 'ignored' }); |
|
14735 * // => '<%- value %>' |
|
14736 * |
|
14737 * // Use the `imports` option to import `jQuery` as `jq`. |
|
14738 * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>'; |
|
14739 * var compiled = _.template(text, { 'imports': { 'jq': jQuery } }); |
|
14740 * compiled({ 'users': ['fred', 'barney'] }); |
|
14741 * // => '<li>fred</li><li>barney</li>' |
|
14742 * |
|
14743 * // Use the `sourceURL` option to specify a custom sourceURL for the template. |
|
14744 * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' }); |
|
14745 * compiled(data); |
|
14746 * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector. |
|
14747 * |
|
14748 * // Use the `variable` option to ensure a with-statement isn't used in the compiled template. |
|
14749 * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' }); |
|
14750 * compiled.source; |
|
14751 * // => function(data) { |
|
14752 * // var __t, __p = ''; |
|
14753 * // __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!'; |
|
14754 * // return __p; |
|
14755 * // } |
|
14756 * |
|
14757 * // Use custom template delimiters. |
|
14758 * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g; |
|
14759 * var compiled = _.template('hello {{ user }}!'); |
|
14760 * compiled({ 'user': 'mustache' }); |
|
14761 * // => 'hello mustache!' |
|
14762 * |
|
14763 * // Use the `source` property to inline compiled templates for meaningful |
|
14764 * // line numbers in error messages and stack traces. |
|
14765 * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\ |
|
14766 * var JST = {\ |
|
14767 * "main": ' + _.template(mainText).source + '\ |
|
14768 * };\ |
|
14769 * '); |
|
14770 */ |
|
14771 function template(string, options, guard) { |
|
14772 // Based on John Resig's `tmpl` implementation |
|
14773 // (http://ejohn.org/blog/javascript-micro-templating/) |
|
14774 // and Laura Doktorova's doT.js (https://github.com/olado/doT). |
|
14775 var settings = lodash.templateSettings; |
|
14776 |
|
14777 if (guard && isIterateeCall(string, options, guard)) { |
|
14778 options = undefined; |
|
14779 } |
|
14780 string = toString(string); |
|
14781 options = assignInWith({}, options, settings, customDefaultsAssignIn); |
|
14782 |
|
14783 var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), |
|
14784 importsKeys = keys(imports), |
|
14785 importsValues = baseValues(imports, importsKeys); |
|
14786 |
|
14787 var isEscaping, |
|
14788 isEvaluating, |
|
14789 index = 0, |
|
14790 interpolate = options.interpolate || reNoMatch, |
|
14791 source = "__p += '"; |
|
14792 |
|
14793 // Compile the regexp to match each delimiter. |
|
14794 var reDelimiters = RegExp( |
|
14795 (options.escape || reNoMatch).source + '|' + |
|
14796 interpolate.source + '|' + |
|
14797 (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' + |
|
14798 (options.evaluate || reNoMatch).source + '|$' |
|
14799 , 'g'); |
|
14800 |
|
14801 // Use a sourceURL for easier debugging. |
|
14802 var sourceURL = '//# sourceURL=' + |
|
14803 ('sourceURL' in options |
|
14804 ? options.sourceURL |
|
14805 : ('lodash.templateSources[' + (++templateCounter) + ']') |
|
14806 ) + '\n'; |
|
14807 |
|
14808 string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) { |
|
14809 interpolateValue || (interpolateValue = esTemplateValue); |
|
14810 |
|
14811 // Escape characters that can't be included in string literals. |
|
14812 source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar); |
|
14813 |
|
14814 // Replace delimiters with snippets. |
|
14815 if (escapeValue) { |
|
14816 isEscaping = true; |
|
14817 source += "' +\n__e(" + escapeValue + ") +\n'"; |
|
14818 } |
|
14819 if (evaluateValue) { |
|
14820 isEvaluating = true; |
|
14821 source += "';\n" + evaluateValue + ";\n__p += '"; |
|
14822 } |
|
14823 if (interpolateValue) { |
|
14824 source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'"; |
|
14825 } |
|
14826 index = offset + match.length; |
|
14827 |
|
14828 // The JS engine embedded in Adobe products needs `match` returned in |
|
14829 // order to produce the correct `offset` value. |
|
14830 return match; |
|
14831 }); |
|
14832 |
|
14833 source += "';\n"; |
|
14834 |
|
14835 // If `variable` is not specified wrap a with-statement around the generated |
|
14836 // code to add the data object to the top of the scope chain. |
|
14837 var variable = options.variable; |
|
14838 if (!variable) { |
|
14839 source = 'with (obj) {\n' + source + '\n}\n'; |
|
14840 } |
|
14841 // Cleanup code by stripping empty strings. |
|
14842 source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source) |
|
14843 .replace(reEmptyStringMiddle, '$1') |
|
14844 .replace(reEmptyStringTrailing, '$1;'); |
|
14845 |
|
14846 // Frame code as the function body. |
|
14847 source = 'function(' + (variable || 'obj') + ') {\n' + |
|
14848 (variable |
|
14849 ? '' |
|
14850 : 'obj || (obj = {});\n' |
|
14851 ) + |
|
14852 "var __t, __p = ''" + |
|
14853 (isEscaping |
|
14854 ? ', __e = _.escape' |
|
14855 : '' |
|
14856 ) + |
|
14857 (isEvaluating |
|
14858 ? ', __j = Array.prototype.join;\n' + |
|
14859 "function print() { __p += __j.call(arguments, '') }\n" |
|
14860 : ';\n' |
|
14861 ) + |
|
14862 source + |
|
14863 'return __p\n}'; |
|
14864 |
|
14865 var result = attempt(function() { |
|
14866 return Function(importsKeys, sourceURL + 'return ' + source) |
|
14867 .apply(undefined, importsValues); |
|
14868 }); |
|
14869 |
|
14870 // Provide the compiled function's source by its `toString` method or |
|
14871 // the `source` property as a convenience for inlining compiled templates. |
|
14872 result.source = source; |
|
14873 if (isError(result)) { |
|
14874 throw result; |
|
14875 } |
|
14876 return result; |
|
14877 } |
|
14878 |
|
14879 /** |
|
14880 * Converts `string`, as a whole, to lower case just like |
|
14881 * [String#toLowerCase](https://mdn.io/toLowerCase). |
|
14882 * |
|
14883 * @static |
|
14884 * @memberOf _ |
|
14885 * @since 4.0.0 |
|
14886 * @category String |
|
14887 * @param {string} [string=''] The string to convert. |
|
14888 * @returns {string} Returns the lower cased string. |
|
14889 * @example |
|
14890 * |
|
14891 * _.toLower('--Foo-Bar--'); |
|
14892 * // => '--foo-bar--' |
|
14893 * |
|
14894 * _.toLower('fooBar'); |
|
14895 * // => 'foobar' |
|
14896 * |
|
14897 * _.toLower('__FOO_BAR__'); |
|
14898 * // => '__foo_bar__' |
|
14899 */ |
|
14900 function toLower(value) { |
|
14901 return toString(value).toLowerCase(); |
|
14902 } |
|
14903 |
|
14904 /** |
|
14905 * Converts `string`, as a whole, to upper case just like |
|
14906 * [String#toUpperCase](https://mdn.io/toUpperCase). |
|
14907 * |
|
14908 * @static |
|
14909 * @memberOf _ |
|
14910 * @since 4.0.0 |
|
14911 * @category String |
|
14912 * @param {string} [string=''] The string to convert. |
|
14913 * @returns {string} Returns the upper cased string. |
|
14914 * @example |
|
14915 * |
|
14916 * _.toUpper('--foo-bar--'); |
|
14917 * // => '--FOO-BAR--' |
|
14918 * |
|
14919 * _.toUpper('fooBar'); |
|
14920 * // => 'FOOBAR' |
|
14921 * |
|
14922 * _.toUpper('__foo_bar__'); |
|
14923 * // => '__FOO_BAR__' |
|
14924 */ |
|
14925 function toUpper(value) { |
|
14926 return toString(value).toUpperCase(); |
|
14927 } |
|
14928 |
|
14929 /** |
|
14930 * Removes leading and trailing whitespace or specified characters from `string`. |
|
14931 * |
|
14932 * @static |
|
14933 * @memberOf _ |
|
14934 * @since 3.0.0 |
|
14935 * @category String |
|
14936 * @param {string} [string=''] The string to trim. |
|
14937 * @param {string} [chars=whitespace] The characters to trim. |
|
14938 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
14939 * @returns {string} Returns the trimmed string. |
|
14940 * @example |
|
14941 * |
|
14942 * _.trim(' abc '); |
|
14943 * // => 'abc' |
|
14944 * |
|
14945 * _.trim('-_-abc-_-', '_-'); |
|
14946 * // => 'abc' |
|
14947 * |
|
14948 * _.map([' foo ', ' bar '], _.trim); |
|
14949 * // => ['foo', 'bar'] |
|
14950 */ |
|
14951 function trim(string, chars, guard) { |
|
14952 string = toString(string); |
|
14953 if (string && (guard || chars === undefined)) { |
|
14954 return string.replace(reTrim, ''); |
|
14955 } |
|
14956 if (!string || !(chars = baseToString(chars))) { |
|
14957 return string; |
|
14958 } |
|
14959 var strSymbols = stringToArray(string), |
|
14960 chrSymbols = stringToArray(chars), |
|
14961 start = charsStartIndex(strSymbols, chrSymbols), |
|
14962 end = charsEndIndex(strSymbols, chrSymbols) + 1; |
|
14963 |
|
14964 return castSlice(strSymbols, start, end).join(''); |
|
14965 } |
|
14966 |
|
14967 /** |
|
14968 * Removes trailing whitespace or specified characters from `string`. |
|
14969 * |
|
14970 * @static |
|
14971 * @memberOf _ |
|
14972 * @since 4.0.0 |
|
14973 * @category String |
|
14974 * @param {string} [string=''] The string to trim. |
|
14975 * @param {string} [chars=whitespace] The characters to trim. |
|
14976 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
14977 * @returns {string} Returns the trimmed string. |
|
14978 * @example |
|
14979 * |
|
14980 * _.trimEnd(' abc '); |
|
14981 * // => ' abc' |
|
14982 * |
|
14983 * _.trimEnd('-_-abc-_-', '_-'); |
|
14984 * // => '-_-abc' |
|
14985 */ |
|
14986 function trimEnd(string, chars, guard) { |
|
14987 string = toString(string); |
|
14988 if (string && (guard || chars === undefined)) { |
|
14989 return string.replace(reTrimEnd, ''); |
|
14990 } |
|
14991 if (!string || !(chars = baseToString(chars))) { |
|
14992 return string; |
|
14993 } |
|
14994 var strSymbols = stringToArray(string), |
|
14995 end = charsEndIndex(strSymbols, stringToArray(chars)) + 1; |
|
14996 |
|
14997 return castSlice(strSymbols, 0, end).join(''); |
|
14998 } |
|
14999 |
|
15000 /** |
|
15001 * Removes leading whitespace or specified characters from `string`. |
|
15002 * |
|
15003 * @static |
|
15004 * @memberOf _ |
|
15005 * @since 4.0.0 |
|
15006 * @category String |
|
15007 * @param {string} [string=''] The string to trim. |
|
15008 * @param {string} [chars=whitespace] The characters to trim. |
|
15009 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
15010 * @returns {string} Returns the trimmed string. |
|
15011 * @example |
|
15012 * |
|
15013 * _.trimStart(' abc '); |
|
15014 * // => 'abc ' |
|
15015 * |
|
15016 * _.trimStart('-_-abc-_-', '_-'); |
|
15017 * // => 'abc-_-' |
|
15018 */ |
|
15019 function trimStart(string, chars, guard) { |
|
15020 string = toString(string); |
|
15021 if (string && (guard || chars === undefined)) { |
|
15022 return string.replace(reTrimStart, ''); |
|
15023 } |
|
15024 if (!string || !(chars = baseToString(chars))) { |
|
15025 return string; |
|
15026 } |
|
15027 var strSymbols = stringToArray(string), |
|
15028 start = charsStartIndex(strSymbols, stringToArray(chars)); |
|
15029 |
|
15030 return castSlice(strSymbols, start).join(''); |
|
15031 } |
|
15032 |
|
15033 /** |
|
15034 * Truncates `string` if it's longer than the given maximum string length. |
|
15035 * The last characters of the truncated string are replaced with the omission |
|
15036 * string which defaults to "...". |
|
15037 * |
|
15038 * @static |
|
15039 * @memberOf _ |
|
15040 * @since 4.0.0 |
|
15041 * @category String |
|
15042 * @param {string} [string=''] The string to truncate. |
|
15043 * @param {Object} [options={}] The options object. |
|
15044 * @param {number} [options.length=30] The maximum string length. |
|
15045 * @param {string} [options.omission='...'] The string to indicate text is omitted. |
|
15046 * @param {RegExp|string} [options.separator] The separator pattern to truncate to. |
|
15047 * @returns {string} Returns the truncated string. |
|
15048 * @example |
|
15049 * |
|
15050 * _.truncate('hi-diddly-ho there, neighborino'); |
|
15051 * // => 'hi-diddly-ho there, neighbo...' |
|
15052 * |
|
15053 * _.truncate('hi-diddly-ho there, neighborino', { |
|
15054 * 'length': 24, |
|
15055 * 'separator': ' ' |
|
15056 * }); |
|
15057 * // => 'hi-diddly-ho there,...' |
|
15058 * |
|
15059 * _.truncate('hi-diddly-ho there, neighborino', { |
|
15060 * 'length': 24, |
|
15061 * 'separator': /,? +/ |
|
15062 * }); |
|
15063 * // => 'hi-diddly-ho there...' |
|
15064 * |
|
15065 * _.truncate('hi-diddly-ho there, neighborino', { |
|
15066 * 'omission': ' [...]' |
|
15067 * }); |
|
15068 * // => 'hi-diddly-ho there, neig [...]' |
|
15069 */ |
|
15070 function truncate(string, options) { |
|
15071 var length = DEFAULT_TRUNC_LENGTH, |
|
15072 omission = DEFAULT_TRUNC_OMISSION; |
|
15073 |
|
15074 if (isObject(options)) { |
|
15075 var separator = 'separator' in options ? options.separator : separator; |
|
15076 length = 'length' in options ? toInteger(options.length) : length; |
|
15077 omission = 'omission' in options ? baseToString(options.omission) : omission; |
|
15078 } |
|
15079 string = toString(string); |
|
15080 |
|
15081 var strLength = string.length; |
|
15082 if (hasUnicode(string)) { |
|
15083 var strSymbols = stringToArray(string); |
|
15084 strLength = strSymbols.length; |
|
15085 } |
|
15086 if (length >= strLength) { |
|
15087 return string; |
|
15088 } |
|
15089 var end = length - stringSize(omission); |
|
15090 if (end < 1) { |
|
15091 return omission; |
|
15092 } |
|
15093 var result = strSymbols |
|
15094 ? castSlice(strSymbols, 0, end).join('') |
|
15095 : string.slice(0, end); |
|
15096 |
|
15097 if (separator === undefined) { |
|
15098 return result + omission; |
|
15099 } |
|
15100 if (strSymbols) { |
|
15101 end += (result.length - end); |
|
15102 } |
|
15103 if (isRegExp(separator)) { |
|
15104 if (string.slice(end).search(separator)) { |
|
15105 var match, |
|
15106 substring = result; |
|
15107 |
|
15108 if (!separator.global) { |
|
15109 separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g'); |
|
15110 } |
|
15111 separator.lastIndex = 0; |
|
15112 while ((match = separator.exec(substring))) { |
|
15113 var newEnd = match.index; |
|
15114 } |
|
15115 result = result.slice(0, newEnd === undefined ? end : newEnd); |
|
15116 } |
|
15117 } else if (string.indexOf(baseToString(separator), end) != end) { |
|
15118 var index = result.lastIndexOf(separator); |
|
15119 if (index > -1) { |
|
15120 result = result.slice(0, index); |
|
15121 } |
|
15122 } |
|
15123 return result + omission; |
|
15124 } |
|
15125 |
|
15126 /** |
|
15127 * The inverse of `_.escape`; this method converts the HTML entities |
|
15128 * `&`, `<`, `>`, `"`, and `'` in `string` to |
|
15129 * their corresponding characters. |
|
15130 * |
|
15131 * **Note:** No other HTML entities are unescaped. To unescape additional |
|
15132 * HTML entities use a third-party library like [_he_](https://mths.be/he). |
|
15133 * |
|
15134 * @static |
|
15135 * @memberOf _ |
|
15136 * @since 0.6.0 |
|
15137 * @category String |
|
15138 * @param {string} [string=''] The string to unescape. |
|
15139 * @returns {string} Returns the unescaped string. |
|
15140 * @example |
|
15141 * |
|
15142 * _.unescape('fred, barney, & pebbles'); |
|
15143 * // => 'fred, barney, & pebbles' |
|
15144 */ |
|
15145 function unescape(string) { |
|
15146 string = toString(string); |
|
15147 return (string && reHasEscapedHtml.test(string)) |
|
15148 ? string.replace(reEscapedHtml, unescapeHtmlChar) |
|
15149 : string; |
|
15150 } |
|
15151 |
|
15152 /** |
|
15153 * Converts `string`, as space separated words, to upper case. |
|
15154 * |
|
15155 * @static |
|
15156 * @memberOf _ |
|
15157 * @since 4.0.0 |
|
15158 * @category String |
|
15159 * @param {string} [string=''] The string to convert. |
|
15160 * @returns {string} Returns the upper cased string. |
|
15161 * @example |
|
15162 * |
|
15163 * _.upperCase('--foo-bar'); |
|
15164 * // => 'FOO BAR' |
|
15165 * |
|
15166 * _.upperCase('fooBar'); |
|
15167 * // => 'FOO BAR' |
|
15168 * |
|
15169 * _.upperCase('__foo_bar__'); |
|
15170 * // => 'FOO BAR' |
|
15171 */ |
|
15172 var upperCase = createCompounder(function(result, word, index) { |
|
15173 return result + (index ? ' ' : '') + word.toUpperCase(); |
|
15174 }); |
|
15175 |
|
15176 /** |
|
15177 * Converts the first character of `string` to upper case. |
|
15178 * |
|
15179 * @static |
|
15180 * @memberOf _ |
|
15181 * @since 4.0.0 |
|
15182 * @category String |
|
15183 * @param {string} [string=''] The string to convert. |
|
15184 * @returns {string} Returns the converted string. |
|
15185 * @example |
|
15186 * |
|
15187 * _.upperFirst('fred'); |
|
15188 * // => 'Fred' |
|
15189 * |
|
15190 * _.upperFirst('FRED'); |
|
15191 * // => 'FRED' |
|
15192 */ |
|
15193 var upperFirst = createCaseFirst('toUpperCase'); |
|
15194 |
|
15195 /** |
|
15196 * Splits `string` into an array of its words. |
|
15197 * |
|
15198 * @static |
|
15199 * @memberOf _ |
|
15200 * @since 3.0.0 |
|
15201 * @category String |
|
15202 * @param {string} [string=''] The string to inspect. |
|
15203 * @param {RegExp|string} [pattern] The pattern to match words. |
|
15204 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. |
|
15205 * @returns {Array} Returns the words of `string`. |
|
15206 * @example |
|
15207 * |
|
15208 * _.words('fred, barney, & pebbles'); |
|
15209 * // => ['fred', 'barney', 'pebbles'] |
|
15210 * |
|
15211 * _.words('fred, barney, & pebbles', /[^, ]+/g); |
|
15212 * // => ['fred', 'barney', '&', 'pebbles'] |
|
15213 */ |
|
15214 function words(string, pattern, guard) { |
|
15215 string = toString(string); |
|
15216 pattern = guard ? undefined : pattern; |
|
15217 |
|
15218 if (pattern === undefined) { |
|
15219 return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); |
|
15220 } |
|
15221 return string.match(pattern) || []; |
|
15222 } |
|
15223 |
|
15224 /*------------------------------------------------------------------------*/ |
|
15225 |
|
15226 /** |
|
15227 * Attempts to invoke `func`, returning either the result or the caught error |
|
15228 * object. Any additional arguments are provided to `func` when it's invoked. |
|
15229 * |
|
15230 * @static |
|
15231 * @memberOf _ |
|
15232 * @since 3.0.0 |
|
15233 * @category Util |
|
15234 * @param {Function} func The function to attempt. |
|
15235 * @param {...*} [args] The arguments to invoke `func` with. |
|
15236 * @returns {*} Returns the `func` result or error object. |
|
15237 * @example |
|
15238 * |
|
15239 * // Avoid throwing errors for invalid selectors. |
|
15240 * var elements = _.attempt(function(selector) { |
|
15241 * return document.querySelectorAll(selector); |
|
15242 * }, '>_>'); |
|
15243 * |
|
15244 * if (_.isError(elements)) { |
|
15245 * elements = []; |
|
15246 * } |
|
15247 */ |
|
15248 var attempt = baseRest(function(func, args) { |
|
15249 try { |
|
15250 return apply(func, undefined, args); |
|
15251 } catch (e) { |
|
15252 return isError(e) ? e : new Error(e); |
|
15253 } |
|
15254 }); |
|
15255 |
|
15256 /** |
|
15257 * Binds methods of an object to the object itself, overwriting the existing |
|
15258 * method. |
|
15259 * |
|
15260 * **Note:** This method doesn't set the "length" property of bound functions. |
|
15261 * |
|
15262 * @static |
|
15263 * @since 0.1.0 |
|
15264 * @memberOf _ |
|
15265 * @category Util |
|
15266 * @param {Object} object The object to bind and assign the bound methods to. |
|
15267 * @param {...(string|string[])} methodNames The object method names to bind. |
|
15268 * @returns {Object} Returns `object`. |
|
15269 * @example |
|
15270 * |
|
15271 * var view = { |
|
15272 * 'label': 'docs', |
|
15273 * 'click': function() { |
|
15274 * console.log('clicked ' + this.label); |
|
15275 * } |
|
15276 * }; |
|
15277 * |
|
15278 * _.bindAll(view, ['click']); |
|
15279 * jQuery(element).on('click', view.click); |
|
15280 * // => Logs 'clicked docs' when clicked. |
|
15281 */ |
|
15282 var bindAll = flatRest(function(object, methodNames) { |
|
15283 arrayEach(methodNames, function(key) { |
|
15284 key = toKey(key); |
|
15285 baseAssignValue(object, key, bind(object[key], object)); |
|
15286 }); |
|
15287 return object; |
|
15288 }); |
|
15289 |
|
15290 /** |
|
15291 * Creates a function that iterates over `pairs` and invokes the corresponding |
|
15292 * function of the first predicate to return truthy. The predicate-function |
|
15293 * pairs are invoked with the `this` binding and arguments of the created |
|
15294 * function. |
|
15295 * |
|
15296 * @static |
|
15297 * @memberOf _ |
|
15298 * @since 4.0.0 |
|
15299 * @category Util |
|
15300 * @param {Array} pairs The predicate-function pairs. |
|
15301 * @returns {Function} Returns the new composite function. |
|
15302 * @example |
|
15303 * |
|
15304 * var func = _.cond([ |
|
15305 * [_.matches({ 'a': 1 }), _.constant('matches A')], |
|
15306 * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')], |
|
15307 * [_.stubTrue, _.constant('no match')] |
|
15308 * ]); |
|
15309 * |
|
15310 * func({ 'a': 1, 'b': 2 }); |
|
15311 * // => 'matches A' |
|
15312 * |
|
15313 * func({ 'a': 0, 'b': 1 }); |
|
15314 * // => 'matches B' |
|
15315 * |
|
15316 * func({ 'a': '1', 'b': '2' }); |
|
15317 * // => 'no match' |
|
15318 */ |
|
15319 function cond(pairs) { |
|
15320 var length = pairs == null ? 0 : pairs.length, |
|
15321 toIteratee = getIteratee(); |
|
15322 |
|
15323 pairs = !length ? [] : arrayMap(pairs, function(pair) { |
|
15324 if (typeof pair[1] != 'function') { |
|
15325 throw new TypeError(FUNC_ERROR_TEXT); |
|
15326 } |
|
15327 return [toIteratee(pair[0]), pair[1]]; |
|
15328 }); |
|
15329 |
|
15330 return baseRest(function(args) { |
|
15331 var index = -1; |
|
15332 while (++index < length) { |
|
15333 var pair = pairs[index]; |
|
15334 if (apply(pair[0], this, args)) { |
|
15335 return apply(pair[1], this, args); |
|
15336 } |
|
15337 } |
|
15338 }); |
|
15339 } |
|
15340 |
|
15341 /** |
|
15342 * Creates a function that invokes the predicate properties of `source` with |
|
15343 * the corresponding property values of a given object, returning `true` if |
|
15344 * all predicates return truthy, else `false`. |
|
15345 * |
|
15346 * **Note:** The created function is equivalent to `_.conformsTo` with |
|
15347 * `source` partially applied. |
|
15348 * |
|
15349 * @static |
|
15350 * @memberOf _ |
|
15351 * @since 4.0.0 |
|
15352 * @category Util |
|
15353 * @param {Object} source The object of property predicates to conform to. |
|
15354 * @returns {Function} Returns the new spec function. |
|
15355 * @example |
|
15356 * |
|
15357 * var objects = [ |
|
15358 * { 'a': 2, 'b': 1 }, |
|
15359 * { 'a': 1, 'b': 2 } |
|
15360 * ]; |
|
15361 * |
|
15362 * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } })); |
|
15363 * // => [{ 'a': 1, 'b': 2 }] |
|
15364 */ |
|
15365 function conforms(source) { |
|
15366 return baseConforms(baseClone(source, CLONE_DEEP_FLAG)); |
|
15367 } |
|
15368 |
|
15369 /** |
|
15370 * Creates a function that returns `value`. |
|
15371 * |
|
15372 * @static |
|
15373 * @memberOf _ |
|
15374 * @since 2.4.0 |
|
15375 * @category Util |
|
15376 * @param {*} value The value to return from the new function. |
|
15377 * @returns {Function} Returns the new constant function. |
|
15378 * @example |
|
15379 * |
|
15380 * var objects = _.times(2, _.constant({ 'a': 1 })); |
|
15381 * |
|
15382 * console.log(objects); |
|
15383 * // => [{ 'a': 1 }, { 'a': 1 }] |
|
15384 * |
|
15385 * console.log(objects[0] === objects[1]); |
|
15386 * // => true |
|
15387 */ |
|
15388 function constant(value) { |
|
15389 return function() { |
|
15390 return value; |
|
15391 }; |
|
15392 } |
|
15393 |
|
15394 /** |
|
15395 * Checks `value` to determine whether a default value should be returned in |
|
15396 * its place. The `defaultValue` is returned if `value` is `NaN`, `null`, |
|
15397 * or `undefined`. |
|
15398 * |
|
15399 * @static |
|
15400 * @memberOf _ |
|
15401 * @since 4.14.0 |
|
15402 * @category Util |
|
15403 * @param {*} value The value to check. |
|
15404 * @param {*} defaultValue The default value. |
|
15405 * @returns {*} Returns the resolved value. |
|
15406 * @example |
|
15407 * |
|
15408 * _.defaultTo(1, 10); |
|
15409 * // => 1 |
|
15410 * |
|
15411 * _.defaultTo(undefined, 10); |
|
15412 * // => 10 |
|
15413 */ |
|
15414 function defaultTo(value, defaultValue) { |
|
15415 return (value == null || value !== value) ? defaultValue : value; |
|
15416 } |
|
15417 |
|
15418 /** |
|
15419 * Creates a function that returns the result of invoking the given functions |
|
15420 * with the `this` binding of the created function, where each successive |
|
15421 * invocation is supplied the return value of the previous. |
|
15422 * |
|
15423 * @static |
|
15424 * @memberOf _ |
|
15425 * @since 3.0.0 |
|
15426 * @category Util |
|
15427 * @param {...(Function|Function[])} [funcs] The functions to invoke. |
|
15428 * @returns {Function} Returns the new composite function. |
|
15429 * @see _.flowRight |
|
15430 * @example |
|
15431 * |
|
15432 * function square(n) { |
|
15433 * return n * n; |
|
15434 * } |
|
15435 * |
|
15436 * var addSquare = _.flow([_.add, square]); |
|
15437 * addSquare(1, 2); |
|
15438 * // => 9 |
|
15439 */ |
|
15440 var flow = createFlow(); |
|
15441 |
|
15442 /** |
|
15443 * This method is like `_.flow` except that it creates a function that |
|
15444 * invokes the given functions from right to left. |
|
15445 * |
|
15446 * @static |
|
15447 * @since 3.0.0 |
|
15448 * @memberOf _ |
|
15449 * @category Util |
|
15450 * @param {...(Function|Function[])} [funcs] The functions to invoke. |
|
15451 * @returns {Function} Returns the new composite function. |
|
15452 * @see _.flow |
|
15453 * @example |
|
15454 * |
|
15455 * function square(n) { |
|
15456 * return n * n; |
|
15457 * } |
|
15458 * |
|
15459 * var addSquare = _.flowRight([square, _.add]); |
|
15460 * addSquare(1, 2); |
|
15461 * // => 9 |
|
15462 */ |
|
15463 var flowRight = createFlow(true); |
|
15464 |
|
15465 /** |
|
15466 * This method returns the first argument it receives. |
|
15467 * |
|
15468 * @static |
|
15469 * @since 0.1.0 |
|
15470 * @memberOf _ |
|
15471 * @category Util |
|
15472 * @param {*} value Any value. |
|
15473 * @returns {*} Returns `value`. |
|
15474 * @example |
|
15475 * |
|
15476 * var object = { 'a': 1 }; |
|
15477 * |
|
15478 * console.log(_.identity(object) === object); |
|
15479 * // => true |
|
15480 */ |
|
15481 function identity(value) { |
|
15482 return value; |
|
15483 } |
|
15484 |
|
15485 /** |
|
15486 * Creates a function that invokes `func` with the arguments of the created |
|
15487 * function. If `func` is a property name, the created function returns the |
|
15488 * property value for a given element. If `func` is an array or object, the |
|
15489 * created function returns `true` for elements that contain the equivalent |
|
15490 * source properties, otherwise it returns `false`. |
|
15491 * |
|
15492 * @static |
|
15493 * @since 4.0.0 |
|
15494 * @memberOf _ |
|
15495 * @category Util |
|
15496 * @param {*} [func=_.identity] The value to convert to a callback. |
|
15497 * @returns {Function} Returns the callback. |
|
15498 * @example |
|
15499 * |
|
15500 * var users = [ |
|
15501 * { 'user': 'barney', 'age': 36, 'active': true }, |
|
15502 * { 'user': 'fred', 'age': 40, 'active': false } |
|
15503 * ]; |
|
15504 * |
|
15505 * // The `_.matches` iteratee shorthand. |
|
15506 * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true })); |
|
15507 * // => [{ 'user': 'barney', 'age': 36, 'active': true }] |
|
15508 * |
|
15509 * // The `_.matchesProperty` iteratee shorthand. |
|
15510 * _.filter(users, _.iteratee(['user', 'fred'])); |
|
15511 * // => [{ 'user': 'fred', 'age': 40 }] |
|
15512 * |
|
15513 * // The `_.property` iteratee shorthand. |
|
15514 * _.map(users, _.iteratee('user')); |
|
15515 * // => ['barney', 'fred'] |
|
15516 * |
|
15517 * // Create custom iteratee shorthands. |
|
15518 * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) { |
|
15519 * return !_.isRegExp(func) ? iteratee(func) : function(string) { |
|
15520 * return func.test(string); |
|
15521 * }; |
|
15522 * }); |
|
15523 * |
|
15524 * _.filter(['abc', 'def'], /ef/); |
|
15525 * // => ['def'] |
|
15526 */ |
|
15527 function iteratee(func) { |
|
15528 return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG)); |
|
15529 } |
|
15530 |
|
15531 /** |
|
15532 * Creates a function that performs a partial deep comparison between a given |
|
15533 * object and `source`, returning `true` if the given object has equivalent |
|
15534 * property values, else `false`. |
|
15535 * |
|
15536 * **Note:** The created function is equivalent to `_.isMatch` with `source` |
|
15537 * partially applied. |
|
15538 * |
|
15539 * Partial comparisons will match empty array and empty object `source` |
|
15540 * values against any array or object value, respectively. See `_.isEqual` |
|
15541 * for a list of supported value comparisons. |
|
15542 * |
|
15543 * @static |
|
15544 * @memberOf _ |
|
15545 * @since 3.0.0 |
|
15546 * @category Util |
|
15547 * @param {Object} source The object of property values to match. |
|
15548 * @returns {Function} Returns the new spec function. |
|
15549 * @example |
|
15550 * |
|
15551 * var objects = [ |
|
15552 * { 'a': 1, 'b': 2, 'c': 3 }, |
|
15553 * { 'a': 4, 'b': 5, 'c': 6 } |
|
15554 * ]; |
|
15555 * |
|
15556 * _.filter(objects, _.matches({ 'a': 4, 'c': 6 })); |
|
15557 * // => [{ 'a': 4, 'b': 5, 'c': 6 }] |
|
15558 */ |
|
15559 function matches(source) { |
|
15560 return baseMatches(baseClone(source, CLONE_DEEP_FLAG)); |
|
15561 } |
|
15562 |
|
15563 /** |
|
15564 * Creates a function that performs a partial deep comparison between the |
|
15565 * value at `path` of a given object to `srcValue`, returning `true` if the |
|
15566 * object value is equivalent, else `false`. |
|
15567 * |
|
15568 * **Note:** Partial comparisons will match empty array and empty object |
|
15569 * `srcValue` values against any array or object value, respectively. See |
|
15570 * `_.isEqual` for a list of supported value comparisons. |
|
15571 * |
|
15572 * @static |
|
15573 * @memberOf _ |
|
15574 * @since 3.2.0 |
|
15575 * @category Util |
|
15576 * @param {Array|string} path The path of the property to get. |
|
15577 * @param {*} srcValue The value to match. |
|
15578 * @returns {Function} Returns the new spec function. |
|
15579 * @example |
|
15580 * |
|
15581 * var objects = [ |
|
15582 * { 'a': 1, 'b': 2, 'c': 3 }, |
|
15583 * { 'a': 4, 'b': 5, 'c': 6 } |
|
15584 * ]; |
|
15585 * |
|
15586 * _.find(objects, _.matchesProperty('a', 4)); |
|
15587 * // => { 'a': 4, 'b': 5, 'c': 6 } |
|
15588 */ |
|
15589 function matchesProperty(path, srcValue) { |
|
15590 return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG)); |
|
15591 } |
|
15592 |
|
15593 /** |
|
15594 * Creates a function that invokes the method at `path` of a given object. |
|
15595 * Any additional arguments are provided to the invoked method. |
|
15596 * |
|
15597 * @static |
|
15598 * @memberOf _ |
|
15599 * @since 3.7.0 |
|
15600 * @category Util |
|
15601 * @param {Array|string} path The path of the method to invoke. |
|
15602 * @param {...*} [args] The arguments to invoke the method with. |
|
15603 * @returns {Function} Returns the new invoker function. |
|
15604 * @example |
|
15605 * |
|
15606 * var objects = [ |
|
15607 * { 'a': { 'b': _.constant(2) } }, |
|
15608 * { 'a': { 'b': _.constant(1) } } |
|
15609 * ]; |
|
15610 * |
|
15611 * _.map(objects, _.method('a.b')); |
|
15612 * // => [2, 1] |
|
15613 * |
|
15614 * _.map(objects, _.method(['a', 'b'])); |
|
15615 * // => [2, 1] |
|
15616 */ |
|
15617 var method = baseRest(function(path, args) { |
|
15618 return function(object) { |
|
15619 return baseInvoke(object, path, args); |
|
15620 }; |
|
15621 }); |
|
15622 |
|
15623 /** |
|
15624 * The opposite of `_.method`; this method creates a function that invokes |
|
15625 * the method at a given path of `object`. Any additional arguments are |
|
15626 * provided to the invoked method. |
|
15627 * |
|
15628 * @static |
|
15629 * @memberOf _ |
|
15630 * @since 3.7.0 |
|
15631 * @category Util |
|
15632 * @param {Object} object The object to query. |
|
15633 * @param {...*} [args] The arguments to invoke the method with. |
|
15634 * @returns {Function} Returns the new invoker function. |
|
15635 * @example |
|
15636 * |
|
15637 * var array = _.times(3, _.constant), |
|
15638 * object = { 'a': array, 'b': array, 'c': array }; |
|
15639 * |
|
15640 * _.map(['a[2]', 'c[0]'], _.methodOf(object)); |
|
15641 * // => [2, 0] |
|
15642 * |
|
15643 * _.map([['a', '2'], ['c', '0']], _.methodOf(object)); |
|
15644 * // => [2, 0] |
|
15645 */ |
|
15646 var methodOf = baseRest(function(object, args) { |
|
15647 return function(path) { |
|
15648 return baseInvoke(object, path, args); |
|
15649 }; |
|
15650 }); |
|
15651 |
|
15652 /** |
|
15653 * Adds all own enumerable string keyed function properties of a source |
|
15654 * object to the destination object. If `object` is a function, then methods |
|
15655 * are added to its prototype as well. |
|
15656 * |
|
15657 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to |
|
15658 * avoid conflicts caused by modifying the original. |
|
15659 * |
|
15660 * @static |
|
15661 * @since 0.1.0 |
|
15662 * @memberOf _ |
|
15663 * @category Util |
|
15664 * @param {Function|Object} [object=lodash] The destination object. |
|
15665 * @param {Object} source The object of functions to add. |
|
15666 * @param {Object} [options={}] The options object. |
|
15667 * @param {boolean} [options.chain=true] Specify whether mixins are chainable. |
|
15668 * @returns {Function|Object} Returns `object`. |
|
15669 * @example |
|
15670 * |
|
15671 * function vowels(string) { |
|
15672 * return _.filter(string, function(v) { |
|
15673 * return /[aeiou]/i.test(v); |
|
15674 * }); |
|
15675 * } |
|
15676 * |
|
15677 * _.mixin({ 'vowels': vowels }); |
|
15678 * _.vowels('fred'); |
|
15679 * // => ['e'] |
|
15680 * |
|
15681 * _('fred').vowels().value(); |
|
15682 * // => ['e'] |
|
15683 * |
|
15684 * _.mixin({ 'vowels': vowels }, { 'chain': false }); |
|
15685 * _('fred').vowels(); |
|
15686 * // => ['e'] |
|
15687 */ |
|
15688 function mixin(object, source, options) { |
|
15689 var props = keys(source), |
|
15690 methodNames = baseFunctions(source, props); |
|
15691 |
|
15692 if (options == null && |
|
15693 !(isObject(source) && (methodNames.length || !props.length))) { |
|
15694 options = source; |
|
15695 source = object; |
|
15696 object = this; |
|
15697 methodNames = baseFunctions(source, keys(source)); |
|
15698 } |
|
15699 var chain = !(isObject(options) && 'chain' in options) || !!options.chain, |
|
15700 isFunc = isFunction(object); |
|
15701 |
|
15702 arrayEach(methodNames, function(methodName) { |
|
15703 var func = source[methodName]; |
|
15704 object[methodName] = func; |
|
15705 if (isFunc) { |
|
15706 object.prototype[methodName] = function() { |
|
15707 var chainAll = this.__chain__; |
|
15708 if (chain || chainAll) { |
|
15709 var result = object(this.__wrapped__), |
|
15710 actions = result.__actions__ = copyArray(this.__actions__); |
|
15711 |
|
15712 actions.push({ 'func': func, 'args': arguments, 'thisArg': object }); |
|
15713 result.__chain__ = chainAll; |
|
15714 return result; |
|
15715 } |
|
15716 return func.apply(object, arrayPush([this.value()], arguments)); |
|
15717 }; |
|
15718 } |
|
15719 }); |
|
15720 |
|
15721 return object; |
|
15722 } |
|
15723 |
|
15724 /** |
|
15725 * Reverts the `_` variable to its previous value and returns a reference to |
|
15726 * the `lodash` function. |
|
15727 * |
|
15728 * @static |
|
15729 * @since 0.1.0 |
|
15730 * @memberOf _ |
|
15731 * @category Util |
|
15732 * @returns {Function} Returns the `lodash` function. |
|
15733 * @example |
|
15734 * |
|
15735 * var lodash = _.noConflict(); |
|
15736 */ |
|
15737 function noConflict() { |
|
15738 if (root._ === this) { |
|
15739 root._ = oldDash; |
|
15740 } |
|
15741 return this; |
|
15742 } |
|
15743 |
|
15744 /** |
|
15745 * This method returns `undefined`. |
|
15746 * |
|
15747 * @static |
|
15748 * @memberOf _ |
|
15749 * @since 2.3.0 |
|
15750 * @category Util |
|
15751 * @example |
|
15752 * |
|
15753 * _.times(2, _.noop); |
|
15754 * // => [undefined, undefined] |
|
15755 */ |
|
15756 function noop() { |
|
15757 // No operation performed. |
|
15758 } |
|
15759 |
|
15760 /** |
|
15761 * Creates a function that gets the argument at index `n`. If `n` is negative, |
|
15762 * the nth argument from the end is returned. |
|
15763 * |
|
15764 * @static |
|
15765 * @memberOf _ |
|
15766 * @since 4.0.0 |
|
15767 * @category Util |
|
15768 * @param {number} [n=0] The index of the argument to return. |
|
15769 * @returns {Function} Returns the new pass-thru function. |
|
15770 * @example |
|
15771 * |
|
15772 * var func = _.nthArg(1); |
|
15773 * func('a', 'b', 'c', 'd'); |
|
15774 * // => 'b' |
|
15775 * |
|
15776 * var func = _.nthArg(-2); |
|
15777 * func('a', 'b', 'c', 'd'); |
|
15778 * // => 'c' |
|
15779 */ |
|
15780 function nthArg(n) { |
|
15781 n = toInteger(n); |
|
15782 return baseRest(function(args) { |
|
15783 return baseNth(args, n); |
|
15784 }); |
|
15785 } |
|
15786 |
|
15787 /** |
|
15788 * Creates a function that invokes `iteratees` with the arguments it receives |
|
15789 * and returns their results. |
|
15790 * |
|
15791 * @static |
|
15792 * @memberOf _ |
|
15793 * @since 4.0.0 |
|
15794 * @category Util |
|
15795 * @param {...(Function|Function[])} [iteratees=[_.identity]] |
|
15796 * The iteratees to invoke. |
|
15797 * @returns {Function} Returns the new function. |
|
15798 * @example |
|
15799 * |
|
15800 * var func = _.over([Math.max, Math.min]); |
|
15801 * |
|
15802 * func(1, 2, 3, 4); |
|
15803 * // => [4, 1] |
|
15804 */ |
|
15805 var over = createOver(arrayMap); |
|
15806 |
|
15807 /** |
|
15808 * Creates a function that checks if **all** of the `predicates` return |
|
15809 * truthy when invoked with the arguments it receives. |
|
15810 * |
|
15811 * @static |
|
15812 * @memberOf _ |
|
15813 * @since 4.0.0 |
|
15814 * @category Util |
|
15815 * @param {...(Function|Function[])} [predicates=[_.identity]] |
|
15816 * The predicates to check. |
|
15817 * @returns {Function} Returns the new function. |
|
15818 * @example |
|
15819 * |
|
15820 * var func = _.overEvery([Boolean, isFinite]); |
|
15821 * |
|
15822 * func('1'); |
|
15823 * // => true |
|
15824 * |
|
15825 * func(null); |
|
15826 * // => false |
|
15827 * |
|
15828 * func(NaN); |
|
15829 * // => false |
|
15830 */ |
|
15831 var overEvery = createOver(arrayEvery); |
|
15832 |
|
15833 /** |
|
15834 * Creates a function that checks if **any** of the `predicates` return |
|
15835 * truthy when invoked with the arguments it receives. |
|
15836 * |
|
15837 * @static |
|
15838 * @memberOf _ |
|
15839 * @since 4.0.0 |
|
15840 * @category Util |
|
15841 * @param {...(Function|Function[])} [predicates=[_.identity]] |
|
15842 * The predicates to check. |
|
15843 * @returns {Function} Returns the new function. |
|
15844 * @example |
|
15845 * |
|
15846 * var func = _.overSome([Boolean, isFinite]); |
|
15847 * |
|
15848 * func('1'); |
|
15849 * // => true |
|
15850 * |
|
15851 * func(null); |
|
15852 * // => true |
|
15853 * |
|
15854 * func(NaN); |
|
15855 * // => false |
|
15856 */ |
|
15857 var overSome = createOver(arraySome); |
|
15858 |
|
15859 /** |
|
15860 * Creates a function that returns the value at `path` of a given object. |
|
15861 * |
|
15862 * @static |
|
15863 * @memberOf _ |
|
15864 * @since 2.4.0 |
|
15865 * @category Util |
|
15866 * @param {Array|string} path The path of the property to get. |
|
15867 * @returns {Function} Returns the new accessor function. |
|
15868 * @example |
|
15869 * |
|
15870 * var objects = [ |
|
15871 * { 'a': { 'b': 2 } }, |
|
15872 * { 'a': { 'b': 1 } } |
|
15873 * ]; |
|
15874 * |
|
15875 * _.map(objects, _.property('a.b')); |
|
15876 * // => [2, 1] |
|
15877 * |
|
15878 * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b'); |
|
15879 * // => [1, 2] |
|
15880 */ |
|
15881 function property(path) { |
|
15882 return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path); |
|
15883 } |
|
15884 |
|
15885 /** |
|
15886 * The opposite of `_.property`; this method creates a function that returns |
|
15887 * the value at a given path of `object`. |
|
15888 * |
|
15889 * @static |
|
15890 * @memberOf _ |
|
15891 * @since 3.0.0 |
|
15892 * @category Util |
|
15893 * @param {Object} object The object to query. |
|
15894 * @returns {Function} Returns the new accessor function. |
|
15895 * @example |
|
15896 * |
|
15897 * var array = [0, 1, 2], |
|
15898 * object = { 'a': array, 'b': array, 'c': array }; |
|
15899 * |
|
15900 * _.map(['a[2]', 'c[0]'], _.propertyOf(object)); |
|
15901 * // => [2, 0] |
|
15902 * |
|
15903 * _.map([['a', '2'], ['c', '0']], _.propertyOf(object)); |
|
15904 * // => [2, 0] |
|
15905 */ |
|
15906 function propertyOf(object) { |
|
15907 return function(path) { |
|
15908 return object == null ? undefined : baseGet(object, path); |
|
15909 }; |
|
15910 } |
|
15911 |
|
15912 /** |
|
15913 * Creates an array of numbers (positive and/or negative) progressing from |
|
15914 * `start` up to, but not including, `end`. A step of `-1` is used if a negative |
|
15915 * `start` is specified without an `end` or `step`. If `end` is not specified, |
|
15916 * it's set to `start` with `start` then set to `0`. |
|
15917 * |
|
15918 * **Note:** JavaScript follows the IEEE-754 standard for resolving |
|
15919 * floating-point values which can produce unexpected results. |
|
15920 * |
|
15921 * @static |
|
15922 * @since 0.1.0 |
|
15923 * @memberOf _ |
|
15924 * @category Util |
|
15925 * @param {number} [start=0] The start of the range. |
|
15926 * @param {number} end The end of the range. |
|
15927 * @param {number} [step=1] The value to increment or decrement by. |
|
15928 * @returns {Array} Returns the range of numbers. |
|
15929 * @see _.inRange, _.rangeRight |
|
15930 * @example |
|
15931 * |
|
15932 * _.range(4); |
|
15933 * // => [0, 1, 2, 3] |
|
15934 * |
|
15935 * _.range(-4); |
|
15936 * // => [0, -1, -2, -3] |
|
15937 * |
|
15938 * _.range(1, 5); |
|
15939 * // => [1, 2, 3, 4] |
|
15940 * |
|
15941 * _.range(0, 20, 5); |
|
15942 * // => [0, 5, 10, 15] |
|
15943 * |
|
15944 * _.range(0, -4, -1); |
|
15945 * // => [0, -1, -2, -3] |
|
15946 * |
|
15947 * _.range(1, 4, 0); |
|
15948 * // => [1, 1, 1] |
|
15949 * |
|
15950 * _.range(0); |
|
15951 * // => [] |
|
15952 */ |
|
15953 var range = createRange(); |
|
15954 |
|
15955 /** |
|
15956 * This method is like `_.range` except that it populates values in |
|
15957 * descending order. |
|
15958 * |
|
15959 * @static |
|
15960 * @memberOf _ |
|
15961 * @since 4.0.0 |
|
15962 * @category Util |
|
15963 * @param {number} [start=0] The start of the range. |
|
15964 * @param {number} end The end of the range. |
|
15965 * @param {number} [step=1] The value to increment or decrement by. |
|
15966 * @returns {Array} Returns the range of numbers. |
|
15967 * @see _.inRange, _.range |
|
15968 * @example |
|
15969 * |
|
15970 * _.rangeRight(4); |
|
15971 * // => [3, 2, 1, 0] |
|
15972 * |
|
15973 * _.rangeRight(-4); |
|
15974 * // => [-3, -2, -1, 0] |
|
15975 * |
|
15976 * _.rangeRight(1, 5); |
|
15977 * // => [4, 3, 2, 1] |
|
15978 * |
|
15979 * _.rangeRight(0, 20, 5); |
|
15980 * // => [15, 10, 5, 0] |
|
15981 * |
|
15982 * _.rangeRight(0, -4, -1); |
|
15983 * // => [-3, -2, -1, 0] |
|
15984 * |
|
15985 * _.rangeRight(1, 4, 0); |
|
15986 * // => [1, 1, 1] |
|
15987 * |
|
15988 * _.rangeRight(0); |
|
15989 * // => [] |
|
15990 */ |
|
15991 var rangeRight = createRange(true); |
|
15992 |
|
15993 /** |
|
15994 * This method returns a new empty array. |
|
15995 * |
|
15996 * @static |
|
15997 * @memberOf _ |
|
15998 * @since 4.13.0 |
|
15999 * @category Util |
|
16000 * @returns {Array} Returns the new empty array. |
|
16001 * @example |
|
16002 * |
|
16003 * var arrays = _.times(2, _.stubArray); |
|
16004 * |
|
16005 * console.log(arrays); |
|
16006 * // => [[], []] |
|
16007 * |
|
16008 * console.log(arrays[0] === arrays[1]); |
|
16009 * // => false |
|
16010 */ |
|
16011 function stubArray() { |
|
16012 return []; |
|
16013 } |
|
16014 |
|
16015 /** |
|
16016 * This method returns `false`. |
|
16017 * |
|
16018 * @static |
|
16019 * @memberOf _ |
|
16020 * @since 4.13.0 |
|
16021 * @category Util |
|
16022 * @returns {boolean} Returns `false`. |
|
16023 * @example |
|
16024 * |
|
16025 * _.times(2, _.stubFalse); |
|
16026 * // => [false, false] |
|
16027 */ |
|
16028 function stubFalse() { |
|
16029 return false; |
|
16030 } |
|
16031 |
|
16032 /** |
|
16033 * This method returns a new empty object. |
|
16034 * |
|
16035 * @static |
|
16036 * @memberOf _ |
|
16037 * @since 4.13.0 |
|
16038 * @category Util |
|
16039 * @returns {Object} Returns the new empty object. |
|
16040 * @example |
|
16041 * |
|
16042 * var objects = _.times(2, _.stubObject); |
|
16043 * |
|
16044 * console.log(objects); |
|
16045 * // => [{}, {}] |
|
16046 * |
|
16047 * console.log(objects[0] === objects[1]); |
|
16048 * // => false |
|
16049 */ |
|
16050 function stubObject() { |
|
16051 return {}; |
|
16052 } |
|
16053 |
|
16054 /** |
|
16055 * This method returns an empty string. |
|
16056 * |
|
16057 * @static |
|
16058 * @memberOf _ |
|
16059 * @since 4.13.0 |
|
16060 * @category Util |
|
16061 * @returns {string} Returns the empty string. |
|
16062 * @example |
|
16063 * |
|
16064 * _.times(2, _.stubString); |
|
16065 * // => ['', ''] |
|
16066 */ |
|
16067 function stubString() { |
|
16068 return ''; |
|
16069 } |
|
16070 |
|
16071 /** |
|
16072 * This method returns `true`. |
|
16073 * |
|
16074 * @static |
|
16075 * @memberOf _ |
|
16076 * @since 4.13.0 |
|
16077 * @category Util |
|
16078 * @returns {boolean} Returns `true`. |
|
16079 * @example |
|
16080 * |
|
16081 * _.times(2, _.stubTrue); |
|
16082 * // => [true, true] |
|
16083 */ |
|
16084 function stubTrue() { |
|
16085 return true; |
|
16086 } |
|
16087 |
|
16088 /** |
|
16089 * Invokes the iteratee `n` times, returning an array of the results of |
|
16090 * each invocation. The iteratee is invoked with one argument; (index). |
|
16091 * |
|
16092 * @static |
|
16093 * @since 0.1.0 |
|
16094 * @memberOf _ |
|
16095 * @category Util |
|
16096 * @param {number} n The number of times to invoke `iteratee`. |
|
16097 * @param {Function} [iteratee=_.identity] The function invoked per iteration. |
|
16098 * @returns {Array} Returns the array of results. |
|
16099 * @example |
|
16100 * |
|
16101 * _.times(3, String); |
|
16102 * // => ['0', '1', '2'] |
|
16103 * |
|
16104 * _.times(4, _.constant(0)); |
|
16105 * // => [0, 0, 0, 0] |
|
16106 */ |
|
16107 function times(n, iteratee) { |
|
16108 n = toInteger(n); |
|
16109 if (n < 1 || n > MAX_SAFE_INTEGER) { |
|
16110 return []; |
|
16111 } |
|
16112 var index = MAX_ARRAY_LENGTH, |
|
16113 length = nativeMin(n, MAX_ARRAY_LENGTH); |
|
16114 |
|
16115 iteratee = getIteratee(iteratee); |
|
16116 n -= MAX_ARRAY_LENGTH; |
|
16117 |
|
16118 var result = baseTimes(length, iteratee); |
|
16119 while (++index < n) { |
|
16120 iteratee(index); |
|
16121 } |
|
16122 return result; |
|
16123 } |
|
16124 |
|
16125 /** |
|
16126 * Converts `value` to a property path array. |
|
16127 * |
|
16128 * @static |
|
16129 * @memberOf _ |
|
16130 * @since 4.0.0 |
|
16131 * @category Util |
|
16132 * @param {*} value The value to convert. |
|
16133 * @returns {Array} Returns the new property path array. |
|
16134 * @example |
|
16135 * |
|
16136 * _.toPath('a.b.c'); |
|
16137 * // => ['a', 'b', 'c'] |
|
16138 * |
|
16139 * _.toPath('a[0].b.c'); |
|
16140 * // => ['a', '0', 'b', 'c'] |
|
16141 */ |
|
16142 function toPath(value) { |
|
16143 if (isArray(value)) { |
|
16144 return arrayMap(value, toKey); |
|
16145 } |
|
16146 return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value))); |
|
16147 } |
|
16148 |
|
16149 /** |
|
16150 * Generates a unique ID. If `prefix` is given, the ID is appended to it. |
|
16151 * |
|
16152 * @static |
|
16153 * @since 0.1.0 |
|
16154 * @memberOf _ |
|
16155 * @category Util |
|
16156 * @param {string} [prefix=''] The value to prefix the ID with. |
|
16157 * @returns {string} Returns the unique ID. |
|
16158 * @example |
|
16159 * |
|
16160 * _.uniqueId('contact_'); |
|
16161 * // => 'contact_104' |
|
16162 * |
|
16163 * _.uniqueId(); |
|
16164 * // => '105' |
|
16165 */ |
|
16166 function uniqueId(prefix) { |
|
16167 var id = ++idCounter; |
|
16168 return toString(prefix) + id; |
|
16169 } |
|
16170 |
|
16171 /*------------------------------------------------------------------------*/ |
|
16172 |
|
16173 /** |
|
16174 * Adds two numbers. |
|
16175 * |
|
16176 * @static |
|
16177 * @memberOf _ |
|
16178 * @since 3.4.0 |
|
16179 * @category Math |
|
16180 * @param {number} augend The first number in an addition. |
|
16181 * @param {number} addend The second number in an addition. |
|
16182 * @returns {number} Returns the total. |
|
16183 * @example |
|
16184 * |
|
16185 * _.add(6, 4); |
|
16186 * // => 10 |
|
16187 */ |
|
16188 var add = createMathOperation(function(augend, addend) { |
|
16189 return augend + addend; |
|
16190 }, 0); |
|
16191 |
|
16192 /** |
|
16193 * Computes `number` rounded up to `precision`. |
|
16194 * |
|
16195 * @static |
|
16196 * @memberOf _ |
|
16197 * @since 3.10.0 |
|
16198 * @category Math |
|
16199 * @param {number} number The number to round up. |
|
16200 * @param {number} [precision=0] The precision to round up to. |
|
16201 * @returns {number} Returns the rounded up number. |
|
16202 * @example |
|
16203 * |
|
16204 * _.ceil(4.006); |
|
16205 * // => 5 |
|
16206 * |
|
16207 * _.ceil(6.004, 2); |
|
16208 * // => 6.01 |
|
16209 * |
|
16210 * _.ceil(6040, -2); |
|
16211 * // => 6100 |
|
16212 */ |
|
16213 var ceil = createRound('ceil'); |
|
16214 |
|
16215 /** |
|
16216 * Divide two numbers. |
|
16217 * |
|
16218 * @static |
|
16219 * @memberOf _ |
|
16220 * @since 4.7.0 |
|
16221 * @category Math |
|
16222 * @param {number} dividend The first number in a division. |
|
16223 * @param {number} divisor The second number in a division. |
|
16224 * @returns {number} Returns the quotient. |
|
16225 * @example |
|
16226 * |
|
16227 * _.divide(6, 4); |
|
16228 * // => 1.5 |
|
16229 */ |
|
16230 var divide = createMathOperation(function(dividend, divisor) { |
|
16231 return dividend / divisor; |
|
16232 }, 1); |
|
16233 |
|
16234 /** |
|
16235 * Computes `number` rounded down to `precision`. |
|
16236 * |
|
16237 * @static |
|
16238 * @memberOf _ |
|
16239 * @since 3.10.0 |
|
16240 * @category Math |
|
16241 * @param {number} number The number to round down. |
|
16242 * @param {number} [precision=0] The precision to round down to. |
|
16243 * @returns {number} Returns the rounded down number. |
|
16244 * @example |
|
16245 * |
|
16246 * _.floor(4.006); |
|
16247 * // => 4 |
|
16248 * |
|
16249 * _.floor(0.046, 2); |
|
16250 * // => 0.04 |
|
16251 * |
|
16252 * _.floor(4060, -2); |
|
16253 * // => 4000 |
|
16254 */ |
|
16255 var floor = createRound('floor'); |
|
16256 |
|
16257 /** |
|
16258 * Computes the maximum value of `array`. If `array` is empty or falsey, |
|
16259 * `undefined` is returned. |
|
16260 * |
|
16261 * @static |
|
16262 * @since 0.1.0 |
|
16263 * @memberOf _ |
|
16264 * @category Math |
|
16265 * @param {Array} array The array to iterate over. |
|
16266 * @returns {*} Returns the maximum value. |
|
16267 * @example |
|
16268 * |
|
16269 * _.max([4, 2, 8, 6]); |
|
16270 * // => 8 |
|
16271 * |
|
16272 * _.max([]); |
|
16273 * // => undefined |
|
16274 */ |
|
16275 function max(array) { |
|
16276 return (array && array.length) |
|
16277 ? baseExtremum(array, identity, baseGt) |
|
16278 : undefined; |
|
16279 } |
|
16280 |
|
16281 /** |
|
16282 * This method is like `_.max` except that it accepts `iteratee` which is |
|
16283 * invoked for each element in `array` to generate the criterion by which |
|
16284 * the value is ranked. The iteratee is invoked with one argument: (value). |
|
16285 * |
|
16286 * @static |
|
16287 * @memberOf _ |
|
16288 * @since 4.0.0 |
|
16289 * @category Math |
|
16290 * @param {Array} array The array to iterate over. |
|
16291 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
16292 * @returns {*} Returns the maximum value. |
|
16293 * @example |
|
16294 * |
|
16295 * var objects = [{ 'n': 1 }, { 'n': 2 }]; |
|
16296 * |
|
16297 * _.maxBy(objects, function(o) { return o.n; }); |
|
16298 * // => { 'n': 2 } |
|
16299 * |
|
16300 * // The `_.property` iteratee shorthand. |
|
16301 * _.maxBy(objects, 'n'); |
|
16302 * // => { 'n': 2 } |
|
16303 */ |
|
16304 function maxBy(array, iteratee) { |
|
16305 return (array && array.length) |
|
16306 ? baseExtremum(array, getIteratee(iteratee, 2), baseGt) |
|
16307 : undefined; |
|
16308 } |
|
16309 |
|
16310 /** |
|
16311 * Computes the mean of the values in `array`. |
|
16312 * |
|
16313 * @static |
|
16314 * @memberOf _ |
|
16315 * @since 4.0.0 |
|
16316 * @category Math |
|
16317 * @param {Array} array The array to iterate over. |
|
16318 * @returns {number} Returns the mean. |
|
16319 * @example |
|
16320 * |
|
16321 * _.mean([4, 2, 8, 6]); |
|
16322 * // => 5 |
|
16323 */ |
|
16324 function mean(array) { |
|
16325 return baseMean(array, identity); |
|
16326 } |
|
16327 |
|
16328 /** |
|
16329 * This method is like `_.mean` except that it accepts `iteratee` which is |
|
16330 * invoked for each element in `array` to generate the value to be averaged. |
|
16331 * The iteratee is invoked with one argument: (value). |
|
16332 * |
|
16333 * @static |
|
16334 * @memberOf _ |
|
16335 * @since 4.7.0 |
|
16336 * @category Math |
|
16337 * @param {Array} array The array to iterate over. |
|
16338 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
16339 * @returns {number} Returns the mean. |
|
16340 * @example |
|
16341 * |
|
16342 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; |
|
16343 * |
|
16344 * _.meanBy(objects, function(o) { return o.n; }); |
|
16345 * // => 5 |
|
16346 * |
|
16347 * // The `_.property` iteratee shorthand. |
|
16348 * _.meanBy(objects, 'n'); |
|
16349 * // => 5 |
|
16350 */ |
|
16351 function meanBy(array, iteratee) { |
|
16352 return baseMean(array, getIteratee(iteratee, 2)); |
|
16353 } |
|
16354 |
|
16355 /** |
|
16356 * Computes the minimum value of `array`. If `array` is empty or falsey, |
|
16357 * `undefined` is returned. |
|
16358 * |
|
16359 * @static |
|
16360 * @since 0.1.0 |
|
16361 * @memberOf _ |
|
16362 * @category Math |
|
16363 * @param {Array} array The array to iterate over. |
|
16364 * @returns {*} Returns the minimum value. |
|
16365 * @example |
|
16366 * |
|
16367 * _.min([4, 2, 8, 6]); |
|
16368 * // => 2 |
|
16369 * |
|
16370 * _.min([]); |
|
16371 * // => undefined |
|
16372 */ |
|
16373 function min(array) { |
|
16374 return (array && array.length) |
|
16375 ? baseExtremum(array, identity, baseLt) |
|
16376 : undefined; |
|
16377 } |
|
16378 |
|
16379 /** |
|
16380 * This method is like `_.min` except that it accepts `iteratee` which is |
|
16381 * invoked for each element in `array` to generate the criterion by which |
|
16382 * the value is ranked. The iteratee is invoked with one argument: (value). |
|
16383 * |
|
16384 * @static |
|
16385 * @memberOf _ |
|
16386 * @since 4.0.0 |
|
16387 * @category Math |
|
16388 * @param {Array} array The array to iterate over. |
|
16389 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
16390 * @returns {*} Returns the minimum value. |
|
16391 * @example |
|
16392 * |
|
16393 * var objects = [{ 'n': 1 }, { 'n': 2 }]; |
|
16394 * |
|
16395 * _.minBy(objects, function(o) { return o.n; }); |
|
16396 * // => { 'n': 1 } |
|
16397 * |
|
16398 * // The `_.property` iteratee shorthand. |
|
16399 * _.minBy(objects, 'n'); |
|
16400 * // => { 'n': 1 } |
|
16401 */ |
|
16402 function minBy(array, iteratee) { |
|
16403 return (array && array.length) |
|
16404 ? baseExtremum(array, getIteratee(iteratee, 2), baseLt) |
|
16405 : undefined; |
|
16406 } |
|
16407 |
|
16408 /** |
|
16409 * Multiply two numbers. |
|
16410 * |
|
16411 * @static |
|
16412 * @memberOf _ |
|
16413 * @since 4.7.0 |
|
16414 * @category Math |
|
16415 * @param {number} multiplier The first number in a multiplication. |
|
16416 * @param {number} multiplicand The second number in a multiplication. |
|
16417 * @returns {number} Returns the product. |
|
16418 * @example |
|
16419 * |
|
16420 * _.multiply(6, 4); |
|
16421 * // => 24 |
|
16422 */ |
|
16423 var multiply = createMathOperation(function(multiplier, multiplicand) { |
|
16424 return multiplier * multiplicand; |
|
16425 }, 1); |
|
16426 |
|
16427 /** |
|
16428 * Computes `number` rounded to `precision`. |
|
16429 * |
|
16430 * @static |
|
16431 * @memberOf _ |
|
16432 * @since 3.10.0 |
|
16433 * @category Math |
|
16434 * @param {number} number The number to round. |
|
16435 * @param {number} [precision=0] The precision to round to. |
|
16436 * @returns {number} Returns the rounded number. |
|
16437 * @example |
|
16438 * |
|
16439 * _.round(4.006); |
|
16440 * // => 4 |
|
16441 * |
|
16442 * _.round(4.006, 2); |
|
16443 * // => 4.01 |
|
16444 * |
|
16445 * _.round(4060, -2); |
|
16446 * // => 4100 |
|
16447 */ |
|
16448 var round = createRound('round'); |
|
16449 |
|
16450 /** |
|
16451 * Subtract two numbers. |
|
16452 * |
|
16453 * @static |
|
16454 * @memberOf _ |
|
16455 * @since 4.0.0 |
|
16456 * @category Math |
|
16457 * @param {number} minuend The first number in a subtraction. |
|
16458 * @param {number} subtrahend The second number in a subtraction. |
|
16459 * @returns {number} Returns the difference. |
|
16460 * @example |
|
16461 * |
|
16462 * _.subtract(6, 4); |
|
16463 * // => 2 |
|
16464 */ |
|
16465 var subtract = createMathOperation(function(minuend, subtrahend) { |
|
16466 return minuend - subtrahend; |
|
16467 }, 0); |
|
16468 |
|
16469 /** |
|
16470 * Computes the sum of the values in `array`. |
|
16471 * |
|
16472 * @static |
|
16473 * @memberOf _ |
|
16474 * @since 3.4.0 |
|
16475 * @category Math |
|
16476 * @param {Array} array The array to iterate over. |
|
16477 * @returns {number} Returns the sum. |
|
16478 * @example |
|
16479 * |
|
16480 * _.sum([4, 2, 8, 6]); |
|
16481 * // => 20 |
|
16482 */ |
|
16483 function sum(array) { |
|
16484 return (array && array.length) |
|
16485 ? baseSum(array, identity) |
|
16486 : 0; |
|
16487 } |
|
16488 |
|
16489 /** |
|
16490 * This method is like `_.sum` except that it accepts `iteratee` which is |
|
16491 * invoked for each element in `array` to generate the value to be summed. |
|
16492 * The iteratee is invoked with one argument: (value). |
|
16493 * |
|
16494 * @static |
|
16495 * @memberOf _ |
|
16496 * @since 4.0.0 |
|
16497 * @category Math |
|
16498 * @param {Array} array The array to iterate over. |
|
16499 * @param {Function} [iteratee=_.identity] The iteratee invoked per element. |
|
16500 * @returns {number} Returns the sum. |
|
16501 * @example |
|
16502 * |
|
16503 * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; |
|
16504 * |
|
16505 * _.sumBy(objects, function(o) { return o.n; }); |
|
16506 * // => 20 |
|
16507 * |
|
16508 * // The `_.property` iteratee shorthand. |
|
16509 * _.sumBy(objects, 'n'); |
|
16510 * // => 20 |
|
16511 */ |
|
16512 function sumBy(array, iteratee) { |
|
16513 return (array && array.length) |
|
16514 ? baseSum(array, getIteratee(iteratee, 2)) |
|
16515 : 0; |
|
16516 } |
|
16517 |
|
16518 /*------------------------------------------------------------------------*/ |
|
16519 |
|
16520 // Add methods that return wrapped values in chain sequences. |
|
16521 lodash.after = after; |
|
16522 lodash.ary = ary; |
|
16523 lodash.assign = assign; |
|
16524 lodash.assignIn = assignIn; |
|
16525 lodash.assignInWith = assignInWith; |
|
16526 lodash.assignWith = assignWith; |
|
16527 lodash.at = at; |
|
16528 lodash.before = before; |
|
16529 lodash.bind = bind; |
|
16530 lodash.bindAll = bindAll; |
|
16531 lodash.bindKey = bindKey; |
|
16532 lodash.castArray = castArray; |
|
16533 lodash.chain = chain; |
|
16534 lodash.chunk = chunk; |
|
16535 lodash.compact = compact; |
|
16536 lodash.concat = concat; |
|
16537 lodash.cond = cond; |
|
16538 lodash.conforms = conforms; |
|
16539 lodash.constant = constant; |
|
16540 lodash.countBy = countBy; |
|
16541 lodash.create = create; |
|
16542 lodash.curry = curry; |
|
16543 lodash.curryRight = curryRight; |
|
16544 lodash.debounce = debounce; |
|
16545 lodash.defaults = defaults; |
|
16546 lodash.defaultsDeep = defaultsDeep; |
|
16547 lodash.defer = defer; |
|
16548 lodash.delay = delay; |
|
16549 lodash.difference = difference; |
|
16550 lodash.differenceBy = differenceBy; |
|
16551 lodash.differenceWith = differenceWith; |
|
16552 lodash.drop = drop; |
|
16553 lodash.dropRight = dropRight; |
|
16554 lodash.dropRightWhile = dropRightWhile; |
|
16555 lodash.dropWhile = dropWhile; |
|
16556 lodash.fill = fill; |
|
16557 lodash.filter = filter; |
|
16558 lodash.flatMap = flatMap; |
|
16559 lodash.flatMapDeep = flatMapDeep; |
|
16560 lodash.flatMapDepth = flatMapDepth; |
|
16561 lodash.flatten = flatten; |
|
16562 lodash.flattenDeep = flattenDeep; |
|
16563 lodash.flattenDepth = flattenDepth; |
|
16564 lodash.flip = flip; |
|
16565 lodash.flow = flow; |
|
16566 lodash.flowRight = flowRight; |
|
16567 lodash.fromPairs = fromPairs; |
|
16568 lodash.functions = functions; |
|
16569 lodash.functionsIn = functionsIn; |
|
16570 lodash.groupBy = groupBy; |
|
16571 lodash.initial = initial; |
|
16572 lodash.intersection = intersection; |
|
16573 lodash.intersectionBy = intersectionBy; |
|
16574 lodash.intersectionWith = intersectionWith; |
|
16575 lodash.invert = invert; |
|
16576 lodash.invertBy = invertBy; |
|
16577 lodash.invokeMap = invokeMap; |
|
16578 lodash.iteratee = iteratee; |
|
16579 lodash.keyBy = keyBy; |
|
16580 lodash.keys = keys; |
|
16581 lodash.keysIn = keysIn; |
|
16582 lodash.map = map; |
|
16583 lodash.mapKeys = mapKeys; |
|
16584 lodash.mapValues = mapValues; |
|
16585 lodash.matches = matches; |
|
16586 lodash.matchesProperty = matchesProperty; |
|
16587 lodash.memoize = memoize; |
|
16588 lodash.merge = merge; |
|
16589 lodash.mergeWith = mergeWith; |
|
16590 lodash.method = method; |
|
16591 lodash.methodOf = methodOf; |
|
16592 lodash.mixin = mixin; |
|
16593 lodash.negate = negate; |
|
16594 lodash.nthArg = nthArg; |
|
16595 lodash.omit = omit; |
|
16596 lodash.omitBy = omitBy; |
|
16597 lodash.once = once; |
|
16598 lodash.orderBy = orderBy; |
|
16599 lodash.over = over; |
|
16600 lodash.overArgs = overArgs; |
|
16601 lodash.overEvery = overEvery; |
|
16602 lodash.overSome = overSome; |
|
16603 lodash.partial = partial; |
|
16604 lodash.partialRight = partialRight; |
|
16605 lodash.partition = partition; |
|
16606 lodash.pick = pick; |
|
16607 lodash.pickBy = pickBy; |
|
16608 lodash.property = property; |
|
16609 lodash.propertyOf = propertyOf; |
|
16610 lodash.pull = pull; |
|
16611 lodash.pullAll = pullAll; |
|
16612 lodash.pullAllBy = pullAllBy; |
|
16613 lodash.pullAllWith = pullAllWith; |
|
16614 lodash.pullAt = pullAt; |
|
16615 lodash.range = range; |
|
16616 lodash.rangeRight = rangeRight; |
|
16617 lodash.rearg = rearg; |
|
16618 lodash.reject = reject; |
|
16619 lodash.remove = remove; |
|
16620 lodash.rest = rest; |
|
16621 lodash.reverse = reverse; |
|
16622 lodash.sampleSize = sampleSize; |
|
16623 lodash.set = set; |
|
16624 lodash.setWith = setWith; |
|
16625 lodash.shuffle = shuffle; |
|
16626 lodash.slice = slice; |
|
16627 lodash.sortBy = sortBy; |
|
16628 lodash.sortedUniq = sortedUniq; |
|
16629 lodash.sortedUniqBy = sortedUniqBy; |
|
16630 lodash.split = split; |
|
16631 lodash.spread = spread; |
|
16632 lodash.tail = tail; |
|
16633 lodash.take = take; |
|
16634 lodash.takeRight = takeRight; |
|
16635 lodash.takeRightWhile = takeRightWhile; |
|
16636 lodash.takeWhile = takeWhile; |
|
16637 lodash.tap = tap; |
|
16638 lodash.throttle = throttle; |
|
16639 lodash.thru = thru; |
|
16640 lodash.toArray = toArray; |
|
16641 lodash.toPairs = toPairs; |
|
16642 lodash.toPairsIn = toPairsIn; |
|
16643 lodash.toPath = toPath; |
|
16644 lodash.toPlainObject = toPlainObject; |
|
16645 lodash.transform = transform; |
|
16646 lodash.unary = unary; |
|
16647 lodash.union = union; |
|
16648 lodash.unionBy = unionBy; |
|
16649 lodash.unionWith = unionWith; |
|
16650 lodash.uniq = uniq; |
|
16651 lodash.uniqBy = uniqBy; |
|
16652 lodash.uniqWith = uniqWith; |
|
16653 lodash.unset = unset; |
|
16654 lodash.unzip = unzip; |
|
16655 lodash.unzipWith = unzipWith; |
|
16656 lodash.update = update; |
|
16657 lodash.updateWith = updateWith; |
|
16658 lodash.values = values; |
|
16659 lodash.valuesIn = valuesIn; |
|
16660 lodash.without = without; |
|
16661 lodash.words = words; |
|
16662 lodash.wrap = wrap; |
|
16663 lodash.xor = xor; |
|
16664 lodash.xorBy = xorBy; |
|
16665 lodash.xorWith = xorWith; |
|
16666 lodash.zip = zip; |
|
16667 lodash.zipObject = zipObject; |
|
16668 lodash.zipObjectDeep = zipObjectDeep; |
|
16669 lodash.zipWith = zipWith; |
|
16670 |
|
16671 // Add aliases. |
|
16672 lodash.entries = toPairs; |
|
16673 lodash.entriesIn = toPairsIn; |
|
16674 lodash.extend = assignIn; |
|
16675 lodash.extendWith = assignInWith; |
|
16676 |
|
16677 // Add methods to `lodash.prototype`. |
|
16678 mixin(lodash, lodash); |
|
16679 |
|
16680 /*------------------------------------------------------------------------*/ |
|
16681 |
|
16682 // Add methods that return unwrapped values in chain sequences. |
|
16683 lodash.add = add; |
|
16684 lodash.attempt = attempt; |
|
16685 lodash.camelCase = camelCase; |
|
16686 lodash.capitalize = capitalize; |
|
16687 lodash.ceil = ceil; |
|
16688 lodash.clamp = clamp; |
|
16689 lodash.clone = clone; |
|
16690 lodash.cloneDeep = cloneDeep; |
|
16691 lodash.cloneDeepWith = cloneDeepWith; |
|
16692 lodash.cloneWith = cloneWith; |
|
16693 lodash.conformsTo = conformsTo; |
|
16694 lodash.deburr = deburr; |
|
16695 lodash.defaultTo = defaultTo; |
|
16696 lodash.divide = divide; |
|
16697 lodash.endsWith = endsWith; |
|
16698 lodash.eq = eq; |
|
16699 lodash.escape = escape; |
|
16700 lodash.escapeRegExp = escapeRegExp; |
|
16701 lodash.every = every; |
|
16702 lodash.find = find; |
|
16703 lodash.findIndex = findIndex; |
|
16704 lodash.findKey = findKey; |
|
16705 lodash.findLast = findLast; |
|
16706 lodash.findLastIndex = findLastIndex; |
|
16707 lodash.findLastKey = findLastKey; |
|
16708 lodash.floor = floor; |
|
16709 lodash.forEach = forEach; |
|
16710 lodash.forEachRight = forEachRight; |
|
16711 lodash.forIn = forIn; |
|
16712 lodash.forInRight = forInRight; |
|
16713 lodash.forOwn = forOwn; |
|
16714 lodash.forOwnRight = forOwnRight; |
|
16715 lodash.get = get; |
|
16716 lodash.gt = gt; |
|
16717 lodash.gte = gte; |
|
16718 lodash.has = has; |
|
16719 lodash.hasIn = hasIn; |
|
16720 lodash.head = head; |
|
16721 lodash.identity = identity; |
|
16722 lodash.includes = includes; |
|
16723 lodash.indexOf = indexOf; |
|
16724 lodash.inRange = inRange; |
|
16725 lodash.invoke = invoke; |
|
16726 lodash.isArguments = isArguments; |
|
16727 lodash.isArray = isArray; |
|
16728 lodash.isArrayBuffer = isArrayBuffer; |
|
16729 lodash.isArrayLike = isArrayLike; |
|
16730 lodash.isArrayLikeObject = isArrayLikeObject; |
|
16731 lodash.isBoolean = isBoolean; |
|
16732 lodash.isBuffer = isBuffer; |
|
16733 lodash.isDate = isDate; |
|
16734 lodash.isElement = isElement; |
|
16735 lodash.isEmpty = isEmpty; |
|
16736 lodash.isEqual = isEqual; |
|
16737 lodash.isEqualWith = isEqualWith; |
|
16738 lodash.isError = isError; |
|
16739 lodash.isFinite = isFinite; |
|
16740 lodash.isFunction = isFunction; |
|
16741 lodash.isInteger = isInteger; |
|
16742 lodash.isLength = isLength; |
|
16743 lodash.isMap = isMap; |
|
16744 lodash.isMatch = isMatch; |
|
16745 lodash.isMatchWith = isMatchWith; |
|
16746 lodash.isNaN = isNaN; |
|
16747 lodash.isNative = isNative; |
|
16748 lodash.isNil = isNil; |
|
16749 lodash.isNull = isNull; |
|
16750 lodash.isNumber = isNumber; |
|
16751 lodash.isObject = isObject; |
|
16752 lodash.isObjectLike = isObjectLike; |
|
16753 lodash.isPlainObject = isPlainObject; |
|
16754 lodash.isRegExp = isRegExp; |
|
16755 lodash.isSafeInteger = isSafeInteger; |
|
16756 lodash.isSet = isSet; |
|
16757 lodash.isString = isString; |
|
16758 lodash.isSymbol = isSymbol; |
|
16759 lodash.isTypedArray = isTypedArray; |
|
16760 lodash.isUndefined = isUndefined; |
|
16761 lodash.isWeakMap = isWeakMap; |
|
16762 lodash.isWeakSet = isWeakSet; |
|
16763 lodash.join = join; |
|
16764 lodash.kebabCase = kebabCase; |
|
16765 lodash.last = last; |
|
16766 lodash.lastIndexOf = lastIndexOf; |
|
16767 lodash.lowerCase = lowerCase; |
|
16768 lodash.lowerFirst = lowerFirst; |
|
16769 lodash.lt = lt; |
|
16770 lodash.lte = lte; |
|
16771 lodash.max = max; |
|
16772 lodash.maxBy = maxBy; |
|
16773 lodash.mean = mean; |
|
16774 lodash.meanBy = meanBy; |
|
16775 lodash.min = min; |
|
16776 lodash.minBy = minBy; |
|
16777 lodash.stubArray = stubArray; |
|
16778 lodash.stubFalse = stubFalse; |
|
16779 lodash.stubObject = stubObject; |
|
16780 lodash.stubString = stubString; |
|
16781 lodash.stubTrue = stubTrue; |
|
16782 lodash.multiply = multiply; |
|
16783 lodash.nth = nth; |
|
16784 lodash.noConflict = noConflict; |
|
16785 lodash.noop = noop; |
|
16786 lodash.now = now; |
|
16787 lodash.pad = pad; |
|
16788 lodash.padEnd = padEnd; |
|
16789 lodash.padStart = padStart; |
|
16790 lodash.parseInt = parseInt; |
|
16791 lodash.random = random; |
|
16792 lodash.reduce = reduce; |
|
16793 lodash.reduceRight = reduceRight; |
|
16794 lodash.repeat = repeat; |
|
16795 lodash.replace = replace; |
|
16796 lodash.result = result; |
|
16797 lodash.round = round; |
|
16798 lodash.runInContext = runInContext; |
|
16799 lodash.sample = sample; |
|
16800 lodash.size = size; |
|
16801 lodash.snakeCase = snakeCase; |
|
16802 lodash.some = some; |
|
16803 lodash.sortedIndex = sortedIndex; |
|
16804 lodash.sortedIndexBy = sortedIndexBy; |
|
16805 lodash.sortedIndexOf = sortedIndexOf; |
|
16806 lodash.sortedLastIndex = sortedLastIndex; |
|
16807 lodash.sortedLastIndexBy = sortedLastIndexBy; |
|
16808 lodash.sortedLastIndexOf = sortedLastIndexOf; |
|
16809 lodash.startCase = startCase; |
|
16810 lodash.startsWith = startsWith; |
|
16811 lodash.subtract = subtract; |
|
16812 lodash.sum = sum; |
|
16813 lodash.sumBy = sumBy; |
|
16814 lodash.template = template; |
|
16815 lodash.times = times; |
|
16816 lodash.toFinite = toFinite; |
|
16817 lodash.toInteger = toInteger; |
|
16818 lodash.toLength = toLength; |
|
16819 lodash.toLower = toLower; |
|
16820 lodash.toNumber = toNumber; |
|
16821 lodash.toSafeInteger = toSafeInteger; |
|
16822 lodash.toString = toString; |
|
16823 lodash.toUpper = toUpper; |
|
16824 lodash.trim = trim; |
|
16825 lodash.trimEnd = trimEnd; |
|
16826 lodash.trimStart = trimStart; |
|
16827 lodash.truncate = truncate; |
|
16828 lodash.unescape = unescape; |
|
16829 lodash.uniqueId = uniqueId; |
|
16830 lodash.upperCase = upperCase; |
|
16831 lodash.upperFirst = upperFirst; |
|
16832 |
|
16833 // Add aliases. |
|
16834 lodash.each = forEach; |
|
16835 lodash.eachRight = forEachRight; |
|
16836 lodash.first = head; |
|
16837 |
|
16838 mixin(lodash, (function() { |
|
16839 var source = {}; |
|
16840 baseForOwn(lodash, function(func, methodName) { |
|
16841 if (!hasOwnProperty.call(lodash.prototype, methodName)) { |
|
16842 source[methodName] = func; |
|
16843 } |
|
16844 }); |
|
16845 return source; |
|
16846 }()), { 'chain': false }); |
|
16847 |
|
16848 /*------------------------------------------------------------------------*/ |
|
16849 |
|
16850 /** |
|
16851 * The semantic version number. |
|
16852 * |
|
16853 * @static |
|
16854 * @memberOf _ |
|
16855 * @type {string} |
|
16856 */ |
|
16857 lodash.VERSION = VERSION; |
|
16858 |
|
16859 // Assign default placeholders. |
|
16860 arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) { |
|
16861 lodash[methodName].placeholder = lodash; |
|
16862 }); |
|
16863 |
|
16864 // Add `LazyWrapper` methods for `_.drop` and `_.take` variants. |
|
16865 arrayEach(['drop', 'take'], function(methodName, index) { |
|
16866 LazyWrapper.prototype[methodName] = function(n) { |
|
16867 n = n === undefined ? 1 : nativeMax(toInteger(n), 0); |
|
16868 |
|
16869 var result = (this.__filtered__ && !index) |
|
16870 ? new LazyWrapper(this) |
|
16871 : this.clone(); |
|
16872 |
|
16873 if (result.__filtered__) { |
|
16874 result.__takeCount__ = nativeMin(n, result.__takeCount__); |
|
16875 } else { |
|
16876 result.__views__.push({ |
|
16877 'size': nativeMin(n, MAX_ARRAY_LENGTH), |
|
16878 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') |
|
16879 }); |
|
16880 } |
|
16881 return result; |
|
16882 }; |
|
16883 |
|
16884 LazyWrapper.prototype[methodName + 'Right'] = function(n) { |
|
16885 return this.reverse()[methodName](n).reverse(); |
|
16886 }; |
|
16887 }); |
|
16888 |
|
16889 // Add `LazyWrapper` methods that accept an `iteratee` value. |
|
16890 arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) { |
|
16891 var type = index + 1, |
|
16892 isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG; |
|
16893 |
|
16894 LazyWrapper.prototype[methodName] = function(iteratee) { |
|
16895 var result = this.clone(); |
|
16896 result.__iteratees__.push({ |
|
16897 'iteratee': getIteratee(iteratee, 3), |
|
16898 'type': type |
|
16899 }); |
|
16900 result.__filtered__ = result.__filtered__ || isFilter; |
|
16901 return result; |
|
16902 }; |
|
16903 }); |
|
16904 |
|
16905 // Add `LazyWrapper` methods for `_.head` and `_.last`. |
|
16906 arrayEach(['head', 'last'], function(methodName, index) { |
|
16907 var takeName = 'take' + (index ? 'Right' : ''); |
|
16908 |
|
16909 LazyWrapper.prototype[methodName] = function() { |
|
16910 return this[takeName](1).value()[0]; |
|
16911 }; |
|
16912 }); |
|
16913 |
|
16914 // Add `LazyWrapper` methods for `_.initial` and `_.tail`. |
|
16915 arrayEach(['initial', 'tail'], function(methodName, index) { |
|
16916 var dropName = 'drop' + (index ? '' : 'Right'); |
|
16917 |
|
16918 LazyWrapper.prototype[methodName] = function() { |
|
16919 return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1); |
|
16920 }; |
|
16921 }); |
|
16922 |
|
16923 LazyWrapper.prototype.compact = function() { |
|
16924 return this.filter(identity); |
|
16925 }; |
|
16926 |
|
16927 LazyWrapper.prototype.find = function(predicate) { |
|
16928 return this.filter(predicate).head(); |
|
16929 }; |
|
16930 |
|
16931 LazyWrapper.prototype.findLast = function(predicate) { |
|
16932 return this.reverse().find(predicate); |
|
16933 }; |
|
16934 |
|
16935 LazyWrapper.prototype.invokeMap = baseRest(function(path, args) { |
|
16936 if (typeof path == 'function') { |
|
16937 return new LazyWrapper(this); |
|
16938 } |
|
16939 return this.map(function(value) { |
|
16940 return baseInvoke(value, path, args); |
|
16941 }); |
|
16942 }); |
|
16943 |
|
16944 LazyWrapper.prototype.reject = function(predicate) { |
|
16945 return this.filter(negate(getIteratee(predicate))); |
|
16946 }; |
|
16947 |
|
16948 LazyWrapper.prototype.slice = function(start, end) { |
|
16949 start = toInteger(start); |
|
16950 |
|
16951 var result = this; |
|
16952 if (result.__filtered__ && (start > 0 || end < 0)) { |
|
16953 return new LazyWrapper(result); |
|
16954 } |
|
16955 if (start < 0) { |
|
16956 result = result.takeRight(-start); |
|
16957 } else if (start) { |
|
16958 result = result.drop(start); |
|
16959 } |
|
16960 if (end !== undefined) { |
|
16961 end = toInteger(end); |
|
16962 result = end < 0 ? result.dropRight(-end) : result.take(end - start); |
|
16963 } |
|
16964 return result; |
|
16965 }; |
|
16966 |
|
16967 LazyWrapper.prototype.takeRightWhile = function(predicate) { |
|
16968 return this.reverse().takeWhile(predicate).reverse(); |
|
16969 }; |
|
16970 |
|
16971 LazyWrapper.prototype.toArray = function() { |
|
16972 return this.take(MAX_ARRAY_LENGTH); |
|
16973 }; |
|
16974 |
|
16975 // Add `LazyWrapper` methods to `lodash.prototype`. |
|
16976 baseForOwn(LazyWrapper.prototype, function(func, methodName) { |
|
16977 var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), |
|
16978 isTaker = /^(?:head|last)$/.test(methodName), |
|
16979 lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName], |
|
16980 retUnwrapped = isTaker || /^find/.test(methodName); |
|
16981 |
|
16982 if (!lodashFunc) { |
|
16983 return; |
|
16984 } |
|
16985 lodash.prototype[methodName] = function() { |
|
16986 var value = this.__wrapped__, |
|
16987 args = isTaker ? [1] : arguments, |
|
16988 isLazy = value instanceof LazyWrapper, |
|
16989 iteratee = args[0], |
|
16990 useLazy = isLazy || isArray(value); |
|
16991 |
|
16992 var interceptor = function(value) { |
|
16993 var result = lodashFunc.apply(lodash, arrayPush([value], args)); |
|
16994 return (isTaker && chainAll) ? result[0] : result; |
|
16995 }; |
|
16996 |
|
16997 if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) { |
|
16998 // Avoid lazy use if the iteratee has a "length" value other than `1`. |
|
16999 isLazy = useLazy = false; |
|
17000 } |
|
17001 var chainAll = this.__chain__, |
|
17002 isHybrid = !!this.__actions__.length, |
|
17003 isUnwrapped = retUnwrapped && !chainAll, |
|
17004 onlyLazy = isLazy && !isHybrid; |
|
17005 |
|
17006 if (!retUnwrapped && useLazy) { |
|
17007 value = onlyLazy ? value : new LazyWrapper(this); |
|
17008 var result = func.apply(value, args); |
|
17009 result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined }); |
|
17010 return new LodashWrapper(result, chainAll); |
|
17011 } |
|
17012 if (isUnwrapped && onlyLazy) { |
|
17013 return func.apply(this, args); |
|
17014 } |
|
17015 result = this.thru(interceptor); |
|
17016 return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result; |
|
17017 }; |
|
17018 }); |
|
17019 |
|
17020 // Add `Array` methods to `lodash.prototype`. |
|
17021 arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) { |
|
17022 var func = arrayProto[methodName], |
|
17023 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru', |
|
17024 retUnwrapped = /^(?:pop|shift)$/.test(methodName); |
|
17025 |
|
17026 lodash.prototype[methodName] = function() { |
|
17027 var args = arguments; |
|
17028 if (retUnwrapped && !this.__chain__) { |
|
17029 var value = this.value(); |
|
17030 return func.apply(isArray(value) ? value : [], args); |
|
17031 } |
|
17032 return this[chainName](function(value) { |
|
17033 return func.apply(isArray(value) ? value : [], args); |
|
17034 }); |
|
17035 }; |
|
17036 }); |
|
17037 |
|
17038 // Map minified method names to their real names. |
|
17039 baseForOwn(LazyWrapper.prototype, function(func, methodName) { |
|
17040 var lodashFunc = lodash[methodName]; |
|
17041 if (lodashFunc) { |
|
17042 var key = (lodashFunc.name + ''), |
|
17043 names = realNames[key] || (realNames[key] = []); |
|
17044 |
|
17045 names.push({ 'name': methodName, 'func': lodashFunc }); |
|
17046 } |
|
17047 }); |
|
17048 |
|
17049 realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{ |
|
17050 'name': 'wrapper', |
|
17051 'func': undefined |
|
17052 }]; |
|
17053 |
|
17054 // Add methods to `LazyWrapper`. |
|
17055 LazyWrapper.prototype.clone = lazyClone; |
|
17056 LazyWrapper.prototype.reverse = lazyReverse; |
|
17057 LazyWrapper.prototype.value = lazyValue; |
|
17058 |
|
17059 // Add chain sequence methods to the `lodash` wrapper. |
|
17060 lodash.prototype.at = wrapperAt; |
|
17061 lodash.prototype.chain = wrapperChain; |
|
17062 lodash.prototype.commit = wrapperCommit; |
|
17063 lodash.prototype.next = wrapperNext; |
|
17064 lodash.prototype.plant = wrapperPlant; |
|
17065 lodash.prototype.reverse = wrapperReverse; |
|
17066 lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue; |
|
17067 |
|
17068 // Add lazy aliases. |
|
17069 lodash.prototype.first = lodash.prototype.head; |
|
17070 |
|
17071 if (symIterator) { |
|
17072 lodash.prototype[symIterator] = wrapperToIterator; |
|
17073 } |
|
17074 return lodash; |
|
17075 }); |
|
17076 |
|
17077 /*--------------------------------------------------------------------------*/ |
|
17078 |
|
17079 // Export lodash. |
|
17080 var _ = runInContext(); |
|
17081 |
|
17082 // Some AMD build optimizers, like r.js, check for condition patterns like: |
|
17083 if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) { |
|
17084 // Expose Lodash on the global object to prevent errors when Lodash is |
|
17085 // loaded by a script tag in the presence of an AMD loader. |
|
17086 // See http://requirejs.org/docs/errors.html#mismatch for more details. |
|
17087 // Use `_.noConflict` to remove Lodash from the global object. |
|
17088 root._ = _; |
|
17089 |
|
17090 // Define as an anonymous module so, through path mapping, it can be |
|
17091 // referenced as the "underscore" module. |
|
17092 define(function() { |
|
17093 return _; |
|
17094 }); |
|
17095 } |
|
17096 // Check for `exports` after `define` in case a build optimizer adds it. |
|
17097 else if (freeModule) { |
|
17098 // Export for Node.js. |
|
17099 (freeModule.exports = _)._ = _; |
|
17100 // Export for CommonJS support. |
|
17101 freeExports._ = _; |
|
17102 } |
|
17103 else { |
|
17104 // Export to the global object. |
|
17105 root._ = _; |
|
17106 } |
|
17107 }.call(this)); |