UNPKG

116 kBJavaScriptView Raw
1/**
2 * @license
3 * Lodash (Custom Build) <https://lodash.com/>
4 * Build: `lodash core -o ./dist/lodash.core.js`
5 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
6 * Released under MIT license <https://lodash.com/license>
7 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
8 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
9 */
10;(function() {
11
12 /** Used as a safe reference for `undefined` in pre-ES5 environments. */
13 var undefined;
14
15 /** Used as the semantic version number. */
16 var VERSION = '4.17.21';
17
18 /** Error message constants. */
19 var FUNC_ERROR_TEXT = 'Expected a function';
20
21 /** Used to compose bitmasks for value comparisons. */
22 var COMPARE_PARTIAL_FLAG = 1,
23 COMPARE_UNORDERED_FLAG = 2;
24
25 /** Used to compose bitmasks for function metadata. */
26 var WRAP_BIND_FLAG = 1,
27 WRAP_PARTIAL_FLAG = 32;
28
29 /** Used as references for various `Number` constants. */
30 var INFINITY = 1 / 0,
31 MAX_SAFE_INTEGER = 9007199254740991;
32
33 /** `Object#toString` result references. */
34 var argsTag = '[object Arguments]',
35 arrayTag = '[object Array]',
36 asyncTag = '[object AsyncFunction]',
37 boolTag = '[object Boolean]',
38 dateTag = '[object Date]',
39 errorTag = '[object Error]',
40 funcTag = '[object Function]',
41 genTag = '[object GeneratorFunction]',
42 numberTag = '[object Number]',
43 objectTag = '[object Object]',
44 proxyTag = '[object Proxy]',
45 regexpTag = '[object RegExp]',
46 stringTag = '[object String]';
47
48 /** Used to match HTML entities and HTML characters. */
49 var reUnescapedHtml = /[&<>"']/g,
50 reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
51
52 /** Used to detect unsigned integer values. */
53 var reIsUint = /^(?:0|[1-9]\d*)$/;
54
55 /** Used to map characters to HTML entities. */
56 var htmlEscapes = {
57 '&': '&amp;',
58 '<': '&lt;',
59 '>': '&gt;',
60 '"': '&quot;',
61 "'": '&#39;'
62 };
63
64 /** Detect free variable `global` from Node.js. */
65 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
66
67 /** Detect free variable `self`. */
68 var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
69
70 /** Used as a reference to the global object. */
71 var root = freeGlobal || freeSelf || Function('return this')();
72
73 /** Detect free variable `exports`. */
74 var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
75
76 /** Detect free variable `module`. */
77 var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
78
79 /*--------------------------------------------------------------------------*/
80
81 /**
82 * Appends the elements of `values` to `array`.
83 *
84 * @private
85 * @param {Array} array The array to modify.
86 * @param {Array} values The values to append.
87 * @returns {Array} Returns `array`.
88 */
89 function arrayPush(array, values) {
90 array.push.apply(array, values);
91 return array;
92 }
93
94 /**
95 * The base implementation of `_.findIndex` and `_.findLastIndex` without
96 * support for iteratee shorthands.
97 *
98 * @private
99 * @param {Array} array The array to inspect.
100 * @param {Function} predicate The function invoked per iteration.
101 * @param {number} fromIndex The index to search from.
102 * @param {boolean} [fromRight] Specify iterating from right to left.
103 * @returns {number} Returns the index of the matched value, else `-1`.
104 */
105 function baseFindIndex(array, predicate, fromIndex, fromRight) {
106 var length = array.length,
107 index = fromIndex + (fromRight ? 1 : -1);
108
109 while ((fromRight ? index-- : ++index < length)) {
110 if (predicate(array[index], index, array)) {
111 return index;
112 }
113 }
114 return -1;
115 }
116
117 /**
118 * The base implementation of `_.property` without support for deep paths.
119 *
120 * @private
121 * @param {string} key The key of the property to get.
122 * @returns {Function} Returns the new accessor function.
123 */
124 function baseProperty(key) {
125 return function(object) {
126 return object == null ? undefined : object[key];
127 };
128 }
129
130 /**
131 * The base implementation of `_.propertyOf` without support for deep paths.
132 *
133 * @private
134 * @param {Object} object The object to query.
135 * @returns {Function} Returns the new accessor function.
136 */
137 function basePropertyOf(object) {
138 return function(key) {
139 return object == null ? undefined : object[key];
140 };
141 }
142
143 /**
144 * The base implementation of `_.reduce` and `_.reduceRight`, without support
145 * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
146 *
147 * @private
148 * @param {Array|Object} collection The collection to iterate over.
149 * @param {Function} iteratee The function invoked per iteration.
150 * @param {*} accumulator The initial value.
151 * @param {boolean} initAccum Specify using the first or last element of
152 * `collection` as the initial value.
153 * @param {Function} eachFunc The function to iterate over `collection`.
154 * @returns {*} Returns the accumulated value.
155 */
156 function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
157 eachFunc(collection, function(value, index, collection) {
158 accumulator = initAccum
159 ? (initAccum = false, value)
160 : iteratee(accumulator, value, index, collection);
161 });
162 return accumulator;
163 }
164
165 /**
166 * The base implementation of `_.values` and `_.valuesIn` which creates an
167 * array of `object` property values corresponding to the property names
168 * of `props`.
169 *
170 * @private
171 * @param {Object} object The object to query.
172 * @param {Array} props The property names to get values for.
173 * @returns {Object} Returns the array of property values.
174 */
175 function baseValues(object, props) {
176 return baseMap(props, function(key) {
177 return object[key];
178 });
179 }
180
181 /**
182 * Used by `_.escape` to convert characters to HTML entities.
183 *
184 * @private
185 * @param {string} chr The matched character to escape.
186 * @returns {string} Returns the escaped character.
187 */
188 var escapeHtmlChar = basePropertyOf(htmlEscapes);
189
190 /**
191 * Creates a unary function that invokes `func` with its argument transformed.
192 *
193 * @private
194 * @param {Function} func The function to wrap.
195 * @param {Function} transform The argument transform.
196 * @returns {Function} Returns the new function.
197 */
198 function overArg(func, transform) {
199 return function(arg) {
200 return func(transform(arg));
201 };
202 }
203
204 /*--------------------------------------------------------------------------*/
205
206 /** Used for built-in method references. */
207 var arrayProto = Array.prototype,
208 objectProto = Object.prototype;
209
210 /** Used to check objects for own properties. */
211 var hasOwnProperty = objectProto.hasOwnProperty;
212
213 /** Used to generate unique IDs. */
214 var idCounter = 0;
215
216 /**
217 * Used to resolve the
218 * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
219 * of values.
220 */
221 var nativeObjectToString = objectProto.toString;
222
223 /** Used to restore the original `_` reference in `_.noConflict`. */
224 var oldDash = root._;
225
226 /** Built-in value references. */
227 var objectCreate = Object.create,
228 propertyIsEnumerable = objectProto.propertyIsEnumerable;
229
230 /* Built-in method references for those with the same name as other `lodash` methods. */
231 var nativeIsFinite = root.isFinite,
232 nativeKeys = overArg(Object.keys, Object),
233 nativeMax = Math.max;
234
235 /*------------------------------------------------------------------------*/
236
237 /**
238 * Creates a `lodash` object which wraps `value` to enable implicit method
239 * chain sequences. Methods that operate on and return arrays, collections,
240 * and functions can be chained together. Methods that retrieve a single value
241 * or may return a primitive value will automatically end the chain sequence
242 * and return the unwrapped value. Otherwise, the value must be unwrapped
243 * with `_#value`.
244 *
245 * Explicit chain sequences, which must be unwrapped with `_#value`, may be
246 * enabled using `_.chain`.
247 *
248 * The execution of chained methods is lazy, that is, it's deferred until
249 * `_#value` is implicitly or explicitly called.
250 *
251 * Lazy evaluation allows several methods to support shortcut fusion.
252 * Shortcut fusion is an optimization to merge iteratee calls; this avoids
253 * the creation of intermediate arrays and can greatly reduce the number of
254 * iteratee executions. Sections of a chain sequence qualify for shortcut
255 * fusion if the section is applied to an array and iteratees accept only
256 * one argument. The heuristic for whether a section qualifies for shortcut
257 * fusion is subject to change.
258 *
259 * Chaining is supported in custom builds as long as the `_#value` method is
260 * directly or indirectly included in the build.
261 *
262 * In addition to lodash methods, wrappers have `Array` and `String` methods.
263 *
264 * The wrapper `Array` methods are:
265 * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
266 *
267 * The wrapper `String` methods are:
268 * `replace` and `split`
269 *
270 * The wrapper methods that support shortcut fusion are:
271 * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
272 * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
273 * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
274 *
275 * The chainable wrapper methods are:
276 * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
277 * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
278 * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
279 * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
280 * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
281 * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
282 * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
283 * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
284 * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
285 * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
286 * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
287 * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
288 * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
289 * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
290 * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
291 * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
292 * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
293 * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
294 * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
295 * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
296 * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
297 * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
298 * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
299 * `zipObject`, `zipObjectDeep`, and `zipWith`
300 *
301 * The wrapper methods that are **not** chainable by default are:
302 * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
303 * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
304 * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
305 * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
306 * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
307 * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
308 * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
309 * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
310 * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
311 * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
312 * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
313 * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
314 * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
315 * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
316 * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
317 * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
318 * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
319 * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
320 * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
321 * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
322 * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
323 * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
324 * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
325 * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
326 * `upperFirst`, `value`, and `words`
327 *
328 * @name _
329 * @constructor
330 * @category Seq
331 * @param {*} value The value to wrap in a `lodash` instance.
332 * @returns {Object} Returns the new `lodash` wrapper instance.
333 * @example
334 *
335 * function square(n) {
336 * return n * n;
337 * }
338 *
339 * var wrapped = _([1, 2, 3]);
340 *
341 * // Returns an unwrapped value.
342 * wrapped.reduce(_.add);
343 * // => 6
344 *
345 * // Returns a wrapped value.
346 * var squares = wrapped.map(square);
347 *
348 * _.isArray(squares);
349 * // => false
350 *
351 * _.isArray(squares.value());
352 * // => true
353 */
354 function lodash(value) {
355 return value instanceof LodashWrapper
356 ? value
357 : new LodashWrapper(value);
358 }
359
360 /**
361 * The base implementation of `_.create` without support for assigning
362 * properties to the created object.
363 *
364 * @private
365 * @param {Object} proto The object to inherit from.
366 * @returns {Object} Returns the new object.
367 */
368 var baseCreate = (function() {
369 function object() {}
370 return function(proto) {
371 if (!isObject(proto)) {
372 return {};
373 }
374 if (objectCreate) {
375 return objectCreate(proto);
376 }
377 object.prototype = proto;
378 var result = new object;
379 object.prototype = undefined;
380 return result;
381 };
382 }());
383
384 /**
385 * The base constructor for creating `lodash` wrapper objects.
386 *
387 * @private
388 * @param {*} value The value to wrap.
389 * @param {boolean} [chainAll] Enable explicit method chain sequences.
390 */
391 function LodashWrapper(value, chainAll) {
392 this.__wrapped__ = value;
393 this.__actions__ = [];
394 this.__chain__ = !!chainAll;
395 }
396
397 LodashWrapper.prototype = baseCreate(lodash.prototype);
398 LodashWrapper.prototype.constructor = LodashWrapper;
399
400 /*------------------------------------------------------------------------*/
401
402 /**
403 * Assigns `value` to `key` of `object` if the existing value is not equivalent
404 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
405 * for equality comparisons.
406 *
407 * @private
408 * @param {Object} object The object to modify.
409 * @param {string} key The key of the property to assign.
410 * @param {*} value The value to assign.
411 */
412 function assignValue(object, key, value) {
413 var objValue = object[key];
414 if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
415 (value === undefined && !(key in object))) {
416 baseAssignValue(object, key, value);
417 }
418 }
419
420 /**
421 * The base implementation of `assignValue` and `assignMergeValue` without
422 * value checks.
423 *
424 * @private
425 * @param {Object} object The object to modify.
426 * @param {string} key The key of the property to assign.
427 * @param {*} value The value to assign.
428 */
429 function baseAssignValue(object, key, value) {
430 object[key] = value;
431 }
432
433 /**
434 * The base implementation of `_.delay` and `_.defer` which accepts `args`
435 * to provide to `func`.
436 *
437 * @private
438 * @param {Function} func The function to delay.
439 * @param {number} wait The number of milliseconds to delay invocation.
440 * @param {Array} args The arguments to provide to `func`.
441 * @returns {number|Object} Returns the timer id or timeout object.
442 */
443 function baseDelay(func, wait, args) {
444 if (typeof func != 'function') {
445 throw new TypeError(FUNC_ERROR_TEXT);
446 }
447 return setTimeout(function() { func.apply(undefined, args); }, wait);
448 }
449
450 /**
451 * The base implementation of `_.forEach` without support for iteratee shorthands.
452 *
453 * @private
454 * @param {Array|Object} collection The collection to iterate over.
455 * @param {Function} iteratee The function invoked per iteration.
456 * @returns {Array|Object} Returns `collection`.
457 */
458 var baseEach = createBaseEach(baseForOwn);
459
460 /**
461 * The base implementation of `_.every` without support for iteratee shorthands.
462 *
463 * @private
464 * @param {Array|Object} collection The collection to iterate over.
465 * @param {Function} predicate The function invoked per iteration.
466 * @returns {boolean} Returns `true` if all elements pass the predicate check,
467 * else `false`
468 */
469 function baseEvery(collection, predicate) {
470 var result = true;
471 baseEach(collection, function(value, index, collection) {
472 result = !!predicate(value, index, collection);
473 return result;
474 });
475 return result;
476 }
477
478 /**
479 * The base implementation of methods like `_.max` and `_.min` which accepts a
480 * `comparator` to determine the extremum value.
481 *
482 * @private
483 * @param {Array} array The array to iterate over.
484 * @param {Function} iteratee The iteratee invoked per iteration.
485 * @param {Function} comparator The comparator used to compare values.
486 * @returns {*} Returns the extremum value.
487 */
488 function baseExtremum(array, iteratee, comparator) {
489 var index = -1,
490 length = array.length;
491
492 while (++index < length) {
493 var value = array[index],
494 current = iteratee(value);
495
496 if (current != null && (computed === undefined
497 ? (current === current && !false)
498 : comparator(current, computed)
499 )) {
500 var computed = current,
501 result = value;
502 }
503 }
504 return result;
505 }
506
507 /**
508 * The base implementation of `_.filter` without support for iteratee shorthands.
509 *
510 * @private
511 * @param {Array|Object} collection The collection to iterate over.
512 * @param {Function} predicate The function invoked per iteration.
513 * @returns {Array} Returns the new filtered array.
514 */
515 function baseFilter(collection, predicate) {
516 var result = [];
517 baseEach(collection, function(value, index, collection) {
518 if (predicate(value, index, collection)) {
519 result.push(value);
520 }
521 });
522 return result;
523 }
524
525 /**
526 * The base implementation of `_.flatten` with support for restricting flattening.
527 *
528 * @private
529 * @param {Array} array The array to flatten.
530 * @param {number} depth The maximum recursion depth.
531 * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
532 * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
533 * @param {Array} [result=[]] The initial result value.
534 * @returns {Array} Returns the new flattened array.
535 */
536 function baseFlatten(array, depth, predicate, isStrict, result) {
537 var index = -1,
538 length = array.length;
539
540 predicate || (predicate = isFlattenable);
541 result || (result = []);
542
543 while (++index < length) {
544 var value = array[index];
545 if (depth > 0 && predicate(value)) {
546 if (depth > 1) {
547 // Recursively flatten arrays (susceptible to call stack limits).
548 baseFlatten(value, depth - 1, predicate, isStrict, result);
549 } else {
550 arrayPush(result, value);
551 }
552 } else if (!isStrict) {
553 result[result.length] = value;
554 }
555 }
556 return result;
557 }
558
559 /**
560 * The base implementation of `baseForOwn` which iterates over `object`
561 * properties returned by `keysFunc` and invokes `iteratee` for each property.
562 * Iteratee functions may exit iteration early by explicitly returning `false`.
563 *
564 * @private
565 * @param {Object} object The object to iterate over.
566 * @param {Function} iteratee The function invoked per iteration.
567 * @param {Function} keysFunc The function to get the keys of `object`.
568 * @returns {Object} Returns `object`.
569 */
570 var baseFor = createBaseFor();
571
572 /**
573 * The base implementation of `_.forOwn` without support for iteratee shorthands.
574 *
575 * @private
576 * @param {Object} object The object to iterate over.
577 * @param {Function} iteratee The function invoked per iteration.
578 * @returns {Object} Returns `object`.
579 */
580 function baseForOwn(object, iteratee) {
581 return object && baseFor(object, iteratee, keys);
582 }
583
584 /**
585 * The base implementation of `_.functions` which creates an array of
586 * `object` function property names filtered from `props`.
587 *
588 * @private
589 * @param {Object} object The object to inspect.
590 * @param {Array} props The property names to filter.
591 * @returns {Array} Returns the function names.
592 */
593 function baseFunctions(object, props) {
594 return baseFilter(props, function(key) {
595 return isFunction(object[key]);
596 });
597 }
598
599 /**
600 * The base implementation of `getTag` without fallbacks for buggy environments.
601 *
602 * @private
603 * @param {*} value The value to query.
604 * @returns {string} Returns the `toStringTag`.
605 */
606 function baseGetTag(value) {
607 return objectToString(value);
608 }
609
610 /**
611 * The base implementation of `_.gt` which doesn't coerce arguments.
612 *
613 * @private
614 * @param {*} value The value to compare.
615 * @param {*} other The other value to compare.
616 * @returns {boolean} Returns `true` if `value` is greater than `other`,
617 * else `false`.
618 */
619 function baseGt(value, other) {
620 return value > other;
621 }
622
623 /**
624 * The base implementation of `_.isArguments`.
625 *
626 * @private
627 * @param {*} value The value to check.
628 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
629 */
630 var baseIsArguments = noop;
631
632 /**
633 * The base implementation of `_.isDate` without Node.js optimizations.
634 *
635 * @private
636 * @param {*} value The value to check.
637 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
638 */
639 function baseIsDate(value) {
640 return isObjectLike(value) && baseGetTag(value) == dateTag;
641 }
642
643 /**
644 * The base implementation of `_.isEqual` which supports partial comparisons
645 * and tracks traversed objects.
646 *
647 * @private
648 * @param {*} value The value to compare.
649 * @param {*} other The other value to compare.
650 * @param {boolean} bitmask The bitmask flags.
651 * 1 - Unordered comparison
652 * 2 - Partial comparison
653 * @param {Function} [customizer] The function to customize comparisons.
654 * @param {Object} [stack] Tracks traversed `value` and `other` objects.
655 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
656 */
657 function baseIsEqual(value, other, bitmask, customizer, stack) {
658 if (value === other) {
659 return true;
660 }
661 if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
662 return value !== value && other !== other;
663 }
664 return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
665 }
666
667 /**
668 * A specialized version of `baseIsEqual` for arrays and objects which performs
669 * deep comparisons and tracks traversed objects enabling objects with circular
670 * references to be compared.
671 *
672 * @private
673 * @param {Object} object The object to compare.
674 * @param {Object} other The other object to compare.
675 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
676 * @param {Function} customizer The function to customize comparisons.
677 * @param {Function} equalFunc The function to determine equivalents of values.
678 * @param {Object} [stack] Tracks traversed `object` and `other` objects.
679 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
680 */
681 function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
682 var objIsArr = isArray(object),
683 othIsArr = isArray(other),
684 objTag = objIsArr ? arrayTag : baseGetTag(object),
685 othTag = othIsArr ? arrayTag : baseGetTag(other);
686
687 objTag = objTag == argsTag ? objectTag : objTag;
688 othTag = othTag == argsTag ? objectTag : othTag;
689
690 var objIsObj = objTag == objectTag,
691 othIsObj = othTag == objectTag,
692 isSameTag = objTag == othTag;
693
694 stack || (stack = []);
695 var objStack = find(stack, function(entry) {
696 return entry[0] == object;
697 });
698 var othStack = find(stack, function(entry) {
699 return entry[0] == other;
700 });
701 if (objStack && othStack) {
702 return objStack[1] == other;
703 }
704 stack.push([object, other]);
705 stack.push([other, object]);
706 if (isSameTag && !objIsObj) {
707 var result = (objIsArr)
708 ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
709 : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
710 stack.pop();
711 return result;
712 }
713 if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
714 var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
715 othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
716
717 if (objIsWrapped || othIsWrapped) {
718 var objUnwrapped = objIsWrapped ? object.value() : object,
719 othUnwrapped = othIsWrapped ? other.value() : other;
720
721 var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
722 stack.pop();
723 return result;
724 }
725 }
726 if (!isSameTag) {
727 return false;
728 }
729 var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
730 stack.pop();
731 return result;
732 }
733
734 /**
735 * The base implementation of `_.isRegExp` without Node.js optimizations.
736 *
737 * @private
738 * @param {*} value The value to check.
739 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
740 */
741 function baseIsRegExp(value) {
742 return isObjectLike(value) && baseGetTag(value) == regexpTag;
743 }
744
745 /**
746 * The base implementation of `_.iteratee`.
747 *
748 * @private
749 * @param {*} [value=_.identity] The value to convert to an iteratee.
750 * @returns {Function} Returns the iteratee.
751 */
752 function baseIteratee(func) {
753 if (typeof func == 'function') {
754 return func;
755 }
756 if (func == null) {
757 return identity;
758 }
759 return (typeof func == 'object' ? baseMatches : baseProperty)(func);
760 }
761
762 /**
763 * The base implementation of `_.lt` which doesn't coerce arguments.
764 *
765 * @private
766 * @param {*} value The value to compare.
767 * @param {*} other The other value to compare.
768 * @returns {boolean} Returns `true` if `value` is less than `other`,
769 * else `false`.
770 */
771 function baseLt(value, other) {
772 return value < other;
773 }
774
775 /**
776 * The base implementation of `_.map` without support for iteratee shorthands.
777 *
778 * @private
779 * @param {Array|Object} collection The collection to iterate over.
780 * @param {Function} iteratee The function invoked per iteration.
781 * @returns {Array} Returns the new mapped array.
782 */
783 function baseMap(collection, iteratee) {
784 var index = -1,
785 result = isArrayLike(collection) ? Array(collection.length) : [];
786
787 baseEach(collection, function(value, key, collection) {
788 result[++index] = iteratee(value, key, collection);
789 });
790 return result;
791 }
792
793 /**
794 * The base implementation of `_.matches` which doesn't clone `source`.
795 *
796 * @private
797 * @param {Object} source The object of property values to match.
798 * @returns {Function} Returns the new spec function.
799 */
800 function baseMatches(source) {
801 var props = nativeKeys(source);
802 return function(object) {
803 var length = props.length;
804 if (object == null) {
805 return !length;
806 }
807 object = Object(object);
808 while (length--) {
809 var key = props[length];
810 if (!(key in object &&
811 baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
812 )) {
813 return false;
814 }
815 }
816 return true;
817 };
818 }
819
820 /**
821 * The base implementation of `_.pick` without support for individual
822 * property identifiers.
823 *
824 * @private
825 * @param {Object} object The source object.
826 * @param {string[]} paths The property paths to pick.
827 * @returns {Object} Returns the new object.
828 */
829 function basePick(object, props) {
830 object = Object(object);
831 return reduce(props, function(result, key) {
832 if (key in object) {
833 result[key] = object[key];
834 }
835 return result;
836 }, {});
837 }
838
839 /**
840 * The base implementation of `_.rest` which doesn't validate or coerce arguments.
841 *
842 * @private
843 * @param {Function} func The function to apply a rest parameter to.
844 * @param {number} [start=func.length-1] The start position of the rest parameter.
845 * @returns {Function} Returns the new function.
846 */
847 function baseRest(func, start) {
848 return setToString(overRest(func, start, identity), func + '');
849 }
850
851 /**
852 * The base implementation of `_.slice` without an iteratee call guard.
853 *
854 * @private
855 * @param {Array} array The array to slice.
856 * @param {number} [start=0] The start position.
857 * @param {number} [end=array.length] The end position.
858 * @returns {Array} Returns the slice of `array`.
859 */
860 function baseSlice(array, start, end) {
861 var index = -1,
862 length = array.length;
863
864 if (start < 0) {
865 start = -start > length ? 0 : (length + start);
866 }
867 end = end > length ? length : end;
868 if (end < 0) {
869 end += length;
870 }
871 length = start > end ? 0 : ((end - start) >>> 0);
872 start >>>= 0;
873
874 var result = Array(length);
875 while (++index < length) {
876 result[index] = array[index + start];
877 }
878 return result;
879 }
880
881 /**
882 * Copies the values of `source` to `array`.
883 *
884 * @private
885 * @param {Array} source The array to copy values from.
886 * @param {Array} [array=[]] The array to copy values to.
887 * @returns {Array} Returns `array`.
888 */
889 function copyArray(source) {
890 return baseSlice(source, 0, source.length);
891 }
892
893 /**
894 * The base implementation of `_.some` without support for iteratee shorthands.
895 *
896 * @private
897 * @param {Array|Object} collection The collection to iterate over.
898 * @param {Function} predicate The function invoked per iteration.
899 * @returns {boolean} Returns `true` if any element passes the predicate check,
900 * else `false`.
901 */
902 function baseSome(collection, predicate) {
903 var result;
904
905 baseEach(collection, function(value, index, collection) {
906 result = predicate(value, index, collection);
907 return !result;
908 });
909 return !!result;
910 }
911
912 /**
913 * The base implementation of `wrapperValue` which returns the result of
914 * performing a sequence of actions on the unwrapped `value`, where each
915 * successive action is supplied the return value of the previous.
916 *
917 * @private
918 * @param {*} value The unwrapped value.
919 * @param {Array} actions Actions to perform to resolve the unwrapped value.
920 * @returns {*} Returns the resolved value.
921 */
922 function baseWrapperValue(value, actions) {
923 var result = value;
924 return reduce(actions, function(result, action) {
925 return action.func.apply(action.thisArg, arrayPush([result], action.args));
926 }, result);
927 }
928
929 /**
930 * Compares values to sort them in ascending order.
931 *
932 * @private
933 * @param {*} value The value to compare.
934 * @param {*} other The other value to compare.
935 * @returns {number} Returns the sort order indicator for `value`.
936 */
937 function compareAscending(value, other) {
938 if (value !== other) {
939 var valIsDefined = value !== undefined,
940 valIsNull = value === null,
941 valIsReflexive = value === value,
942 valIsSymbol = false;
943
944 var othIsDefined = other !== undefined,
945 othIsNull = other === null,
946 othIsReflexive = other === other,
947 othIsSymbol = false;
948
949 if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
950 (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
951 (valIsNull && othIsDefined && othIsReflexive) ||
952 (!valIsDefined && othIsReflexive) ||
953 !valIsReflexive) {
954 return 1;
955 }
956 if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
957 (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
958 (othIsNull && valIsDefined && valIsReflexive) ||
959 (!othIsDefined && valIsReflexive) ||
960 !othIsReflexive) {
961 return -1;
962 }
963 }
964 return 0;
965 }
966
967 /**
968 * Copies properties of `source` to `object`.
969 *
970 * @private
971 * @param {Object} source The object to copy properties from.
972 * @param {Array} props The property identifiers to copy.
973 * @param {Object} [object={}] The object to copy properties to.
974 * @param {Function} [customizer] The function to customize copied values.
975 * @returns {Object} Returns `object`.
976 */
977 function copyObject(source, props, object, customizer) {
978 var isNew = !object;
979 object || (object = {});
980
981 var index = -1,
982 length = props.length;
983
984 while (++index < length) {
985 var key = props[index];
986
987 var newValue = customizer
988 ? customizer(object[key], source[key], key, object, source)
989 : undefined;
990
991 if (newValue === undefined) {
992 newValue = source[key];
993 }
994 if (isNew) {
995 baseAssignValue(object, key, newValue);
996 } else {
997 assignValue(object, key, newValue);
998 }
999 }
1000 return object;
1001 }
1002
1003 /**
1004 * Creates a function like `_.assign`.
1005 *
1006 * @private
1007 * @param {Function} assigner The function to assign values.
1008 * @returns {Function} Returns the new assigner function.
1009 */
1010 function createAssigner(assigner) {
1011 return baseRest(function(object, sources) {
1012 var index = -1,
1013 length = sources.length,
1014 customizer = length > 1 ? sources[length - 1] : undefined;
1015
1016 customizer = (assigner.length > 3 && typeof customizer == 'function')
1017 ? (length--, customizer)
1018 : undefined;
1019
1020 object = Object(object);
1021 while (++index < length) {
1022 var source = sources[index];
1023 if (source) {
1024 assigner(object, source, index, customizer);
1025 }
1026 }
1027 return object;
1028 });
1029 }
1030
1031 /**
1032 * Creates a `baseEach` or `baseEachRight` function.
1033 *
1034 * @private
1035 * @param {Function} eachFunc The function to iterate over a collection.
1036 * @param {boolean} [fromRight] Specify iterating from right to left.
1037 * @returns {Function} Returns the new base function.
1038 */
1039 function createBaseEach(eachFunc, fromRight) {
1040 return function(collection, iteratee) {
1041 if (collection == null) {
1042 return collection;
1043 }
1044 if (!isArrayLike(collection)) {
1045 return eachFunc(collection, iteratee);
1046 }
1047 var length = collection.length,
1048 index = fromRight ? length : -1,
1049 iterable = Object(collection);
1050
1051 while ((fromRight ? index-- : ++index < length)) {
1052 if (iteratee(iterable[index], index, iterable) === false) {
1053 break;
1054 }
1055 }
1056 return collection;
1057 };
1058 }
1059
1060 /**
1061 * Creates a base function for methods like `_.forIn` and `_.forOwn`.
1062 *
1063 * @private
1064 * @param {boolean} [fromRight] Specify iterating from right to left.
1065 * @returns {Function} Returns the new base function.
1066 */
1067 function createBaseFor(fromRight) {
1068 return function(object, iteratee, keysFunc) {
1069 var index = -1,
1070 iterable = Object(object),
1071 props = keysFunc(object),
1072 length = props.length;
1073
1074 while (length--) {
1075 var key = props[fromRight ? length : ++index];
1076 if (iteratee(iterable[key], key, iterable) === false) {
1077 break;
1078 }
1079 }
1080 return object;
1081 };
1082 }
1083
1084 /**
1085 * Creates a function that produces an instance of `Ctor` regardless of
1086 * whether it was invoked as part of a `new` expression or by `call` or `apply`.
1087 *
1088 * @private
1089 * @param {Function} Ctor The constructor to wrap.
1090 * @returns {Function} Returns the new wrapped function.
1091 */
1092 function createCtor(Ctor) {
1093 return function() {
1094 // Use a `switch` statement to work with class constructors. See
1095 // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
1096 // for more details.
1097 var args = arguments;
1098 var thisBinding = baseCreate(Ctor.prototype),
1099 result = Ctor.apply(thisBinding, args);
1100
1101 // Mimic the constructor's `return` behavior.
1102 // See https://es5.github.io/#x13.2.2 for more details.
1103 return isObject(result) ? result : thisBinding;
1104 };
1105 }
1106
1107 /**
1108 * Creates a `_.find` or `_.findLast` function.
1109 *
1110 * @private
1111 * @param {Function} findIndexFunc The function to find the collection index.
1112 * @returns {Function} Returns the new find function.
1113 */
1114 function createFind(findIndexFunc) {
1115 return function(collection, predicate, fromIndex) {
1116 var iterable = Object(collection);
1117 if (!isArrayLike(collection)) {
1118 var iteratee = baseIteratee(predicate, 3);
1119 collection = keys(collection);
1120 predicate = function(key) { return iteratee(iterable[key], key, iterable); };
1121 }
1122 var index = findIndexFunc(collection, predicate, fromIndex);
1123 return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
1124 };
1125 }
1126
1127 /**
1128 * Creates a function that wraps `func` to invoke it with the `this` binding
1129 * of `thisArg` and `partials` prepended to the arguments it receives.
1130 *
1131 * @private
1132 * @param {Function} func The function to wrap.
1133 * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
1134 * @param {*} thisArg The `this` binding of `func`.
1135 * @param {Array} partials The arguments to prepend to those provided to
1136 * the new function.
1137 * @returns {Function} Returns the new wrapped function.
1138 */
1139 function createPartial(func, bitmask, thisArg, partials) {
1140 if (typeof func != 'function') {
1141 throw new TypeError(FUNC_ERROR_TEXT);
1142 }
1143 var isBind = bitmask & WRAP_BIND_FLAG,
1144 Ctor = createCtor(func);
1145
1146 function wrapper() {
1147 var argsIndex = -1,
1148 argsLength = arguments.length,
1149 leftIndex = -1,
1150 leftLength = partials.length,
1151 args = Array(leftLength + argsLength),
1152 fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
1153
1154 while (++leftIndex < leftLength) {
1155 args[leftIndex] = partials[leftIndex];
1156 }
1157 while (argsLength--) {
1158 args[leftIndex++] = arguments[++argsIndex];
1159 }
1160 return fn.apply(isBind ? thisArg : this, args);
1161 }
1162 return wrapper;
1163 }
1164
1165 /**
1166 * A specialized version of `baseIsEqualDeep` for arrays with support for
1167 * partial deep comparisons.
1168 *
1169 * @private
1170 * @param {Array} array The array to compare.
1171 * @param {Array} other The other array to compare.
1172 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1173 * @param {Function} customizer The function to customize comparisons.
1174 * @param {Function} equalFunc The function to determine equivalents of values.
1175 * @param {Object} stack Tracks traversed `array` and `other` objects.
1176 * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
1177 */
1178 function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
1179 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1180 arrLength = array.length,
1181 othLength = other.length;
1182
1183 if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
1184 return false;
1185 }
1186 // Check that cyclic values are equal.
1187 var arrStacked = stack.get(array);
1188 var othStacked = stack.get(other);
1189 if (arrStacked && othStacked) {
1190 return arrStacked == other && othStacked == array;
1191 }
1192 var index = -1,
1193 result = true,
1194 seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
1195
1196 // Ignore non-index properties.
1197 while (++index < arrLength) {
1198 var arrValue = array[index],
1199 othValue = other[index];
1200
1201 var compared;
1202 if (compared !== undefined) {
1203 if (compared) {
1204 continue;
1205 }
1206 result = false;
1207 break;
1208 }
1209 // Recursively compare arrays (susceptible to call stack limits).
1210 if (seen) {
1211 if (!baseSome(other, function(othValue, othIndex) {
1212 if (!indexOf(seen, othIndex) &&
1213 (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
1214 return seen.push(othIndex);
1215 }
1216 })) {
1217 result = false;
1218 break;
1219 }
1220 } else if (!(
1221 arrValue === othValue ||
1222 equalFunc(arrValue, othValue, bitmask, customizer, stack)
1223 )) {
1224 result = false;
1225 break;
1226 }
1227 }
1228 return result;
1229 }
1230
1231 /**
1232 * A specialized version of `baseIsEqualDeep` for comparing objects of
1233 * the same `toStringTag`.
1234 *
1235 * **Note:** This function only supports comparing values with tags of
1236 * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
1237 *
1238 * @private
1239 * @param {Object} object The object to compare.
1240 * @param {Object} other The other object to compare.
1241 * @param {string} tag The `toStringTag` of the objects to compare.
1242 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1243 * @param {Function} customizer The function to customize comparisons.
1244 * @param {Function} equalFunc The function to determine equivalents of values.
1245 * @param {Object} stack Tracks traversed `object` and `other` objects.
1246 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1247 */
1248 function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1249 switch (tag) {
1250
1251 case boolTag:
1252 case dateTag:
1253 case numberTag:
1254 // Coerce booleans to `1` or `0` and dates to milliseconds.
1255 // Invalid dates are coerced to `NaN`.
1256 return eq(+object, +other);
1257
1258 case errorTag:
1259 return object.name == other.name && object.message == other.message;
1260
1261 case regexpTag:
1262 case stringTag:
1263 // Coerce regexes to strings and treat strings, primitives and objects,
1264 // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
1265 // for more details.
1266 return object == (other + '');
1267
1268 }
1269 return false;
1270 }
1271
1272 /**
1273 * A specialized version of `baseIsEqualDeep` for objects with support for
1274 * partial deep comparisons.
1275 *
1276 * @private
1277 * @param {Object} object The object to compare.
1278 * @param {Object} other The other object to compare.
1279 * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1280 * @param {Function} customizer The function to customize comparisons.
1281 * @param {Function} equalFunc The function to determine equivalents of values.
1282 * @param {Object} stack Tracks traversed `object` and `other` objects.
1283 * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1284 */
1285 function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
1286 var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1287 objProps = keys(object),
1288 objLength = objProps.length,
1289 othProps = keys(other),
1290 othLength = othProps.length;
1291
1292 if (objLength != othLength && !isPartial) {
1293 return false;
1294 }
1295 var index = objLength;
1296 while (index--) {
1297 var key = objProps[index];
1298 if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
1299 return false;
1300 }
1301 }
1302 // Check that cyclic values are equal.
1303 var objStacked = stack.get(object);
1304 var othStacked = stack.get(other);
1305 if (objStacked && othStacked) {
1306 return objStacked == other && othStacked == object;
1307 }
1308 var result = true;
1309
1310 var skipCtor = isPartial;
1311 while (++index < objLength) {
1312 key = objProps[index];
1313 var objValue = object[key],
1314 othValue = other[key];
1315
1316 var compared;
1317 // Recursively compare objects (susceptible to call stack limits).
1318 if (!(compared === undefined
1319 ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
1320 : compared
1321 )) {
1322 result = false;
1323 break;
1324 }
1325 skipCtor || (skipCtor = key == 'constructor');
1326 }
1327 if (result && !skipCtor) {
1328 var objCtor = object.constructor,
1329 othCtor = other.constructor;
1330
1331 // Non `Object` object instances with different constructors are not equal.
1332 if (objCtor != othCtor &&
1333 ('constructor' in object && 'constructor' in other) &&
1334 !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
1335 typeof othCtor == 'function' && othCtor instanceof othCtor)) {
1336 result = false;
1337 }
1338 }
1339 return result;
1340 }
1341
1342 /**
1343 * A specialized version of `baseRest` which flattens the rest array.
1344 *
1345 * @private
1346 * @param {Function} func The function to apply a rest parameter to.
1347 * @returns {Function} Returns the new function.
1348 */
1349 function flatRest(func) {
1350 return setToString(overRest(func, undefined, flatten), func + '');
1351 }
1352
1353 /**
1354 * Checks if `value` is a flattenable `arguments` object or array.
1355 *
1356 * @private
1357 * @param {*} value The value to check.
1358 * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
1359 */
1360 function isFlattenable(value) {
1361 return isArray(value) || isArguments(value);
1362 }
1363
1364 /**
1365 * Checks if `value` is a valid array-like index.
1366 *
1367 * @private
1368 * @param {*} value The value to check.
1369 * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
1370 * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
1371 */
1372 function isIndex(value, length) {
1373 var type = typeof value;
1374 length = length == null ? MAX_SAFE_INTEGER : length;
1375
1376 return !!length &&
1377 (type == 'number' ||
1378 (type != 'symbol' && reIsUint.test(value))) &&
1379 (value > -1 && value % 1 == 0 && value < length);
1380 }
1381
1382 /**
1383 * Checks if the given arguments are from an iteratee call.
1384 *
1385 * @private
1386 * @param {*} value The potential iteratee value argument.
1387 * @param {*} index The potential iteratee index or key argument.
1388 * @param {*} object The potential iteratee object argument.
1389 * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
1390 * else `false`.
1391 */
1392 function isIterateeCall(value, index, object) {
1393 if (!isObject(object)) {
1394 return false;
1395 }
1396 var type = typeof index;
1397 if (type == 'number'
1398 ? (isArrayLike(object) && isIndex(index, object.length))
1399 : (type == 'string' && index in object)
1400 ) {
1401 return eq(object[index], value);
1402 }
1403 return false;
1404 }
1405
1406 /**
1407 * This function is like
1408 * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1409 * except that it includes inherited enumerable properties.
1410 *
1411 * @private
1412 * @param {Object} object The object to query.
1413 * @returns {Array} Returns the array of property names.
1414 */
1415 function nativeKeysIn(object) {
1416 var result = [];
1417 if (object != null) {
1418 for (var key in Object(object)) {
1419 result.push(key);
1420 }
1421 }
1422 return result;
1423 }
1424
1425 /**
1426 * Converts `value` to a string using `Object.prototype.toString`.
1427 *
1428 * @private
1429 * @param {*} value The value to convert.
1430 * @returns {string} Returns the converted string.
1431 */
1432 function objectToString(value) {
1433 return nativeObjectToString.call(value);
1434 }
1435
1436 /**
1437 * A specialized version of `baseRest` which transforms the rest array.
1438 *
1439 * @private
1440 * @param {Function} func The function to apply a rest parameter to.
1441 * @param {number} [start=func.length-1] The start position of the rest parameter.
1442 * @param {Function} transform The rest array transform.
1443 * @returns {Function} Returns the new function.
1444 */
1445 function overRest(func, start, transform) {
1446 start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1447 return function() {
1448 var args = arguments,
1449 index = -1,
1450 length = nativeMax(args.length - start, 0),
1451 array = Array(length);
1452
1453 while (++index < length) {
1454 array[index] = args[start + index];
1455 }
1456 index = -1;
1457 var otherArgs = Array(start + 1);
1458 while (++index < start) {
1459 otherArgs[index] = args[index];
1460 }
1461 otherArgs[start] = transform(array);
1462 return func.apply(this, otherArgs);
1463 };
1464 }
1465
1466 /**
1467 * Sets the `toString` method of `func` to return `string`.
1468 *
1469 * @private
1470 * @param {Function} func The function to modify.
1471 * @param {Function} string The `toString` result.
1472 * @returns {Function} Returns `func`.
1473 */
1474 var setToString = identity;
1475
1476 /*------------------------------------------------------------------------*/
1477
1478 /**
1479 * Creates an array with all falsey values removed. The values `false`, `null`,
1480 * `0`, `""`, `undefined`, and `NaN` are falsey.
1481 *
1482 * @static
1483 * @memberOf _
1484 * @since 0.1.0
1485 * @category Array
1486 * @param {Array} array The array to compact.
1487 * @returns {Array} Returns the new array of filtered values.
1488 * @example
1489 *
1490 * _.compact([0, 1, false, 2, '', 3]);
1491 * // => [1, 2, 3]
1492 */
1493 function compact(array) {
1494 return baseFilter(array, Boolean);
1495 }
1496
1497 /**
1498 * Creates a new array concatenating `array` with any additional arrays
1499 * and/or values.
1500 *
1501 * @static
1502 * @memberOf _
1503 * @since 4.0.0
1504 * @category Array
1505 * @param {Array} array The array to concatenate.
1506 * @param {...*} [values] The values to concatenate.
1507 * @returns {Array} Returns the new concatenated array.
1508 * @example
1509 *
1510 * var array = [1];
1511 * var other = _.concat(array, 2, [3], [[4]]);
1512 *
1513 * console.log(other);
1514 * // => [1, 2, 3, [4]]
1515 *
1516 * console.log(array);
1517 * // => [1]
1518 */
1519 function concat() {
1520 var length = arguments.length;
1521 if (!length) {
1522 return [];
1523 }
1524 var args = Array(length - 1),
1525 array = arguments[0],
1526 index = length;
1527
1528 while (index--) {
1529 args[index - 1] = arguments[index];
1530 }
1531 return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
1532 }
1533
1534 /**
1535 * This method is like `_.find` except that it returns the index of the first
1536 * element `predicate` returns truthy for instead of the element itself.
1537 *
1538 * @static
1539 * @memberOf _
1540 * @since 1.1.0
1541 * @category Array
1542 * @param {Array} array The array to inspect.
1543 * @param {Function} [predicate=_.identity] The function invoked per iteration.
1544 * @param {number} [fromIndex=0] The index to search from.
1545 * @returns {number} Returns the index of the found element, else `-1`.
1546 * @example
1547 *
1548 * var users = [
1549 * { 'user': 'barney', 'active': false },
1550 * { 'user': 'fred', 'active': false },
1551 * { 'user': 'pebbles', 'active': true }
1552 * ];
1553 *
1554 * _.findIndex(users, function(o) { return o.user == 'barney'; });
1555 * // => 0
1556 *
1557 * // The `_.matches` iteratee shorthand.
1558 * _.findIndex(users, { 'user': 'fred', 'active': false });
1559 * // => 1
1560 *
1561 * // The `_.matchesProperty` iteratee shorthand.
1562 * _.findIndex(users, ['active', false]);
1563 * // => 0
1564 *
1565 * // The `_.property` iteratee shorthand.
1566 * _.findIndex(users, 'active');
1567 * // => 2
1568 */
1569 function findIndex(array, predicate, fromIndex) {
1570 var length = array == null ? 0 : array.length;
1571 if (!length) {
1572 return -1;
1573 }
1574 var index = fromIndex == null ? 0 : toInteger(fromIndex);
1575 if (index < 0) {
1576 index = nativeMax(length + index, 0);
1577 }
1578 return baseFindIndex(array, baseIteratee(predicate, 3), index);
1579 }
1580
1581 /**
1582 * Flattens `array` a single level deep.
1583 *
1584 * @static
1585 * @memberOf _
1586 * @since 0.1.0
1587 * @category Array
1588 * @param {Array} array The array to flatten.
1589 * @returns {Array} Returns the new flattened array.
1590 * @example
1591 *
1592 * _.flatten([1, [2, [3, [4]], 5]]);
1593 * // => [1, 2, [3, [4]], 5]
1594 */
1595 function flatten(array) {
1596 var length = array == null ? 0 : array.length;
1597 return length ? baseFlatten(array, 1) : [];
1598 }
1599
1600 /**
1601 * Recursively flattens `array`.
1602 *
1603 * @static
1604 * @memberOf _
1605 * @since 3.0.0
1606 * @category Array
1607 * @param {Array} array The array to flatten.
1608 * @returns {Array} Returns the new flattened array.
1609 * @example
1610 *
1611 * _.flattenDeep([1, [2, [3, [4]], 5]]);
1612 * // => [1, 2, 3, 4, 5]
1613 */
1614 function flattenDeep(array) {
1615 var length = array == null ? 0 : array.length;
1616 return length ? baseFlatten(array, INFINITY) : [];
1617 }
1618
1619 /**
1620 * Gets the first element of `array`.
1621 *
1622 * @static
1623 * @memberOf _
1624 * @since 0.1.0
1625 * @alias first
1626 * @category Array
1627 * @param {Array} array The array to query.
1628 * @returns {*} Returns the first element of `array`.
1629 * @example
1630 *
1631 * _.head([1, 2, 3]);
1632 * // => 1
1633 *
1634 * _.head([]);
1635 * // => undefined
1636 */
1637 function head(array) {
1638 return (array && array.length) ? array[0] : undefined;
1639 }
1640
1641 /**
1642 * Gets the index at which the first occurrence of `value` is found in `array`
1643 * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1644 * for equality comparisons. If `fromIndex` is negative, it's used as the
1645 * offset from the end of `array`.
1646 *
1647 * @static
1648 * @memberOf _
1649 * @since 0.1.0
1650 * @category Array
1651 * @param {Array} array The array to inspect.
1652 * @param {*} value The value to search for.
1653 * @param {number} [fromIndex=0] The index to search from.
1654 * @returns {number} Returns the index of the matched value, else `-1`.
1655 * @example
1656 *
1657 * _.indexOf([1, 2, 1, 2], 2);
1658 * // => 1
1659 *
1660 * // Search from the `fromIndex`.
1661 * _.indexOf([1, 2, 1, 2], 2, 2);
1662 * // => 3
1663 */
1664 function indexOf(array, value, fromIndex) {
1665 var length = array == null ? 0 : array.length;
1666 if (typeof fromIndex == 'number') {
1667 fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
1668 } else {
1669 fromIndex = 0;
1670 }
1671 var index = (fromIndex || 0) - 1,
1672 isReflexive = value === value;
1673
1674 while (++index < length) {
1675 var other = array[index];
1676 if ((isReflexive ? other === value : other !== other)) {
1677 return index;
1678 }
1679 }
1680 return -1;
1681 }
1682
1683 /**
1684 * Gets the last element of `array`.
1685 *
1686 * @static
1687 * @memberOf _
1688 * @since 0.1.0
1689 * @category Array
1690 * @param {Array} array The array to query.
1691 * @returns {*} Returns the last element of `array`.
1692 * @example
1693 *
1694 * _.last([1, 2, 3]);
1695 * // => 3
1696 */
1697 function last(array) {
1698 var length = array == null ? 0 : array.length;
1699 return length ? array[length - 1] : undefined;
1700 }
1701
1702 /**
1703 * Creates a slice of `array` from `start` up to, but not including, `end`.
1704 *
1705 * **Note:** This method is used instead of
1706 * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
1707 * returned.
1708 *
1709 * @static
1710 * @memberOf _
1711 * @since 3.0.0
1712 * @category Array
1713 * @param {Array} array The array to slice.
1714 * @param {number} [start=0] The start position.
1715 * @param {number} [end=array.length] The end position.
1716 * @returns {Array} Returns the slice of `array`.
1717 */
1718 function slice(array, start, end) {
1719 var length = array == null ? 0 : array.length;
1720 start = start == null ? 0 : +start;
1721 end = end === undefined ? length : +end;
1722 return length ? baseSlice(array, start, end) : [];
1723 }
1724
1725 /*------------------------------------------------------------------------*/
1726
1727 /**
1728 * Creates a `lodash` wrapper instance that wraps `value` with explicit method
1729 * chain sequences enabled. The result of such sequences must be unwrapped
1730 * with `_#value`.
1731 *
1732 * @static
1733 * @memberOf _
1734 * @since 1.3.0
1735 * @category Seq
1736 * @param {*} value The value to wrap.
1737 * @returns {Object} Returns the new `lodash` wrapper instance.
1738 * @example
1739 *
1740 * var users = [
1741 * { 'user': 'barney', 'age': 36 },
1742 * { 'user': 'fred', 'age': 40 },
1743 * { 'user': 'pebbles', 'age': 1 }
1744 * ];
1745 *
1746 * var youngest = _
1747 * .chain(users)
1748 * .sortBy('age')
1749 * .map(function(o) {
1750 * return o.user + ' is ' + o.age;
1751 * })
1752 * .head()
1753 * .value();
1754 * // => 'pebbles is 1'
1755 */
1756 function chain(value) {
1757 var result = lodash(value);
1758 result.__chain__ = true;
1759 return result;
1760 }
1761
1762 /**
1763 * This method invokes `interceptor` and returns `value`. The interceptor
1764 * is invoked with one argument; (value). The purpose of this method is to
1765 * "tap into" a method chain sequence in order to modify intermediate results.
1766 *
1767 * @static
1768 * @memberOf _
1769 * @since 0.1.0
1770 * @category Seq
1771 * @param {*} value The value to provide to `interceptor`.
1772 * @param {Function} interceptor The function to invoke.
1773 * @returns {*} Returns `value`.
1774 * @example
1775 *
1776 * _([1, 2, 3])
1777 * .tap(function(array) {
1778 * // Mutate input array.
1779 * array.pop();
1780 * })
1781 * .reverse()
1782 * .value();
1783 * // => [2, 1]
1784 */
1785 function tap(value, interceptor) {
1786 interceptor(value);
1787 return value;
1788 }
1789
1790 /**
1791 * This method is like `_.tap` except that it returns the result of `interceptor`.
1792 * The purpose of this method is to "pass thru" values replacing intermediate
1793 * results in a method chain sequence.
1794 *
1795 * @static
1796 * @memberOf _
1797 * @since 3.0.0
1798 * @category Seq
1799 * @param {*} value The value to provide to `interceptor`.
1800 * @param {Function} interceptor The function to invoke.
1801 * @returns {*} Returns the result of `interceptor`.
1802 * @example
1803 *
1804 * _(' abc ')
1805 * .chain()
1806 * .trim()
1807 * .thru(function(value) {
1808 * return [value];
1809 * })
1810 * .value();
1811 * // => ['abc']
1812 */
1813 function thru(value, interceptor) {
1814 return interceptor(value);
1815 }
1816
1817 /**
1818 * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
1819 *
1820 * @name chain
1821 * @memberOf _
1822 * @since 0.1.0
1823 * @category Seq
1824 * @returns {Object} Returns the new `lodash` wrapper instance.
1825 * @example
1826 *
1827 * var users = [
1828 * { 'user': 'barney', 'age': 36 },
1829 * { 'user': 'fred', 'age': 40 }
1830 * ];
1831 *
1832 * // A sequence without explicit chaining.
1833 * _(users).head();
1834 * // => { 'user': 'barney', 'age': 36 }
1835 *
1836 * // A sequence with explicit chaining.
1837 * _(users)
1838 * .chain()
1839 * .head()
1840 * .pick('user')
1841 * .value();
1842 * // => { 'user': 'barney' }
1843 */
1844 function wrapperChain() {
1845 return chain(this);
1846 }
1847
1848 /**
1849 * Executes the chain sequence to resolve the unwrapped value.
1850 *
1851 * @name value
1852 * @memberOf _
1853 * @since 0.1.0
1854 * @alias toJSON, valueOf
1855 * @category Seq
1856 * @returns {*} Returns the resolved unwrapped value.
1857 * @example
1858 *
1859 * _([1, 2, 3]).value();
1860 * // => [1, 2, 3]
1861 */
1862 function wrapperValue() {
1863 return baseWrapperValue(this.__wrapped__, this.__actions__);
1864 }
1865
1866 /*------------------------------------------------------------------------*/
1867
1868 /**
1869 * Checks if `predicate` returns truthy for **all** elements of `collection`.
1870 * Iteration is stopped once `predicate` returns falsey. The predicate is
1871 * invoked with three arguments: (value, index|key, collection).
1872 *
1873 * **Note:** This method returns `true` for
1874 * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
1875 * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
1876 * elements of empty collections.
1877 *
1878 * @static
1879 * @memberOf _
1880 * @since 0.1.0
1881 * @category Collection
1882 * @param {Array|Object} collection The collection to iterate over.
1883 * @param {Function} [predicate=_.identity] The function invoked per iteration.
1884 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
1885 * @returns {boolean} Returns `true` if all elements pass the predicate check,
1886 * else `false`.
1887 * @example
1888 *
1889 * _.every([true, 1, null, 'yes'], Boolean);
1890 * // => false
1891 *
1892 * var users = [
1893 * { 'user': 'barney', 'age': 36, 'active': false },
1894 * { 'user': 'fred', 'age': 40, 'active': false }
1895 * ];
1896 *
1897 * // The `_.matches` iteratee shorthand.
1898 * _.every(users, { 'user': 'barney', 'active': false });
1899 * // => false
1900 *
1901 * // The `_.matchesProperty` iteratee shorthand.
1902 * _.every(users, ['active', false]);
1903 * // => true
1904 *
1905 * // The `_.property` iteratee shorthand.
1906 * _.every(users, 'active');
1907 * // => false
1908 */
1909 function every(collection, predicate, guard) {
1910 predicate = guard ? undefined : predicate;
1911 return baseEvery(collection, baseIteratee(predicate));
1912 }
1913
1914 /**
1915 * Iterates over elements of `collection`, returning an array of all elements
1916 * `predicate` returns truthy for. The predicate is invoked with three
1917 * arguments: (value, index|key, collection).
1918 *
1919 * **Note:** Unlike `_.remove`, this method returns a new array.
1920 *
1921 * @static
1922 * @memberOf _
1923 * @since 0.1.0
1924 * @category Collection
1925 * @param {Array|Object} collection The collection to iterate over.
1926 * @param {Function} [predicate=_.identity] The function invoked per iteration.
1927 * @returns {Array} Returns the new filtered array.
1928 * @see _.reject
1929 * @example
1930 *
1931 * var users = [
1932 * { 'user': 'barney', 'age': 36, 'active': true },
1933 * { 'user': 'fred', 'age': 40, 'active': false }
1934 * ];
1935 *
1936 * _.filter(users, function(o) { return !o.active; });
1937 * // => objects for ['fred']
1938 *
1939 * // The `_.matches` iteratee shorthand.
1940 * _.filter(users, { 'age': 36, 'active': true });
1941 * // => objects for ['barney']
1942 *
1943 * // The `_.matchesProperty` iteratee shorthand.
1944 * _.filter(users, ['active', false]);
1945 * // => objects for ['fred']
1946 *
1947 * // The `_.property` iteratee shorthand.
1948 * _.filter(users, 'active');
1949 * // => objects for ['barney']
1950 *
1951 * // Combining several predicates using `_.overEvery` or `_.overSome`.
1952 * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
1953 * // => objects for ['fred', 'barney']
1954 */
1955 function filter(collection, predicate) {
1956 return baseFilter(collection, baseIteratee(predicate));
1957 }
1958
1959 /**
1960 * Iterates over elements of `collection`, returning the first element
1961 * `predicate` returns truthy for. The predicate is invoked with three
1962 * arguments: (value, index|key, collection).
1963 *
1964 * @static
1965 * @memberOf _
1966 * @since 0.1.0
1967 * @category Collection
1968 * @param {Array|Object} collection The collection to inspect.
1969 * @param {Function} [predicate=_.identity] The function invoked per iteration.
1970 * @param {number} [fromIndex=0] The index to search from.
1971 * @returns {*} Returns the matched element, else `undefined`.
1972 * @example
1973 *
1974 * var users = [
1975 * { 'user': 'barney', 'age': 36, 'active': true },
1976 * { 'user': 'fred', 'age': 40, 'active': false },
1977 * { 'user': 'pebbles', 'age': 1, 'active': true }
1978 * ];
1979 *
1980 * _.find(users, function(o) { return o.age < 40; });
1981 * // => object for 'barney'
1982 *
1983 * // The `_.matches` iteratee shorthand.
1984 * _.find(users, { 'age': 1, 'active': true });
1985 * // => object for 'pebbles'
1986 *
1987 * // The `_.matchesProperty` iteratee shorthand.
1988 * _.find(users, ['active', false]);
1989 * // => object for 'fred'
1990 *
1991 * // The `_.property` iteratee shorthand.
1992 * _.find(users, 'active');
1993 * // => object for 'barney'
1994 */
1995 var find = createFind(findIndex);
1996
1997 /**
1998 * Iterates over elements of `collection` and invokes `iteratee` for each element.
1999 * The iteratee is invoked with three arguments: (value, index|key, collection).
2000 * Iteratee functions may exit iteration early by explicitly returning `false`.
2001 *
2002 * **Note:** As with other "Collections" methods, objects with a "length"
2003 * property are iterated like arrays. To avoid this behavior use `_.forIn`
2004 * or `_.forOwn` for object iteration.
2005 *
2006 * @static
2007 * @memberOf _
2008 * @since 0.1.0
2009 * @alias each
2010 * @category Collection
2011 * @param {Array|Object} collection The collection to iterate over.
2012 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2013 * @returns {Array|Object} Returns `collection`.
2014 * @see _.forEachRight
2015 * @example
2016 *
2017 * _.forEach([1, 2], function(value) {
2018 * console.log(value);
2019 * });
2020 * // => Logs `1` then `2`.
2021 *
2022 * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
2023 * console.log(key);
2024 * });
2025 * // => Logs 'a' then 'b' (iteration order is not guaranteed).
2026 */
2027 function forEach(collection, iteratee) {
2028 return baseEach(collection, baseIteratee(iteratee));
2029 }
2030
2031 /**
2032 * Creates an array of values by running each element in `collection` thru
2033 * `iteratee`. The iteratee is invoked with three arguments:
2034 * (value, index|key, collection).
2035 *
2036 * Many lodash methods are guarded to work as iteratees for methods like
2037 * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
2038 *
2039 * The guarded methods are:
2040 * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
2041 * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
2042 * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
2043 * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
2044 *
2045 * @static
2046 * @memberOf _
2047 * @since 0.1.0
2048 * @category Collection
2049 * @param {Array|Object} collection The collection to iterate over.
2050 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2051 * @returns {Array} Returns the new mapped array.
2052 * @example
2053 *
2054 * function square(n) {
2055 * return n * n;
2056 * }
2057 *
2058 * _.map([4, 8], square);
2059 * // => [16, 64]
2060 *
2061 * _.map({ 'a': 4, 'b': 8 }, square);
2062 * // => [16, 64] (iteration order is not guaranteed)
2063 *
2064 * var users = [
2065 * { 'user': 'barney' },
2066 * { 'user': 'fred' }
2067 * ];
2068 *
2069 * // The `_.property` iteratee shorthand.
2070 * _.map(users, 'user');
2071 * // => ['barney', 'fred']
2072 */
2073 function map(collection, iteratee) {
2074 return baseMap(collection, baseIteratee(iteratee));
2075 }
2076
2077 /**
2078 * Reduces `collection` to a value which is the accumulated result of running
2079 * each element in `collection` thru `iteratee`, where each successive
2080 * invocation is supplied the return value of the previous. If `accumulator`
2081 * is not given, the first element of `collection` is used as the initial
2082 * value. The iteratee is invoked with four arguments:
2083 * (accumulator, value, index|key, collection).
2084 *
2085 * Many lodash methods are guarded to work as iteratees for methods like
2086 * `_.reduce`, `_.reduceRight`, and `_.transform`.
2087 *
2088 * The guarded methods are:
2089 * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
2090 * and `sortBy`
2091 *
2092 * @static
2093 * @memberOf _
2094 * @since 0.1.0
2095 * @category Collection
2096 * @param {Array|Object} collection The collection to iterate over.
2097 * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2098 * @param {*} [accumulator] The initial value.
2099 * @returns {*} Returns the accumulated value.
2100 * @see _.reduceRight
2101 * @example
2102 *
2103 * _.reduce([1, 2], function(sum, n) {
2104 * return sum + n;
2105 * }, 0);
2106 * // => 3
2107 *
2108 * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
2109 * (result[value] || (result[value] = [])).push(key);
2110 * return result;
2111 * }, {});
2112 * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
2113 */
2114 function reduce(collection, iteratee, accumulator) {
2115 return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
2116 }
2117
2118 /**
2119 * Gets the size of `collection` by returning its length for array-like
2120 * values or the number of own enumerable string keyed properties for objects.
2121 *
2122 * @static
2123 * @memberOf _
2124 * @since 0.1.0
2125 * @category Collection
2126 * @param {Array|Object|string} collection The collection to inspect.
2127 * @returns {number} Returns the collection size.
2128 * @example
2129 *
2130 * _.size([1, 2, 3]);
2131 * // => 3
2132 *
2133 * _.size({ 'a': 1, 'b': 2 });
2134 * // => 2
2135 *
2136 * _.size('pebbles');
2137 * // => 7
2138 */
2139 function size(collection) {
2140 if (collection == null) {
2141 return 0;
2142 }
2143 collection = isArrayLike(collection) ? collection : nativeKeys(collection);
2144 return collection.length;
2145 }
2146
2147 /**
2148 * Checks if `predicate` returns truthy for **any** element of `collection`.
2149 * Iteration is stopped once `predicate` returns truthy. The predicate is
2150 * invoked with three arguments: (value, index|key, collection).
2151 *
2152 * @static
2153 * @memberOf _
2154 * @since 0.1.0
2155 * @category Collection
2156 * @param {Array|Object} collection The collection to iterate over.
2157 * @param {Function} [predicate=_.identity] The function invoked per iteration.
2158 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
2159 * @returns {boolean} Returns `true` if any element passes the predicate check,
2160 * else `false`.
2161 * @example
2162 *
2163 * _.some([null, 0, 'yes', false], Boolean);
2164 * // => true
2165 *
2166 * var users = [
2167 * { 'user': 'barney', 'active': true },
2168 * { 'user': 'fred', 'active': false }
2169 * ];
2170 *
2171 * // The `_.matches` iteratee shorthand.
2172 * _.some(users, { 'user': 'barney', 'active': false });
2173 * // => false
2174 *
2175 * // The `_.matchesProperty` iteratee shorthand.
2176 * _.some(users, ['active', false]);
2177 * // => true
2178 *
2179 * // The `_.property` iteratee shorthand.
2180 * _.some(users, 'active');
2181 * // => true
2182 */
2183 function some(collection, predicate, guard) {
2184 predicate = guard ? undefined : predicate;
2185 return baseSome(collection, baseIteratee(predicate));
2186 }
2187
2188 /**
2189 * Creates an array of elements, sorted in ascending order by the results of
2190 * running each element in a collection thru each iteratee. This method
2191 * performs a stable sort, that is, it preserves the original sort order of
2192 * equal elements. The iteratees are invoked with one argument: (value).
2193 *
2194 * @static
2195 * @memberOf _
2196 * @since 0.1.0
2197 * @category Collection
2198 * @param {Array|Object} collection The collection to iterate over.
2199 * @param {...(Function|Function[])} [iteratees=[_.identity]]
2200 * The iteratees to sort by.
2201 * @returns {Array} Returns the new sorted array.
2202 * @example
2203 *
2204 * var users = [
2205 * { 'user': 'fred', 'age': 48 },
2206 * { 'user': 'barney', 'age': 36 },
2207 * { 'user': 'fred', 'age': 30 },
2208 * { 'user': 'barney', 'age': 34 }
2209 * ];
2210 *
2211 * _.sortBy(users, [function(o) { return o.user; }]);
2212 * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
2213 *
2214 * _.sortBy(users, ['user', 'age']);
2215 * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
2216 */
2217 function sortBy(collection, iteratee) {
2218 var index = 0;
2219 iteratee = baseIteratee(iteratee);
2220
2221 return baseMap(baseMap(collection, function(value, key, collection) {
2222 return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
2223 }).sort(function(object, other) {
2224 return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
2225 }), baseProperty('value'));
2226 }
2227
2228 /*------------------------------------------------------------------------*/
2229
2230 /**
2231 * Creates a function that invokes `func`, with the `this` binding and arguments
2232 * of the created function, while it's called less than `n` times. Subsequent
2233 * calls to the created function return the result of the last `func` invocation.
2234 *
2235 * @static
2236 * @memberOf _
2237 * @since 3.0.0
2238 * @category Function
2239 * @param {number} n The number of calls at which `func` is no longer invoked.
2240 * @param {Function} func The function to restrict.
2241 * @returns {Function} Returns the new restricted function.
2242 * @example
2243 *
2244 * jQuery(element).on('click', _.before(5, addContactToList));
2245 * // => Allows adding up to 4 contacts to the list.
2246 */
2247 function before(n, func) {
2248 var result;
2249 if (typeof func != 'function') {
2250 throw new TypeError(FUNC_ERROR_TEXT);
2251 }
2252 n = toInteger(n);
2253 return function() {
2254 if (--n > 0) {
2255 result = func.apply(this, arguments);
2256 }
2257 if (n <= 1) {
2258 func = undefined;
2259 }
2260 return result;
2261 };
2262 }
2263
2264 /**
2265 * Creates a function that invokes `func` with the `this` binding of `thisArg`
2266 * and `partials` prepended to the arguments it receives.
2267 *
2268 * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
2269 * may be used as a placeholder for partially applied arguments.
2270 *
2271 * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
2272 * property of bound functions.
2273 *
2274 * @static
2275 * @memberOf _
2276 * @since 0.1.0
2277 * @category Function
2278 * @param {Function} func The function to bind.
2279 * @param {*} thisArg The `this` binding of `func`.
2280 * @param {...*} [partials] The arguments to be partially applied.
2281 * @returns {Function} Returns the new bound function.
2282 * @example
2283 *
2284 * function greet(greeting, punctuation) {
2285 * return greeting + ' ' + this.user + punctuation;
2286 * }
2287 *
2288 * var object = { 'user': 'fred' };
2289 *
2290 * var bound = _.bind(greet, object, 'hi');
2291 * bound('!');
2292 * // => 'hi fred!'
2293 *
2294 * // Bound with placeholders.
2295 * var bound = _.bind(greet, object, _, '!');
2296 * bound('hi');
2297 * // => 'hi fred!'
2298 */
2299 var bind = baseRest(function(func, thisArg, partials) {
2300 return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
2301 });
2302
2303 /**
2304 * Defers invoking the `func` until the current call stack has cleared. Any
2305 * additional arguments are provided to `func` when it's invoked.
2306 *
2307 * @static
2308 * @memberOf _
2309 * @since 0.1.0
2310 * @category Function
2311 * @param {Function} func The function to defer.
2312 * @param {...*} [args] The arguments to invoke `func` with.
2313 * @returns {number} Returns the timer id.
2314 * @example
2315 *
2316 * _.defer(function(text) {
2317 * console.log(text);
2318 * }, 'deferred');
2319 * // => Logs 'deferred' after one millisecond.
2320 */
2321 var defer = baseRest(function(func, args) {
2322 return baseDelay(func, 1, args);
2323 });
2324
2325 /**
2326 * Invokes `func` after `wait` milliseconds. Any additional arguments are
2327 * provided to `func` when it's invoked.
2328 *
2329 * @static
2330 * @memberOf _
2331 * @since 0.1.0
2332 * @category Function
2333 * @param {Function} func The function to delay.
2334 * @param {number} wait The number of milliseconds to delay invocation.
2335 * @param {...*} [args] The arguments to invoke `func` with.
2336 * @returns {number} Returns the timer id.
2337 * @example
2338 *
2339 * _.delay(function(text) {
2340 * console.log(text);
2341 * }, 1000, 'later');
2342 * // => Logs 'later' after one second.
2343 */
2344 var delay = baseRest(function(func, wait, args) {
2345 return baseDelay(func, toNumber(wait) || 0, args);
2346 });
2347
2348 /**
2349 * Creates a function that negates the result of the predicate `func`. The
2350 * `func` predicate is invoked with the `this` binding and arguments of the
2351 * created function.
2352 *
2353 * @static
2354 * @memberOf _
2355 * @since 3.0.0
2356 * @category Function
2357 * @param {Function} predicate The predicate to negate.
2358 * @returns {Function} Returns the new negated function.
2359 * @example
2360 *
2361 * function isEven(n) {
2362 * return n % 2 == 0;
2363 * }
2364 *
2365 * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
2366 * // => [1, 3, 5]
2367 */
2368 function negate(predicate) {
2369 if (typeof predicate != 'function') {
2370 throw new TypeError(FUNC_ERROR_TEXT);
2371 }
2372 return function() {
2373 var args = arguments;
2374 return !predicate.apply(this, args);
2375 };
2376 }
2377
2378 /**
2379 * Creates a function that is restricted to invoking `func` once. Repeat calls
2380 * to the function return the value of the first invocation. The `func` is
2381 * invoked with the `this` binding and arguments of the created function.
2382 *
2383 * @static
2384 * @memberOf _
2385 * @since 0.1.0
2386 * @category Function
2387 * @param {Function} func The function to restrict.
2388 * @returns {Function} Returns the new restricted function.
2389 * @example
2390 *
2391 * var initialize = _.once(createApplication);
2392 * initialize();
2393 * initialize();
2394 * // => `createApplication` is invoked once
2395 */
2396 function once(func) {
2397 return before(2, func);
2398 }
2399
2400 /*------------------------------------------------------------------------*/
2401
2402 /**
2403 * Creates a shallow clone of `value`.
2404 *
2405 * **Note:** This method is loosely based on the
2406 * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
2407 * and supports cloning arrays, array buffers, booleans, date objects, maps,
2408 * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
2409 * arrays. The own enumerable properties of `arguments` objects are cloned
2410 * as plain objects. An empty object is returned for uncloneable values such
2411 * as error objects, functions, DOM nodes, and WeakMaps.
2412 *
2413 * @static
2414 * @memberOf _
2415 * @since 0.1.0
2416 * @category Lang
2417 * @param {*} value The value to clone.
2418 * @returns {*} Returns the cloned value.
2419 * @see _.cloneDeep
2420 * @example
2421 *
2422 * var objects = [{ 'a': 1 }, { 'b': 2 }];
2423 *
2424 * var shallow = _.clone(objects);
2425 * console.log(shallow[0] === objects[0]);
2426 * // => true
2427 */
2428 function clone(value) {
2429 if (!isObject(value)) {
2430 return value;
2431 }
2432 return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
2433 }
2434
2435 /**
2436 * Performs a
2437 * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2438 * comparison between two values to determine if they are equivalent.
2439 *
2440 * @static
2441 * @memberOf _
2442 * @since 4.0.0
2443 * @category Lang
2444 * @param {*} value The value to compare.
2445 * @param {*} other The other value to compare.
2446 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2447 * @example
2448 *
2449 * var object = { 'a': 1 };
2450 * var other = { 'a': 1 };
2451 *
2452 * _.eq(object, object);
2453 * // => true
2454 *
2455 * _.eq(object, other);
2456 * // => false
2457 *
2458 * _.eq('a', 'a');
2459 * // => true
2460 *
2461 * _.eq('a', Object('a'));
2462 * // => false
2463 *
2464 * _.eq(NaN, NaN);
2465 * // => true
2466 */
2467 function eq(value, other) {
2468 return value === other || (value !== value && other !== other);
2469 }
2470
2471 /**
2472 * Checks if `value` is likely an `arguments` object.
2473 *
2474 * @static
2475 * @memberOf _
2476 * @since 0.1.0
2477 * @category Lang
2478 * @param {*} value The value to check.
2479 * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2480 * else `false`.
2481 * @example
2482 *
2483 * _.isArguments(function() { return arguments; }());
2484 * // => true
2485 *
2486 * _.isArguments([1, 2, 3]);
2487 * // => false
2488 */
2489 var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2490 return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2491 !propertyIsEnumerable.call(value, 'callee');
2492 };
2493
2494 /**
2495 * Checks if `value` is classified as an `Array` object.
2496 *
2497 * @static
2498 * @memberOf _
2499 * @since 0.1.0
2500 * @category Lang
2501 * @param {*} value The value to check.
2502 * @returns {boolean} Returns `true` if `value` is an array, else `false`.
2503 * @example
2504 *
2505 * _.isArray([1, 2, 3]);
2506 * // => true
2507 *
2508 * _.isArray(document.body.children);
2509 * // => false
2510 *
2511 * _.isArray('abc');
2512 * // => false
2513 *
2514 * _.isArray(_.noop);
2515 * // => false
2516 */
2517 var isArray = Array.isArray;
2518
2519 /**
2520 * Checks if `value` is array-like. A value is considered array-like if it's
2521 * not a function and has a `value.length` that's an integer greater than or
2522 * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2523 *
2524 * @static
2525 * @memberOf _
2526 * @since 4.0.0
2527 * @category Lang
2528 * @param {*} value The value to check.
2529 * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2530 * @example
2531 *
2532 * _.isArrayLike([1, 2, 3]);
2533 * // => true
2534 *
2535 * _.isArrayLike(document.body.children);
2536 * // => true
2537 *
2538 * _.isArrayLike('abc');
2539 * // => true
2540 *
2541 * _.isArrayLike(_.noop);
2542 * // => false
2543 */
2544 function isArrayLike(value) {
2545 return value != null && isLength(value.length) && !isFunction(value);
2546 }
2547
2548 /**
2549 * Checks if `value` is classified as a boolean primitive or object.
2550 *
2551 * @static
2552 * @memberOf _
2553 * @since 0.1.0
2554 * @category Lang
2555 * @param {*} value The value to check.
2556 * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
2557 * @example
2558 *
2559 * _.isBoolean(false);
2560 * // => true
2561 *
2562 * _.isBoolean(null);
2563 * // => false
2564 */
2565 function isBoolean(value) {
2566 return value === true || value === false ||
2567 (isObjectLike(value) && baseGetTag(value) == boolTag);
2568 }
2569
2570 /**
2571 * Checks if `value` is classified as a `Date` object.
2572 *
2573 * @static
2574 * @memberOf _
2575 * @since 0.1.0
2576 * @category Lang
2577 * @param {*} value The value to check.
2578 * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
2579 * @example
2580 *
2581 * _.isDate(new Date);
2582 * // => true
2583 *
2584 * _.isDate('Mon April 23 2012');
2585 * // => false
2586 */
2587 var isDate = baseIsDate;
2588
2589 /**
2590 * Checks if `value` is an empty object, collection, map, or set.
2591 *
2592 * Objects are considered empty if they have no own enumerable string keyed
2593 * properties.
2594 *
2595 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
2596 * jQuery-like collections are considered empty if they have a `length` of `0`.
2597 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
2598 *
2599 * @static
2600 * @memberOf _
2601 * @since 0.1.0
2602 * @category Lang
2603 * @param {*} value The value to check.
2604 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
2605 * @example
2606 *
2607 * _.isEmpty(null);
2608 * // => true
2609 *
2610 * _.isEmpty(true);
2611 * // => true
2612 *
2613 * _.isEmpty(1);
2614 * // => true
2615 *
2616 * _.isEmpty([1, 2, 3]);
2617 * // => false
2618 *
2619 * _.isEmpty({ 'a': 1 });
2620 * // => false
2621 */
2622 function isEmpty(value) {
2623 if (isArrayLike(value) &&
2624 (isArray(value) || isString(value) ||
2625 isFunction(value.splice) || isArguments(value))) {
2626 return !value.length;
2627 }
2628 return !nativeKeys(value).length;
2629 }
2630
2631 /**
2632 * Performs a deep comparison between two values to determine if they are
2633 * equivalent.
2634 *
2635 * **Note:** This method supports comparing arrays, array buffers, booleans,
2636 * date objects, error objects, maps, numbers, `Object` objects, regexes,
2637 * sets, strings, symbols, and typed arrays. `Object` objects are compared
2638 * by their own, not inherited, enumerable properties. Functions and DOM
2639 * nodes are compared by strict equality, i.e. `===`.
2640 *
2641 * @static
2642 * @memberOf _
2643 * @since 0.1.0
2644 * @category Lang
2645 * @param {*} value The value to compare.
2646 * @param {*} other The other value to compare.
2647 * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2648 * @example
2649 *
2650 * var object = { 'a': 1 };
2651 * var other = { 'a': 1 };
2652 *
2653 * _.isEqual(object, other);
2654 * // => true
2655 *
2656 * object === other;
2657 * // => false
2658 */
2659 function isEqual(value, other) {
2660 return baseIsEqual(value, other);
2661 }
2662
2663 /**
2664 * Checks if `value` is a finite primitive number.
2665 *
2666 * **Note:** This method is based on
2667 * [`Number.isFinite`](https://mdn.io/Number/isFinite).
2668 *
2669 * @static
2670 * @memberOf _
2671 * @since 0.1.0
2672 * @category Lang
2673 * @param {*} value The value to check.
2674 * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
2675 * @example
2676 *
2677 * _.isFinite(3);
2678 * // => true
2679 *
2680 * _.isFinite(Number.MIN_VALUE);
2681 * // => true
2682 *
2683 * _.isFinite(Infinity);
2684 * // => false
2685 *
2686 * _.isFinite('3');
2687 * // => false
2688 */
2689 function isFinite(value) {
2690 return typeof value == 'number' && nativeIsFinite(value);
2691 }
2692
2693 /**
2694 * Checks if `value` is classified as a `Function` object.
2695 *
2696 * @static
2697 * @memberOf _
2698 * @since 0.1.0
2699 * @category Lang
2700 * @param {*} value The value to check.
2701 * @returns {boolean} Returns `true` if `value` is a function, else `false`.
2702 * @example
2703 *
2704 * _.isFunction(_);
2705 * // => true
2706 *
2707 * _.isFunction(/abc/);
2708 * // => false
2709 */
2710 function isFunction(value) {
2711 if (!isObject(value)) {
2712 return false;
2713 }
2714 // The use of `Object#toString` avoids issues with the `typeof` operator
2715 // in Safari 9 which returns 'object' for typed arrays and other constructors.
2716 var tag = baseGetTag(value);
2717 return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
2718 }
2719
2720 /**
2721 * Checks if `value` is a valid array-like length.
2722 *
2723 * **Note:** This method is loosely based on
2724 * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
2725 *
2726 * @static
2727 * @memberOf _
2728 * @since 4.0.0
2729 * @category Lang
2730 * @param {*} value The value to check.
2731 * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
2732 * @example
2733 *
2734 * _.isLength(3);
2735 * // => true
2736 *
2737 * _.isLength(Number.MIN_VALUE);
2738 * // => false
2739 *
2740 * _.isLength(Infinity);
2741 * // => false
2742 *
2743 * _.isLength('3');
2744 * // => false
2745 */
2746 function isLength(value) {
2747 return typeof value == 'number' &&
2748 value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
2749 }
2750
2751 /**
2752 * Checks if `value` is the
2753 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
2754 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
2755 *
2756 * @static
2757 * @memberOf _
2758 * @since 0.1.0
2759 * @category Lang
2760 * @param {*} value The value to check.
2761 * @returns {boolean} Returns `true` if `value` is an object, else `false`.
2762 * @example
2763 *
2764 * _.isObject({});
2765 * // => true
2766 *
2767 * _.isObject([1, 2, 3]);
2768 * // => true
2769 *
2770 * _.isObject(_.noop);
2771 * // => true
2772 *
2773 * _.isObject(null);
2774 * // => false
2775 */
2776 function isObject(value) {
2777 var type = typeof value;
2778 return value != null && (type == 'object' || type == 'function');
2779 }
2780
2781 /**
2782 * Checks if `value` is object-like. A value is object-like if it's not `null`
2783 * and has a `typeof` result of "object".
2784 *
2785 * @static
2786 * @memberOf _
2787 * @since 4.0.0
2788 * @category Lang
2789 * @param {*} value The value to check.
2790 * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2791 * @example
2792 *
2793 * _.isObjectLike({});
2794 * // => true
2795 *
2796 * _.isObjectLike([1, 2, 3]);
2797 * // => true
2798 *
2799 * _.isObjectLike(_.noop);
2800 * // => false
2801 *
2802 * _.isObjectLike(null);
2803 * // => false
2804 */
2805 function isObjectLike(value) {
2806 return value != null && typeof value == 'object';
2807 }
2808
2809 /**
2810 * Checks if `value` is `NaN`.
2811 *
2812 * **Note:** This method is based on
2813 * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
2814 * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
2815 * `undefined` and other non-number values.
2816 *
2817 * @static
2818 * @memberOf _
2819 * @since 0.1.0
2820 * @category Lang
2821 * @param {*} value The value to check.
2822 * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2823 * @example
2824 *
2825 * _.isNaN(NaN);
2826 * // => true
2827 *
2828 * _.isNaN(new Number(NaN));
2829 * // => true
2830 *
2831 * isNaN(undefined);
2832 * // => true
2833 *
2834 * _.isNaN(undefined);
2835 * // => false
2836 */
2837 function isNaN(value) {
2838 // An `NaN` primitive is the only value that is not equal to itself.
2839 // Perform the `toStringTag` check first to avoid errors with some
2840 // ActiveX objects in IE.
2841 return isNumber(value) && value != +value;
2842 }
2843
2844 /**
2845 * Checks if `value` is `null`.
2846 *
2847 * @static
2848 * @memberOf _
2849 * @since 0.1.0
2850 * @category Lang
2851 * @param {*} value The value to check.
2852 * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
2853 * @example
2854 *
2855 * _.isNull(null);
2856 * // => true
2857 *
2858 * _.isNull(void 0);
2859 * // => false
2860 */
2861 function isNull(value) {
2862 return value === null;
2863 }
2864
2865 /**
2866 * Checks if `value` is classified as a `Number` primitive or object.
2867 *
2868 * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
2869 * classified as numbers, use the `_.isFinite` method.
2870 *
2871 * @static
2872 * @memberOf _
2873 * @since 0.1.0
2874 * @category Lang
2875 * @param {*} value The value to check.
2876 * @returns {boolean} Returns `true` if `value` is a number, else `false`.
2877 * @example
2878 *
2879 * _.isNumber(3);
2880 * // => true
2881 *
2882 * _.isNumber(Number.MIN_VALUE);
2883 * // => true
2884 *
2885 * _.isNumber(Infinity);
2886 * // => true
2887 *
2888 * _.isNumber('3');
2889 * // => false
2890 */
2891 function isNumber(value) {
2892 return typeof value == 'number' ||
2893 (isObjectLike(value) && baseGetTag(value) == numberTag);
2894 }
2895
2896 /**
2897 * Checks if `value` is classified as a `RegExp` object.
2898 *
2899 * @static
2900 * @memberOf _
2901 * @since 0.1.0
2902 * @category Lang
2903 * @param {*} value The value to check.
2904 * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
2905 * @example
2906 *
2907 * _.isRegExp(/abc/);
2908 * // => true
2909 *
2910 * _.isRegExp('/abc/');
2911 * // => false
2912 */
2913 var isRegExp = baseIsRegExp;
2914
2915 /**
2916 * Checks if `value` is classified as a `String` primitive or object.
2917 *
2918 * @static
2919 * @since 0.1.0
2920 * @memberOf _
2921 * @category Lang
2922 * @param {*} value The value to check.
2923 * @returns {boolean} Returns `true` if `value` is a string, else `false`.
2924 * @example
2925 *
2926 * _.isString('abc');
2927 * // => true
2928 *
2929 * _.isString(1);
2930 * // => false
2931 */
2932 function isString(value) {
2933 return typeof value == 'string' ||
2934 (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
2935 }
2936
2937 /**
2938 * Checks if `value` is `undefined`.
2939 *
2940 * @static
2941 * @since 0.1.0
2942 * @memberOf _
2943 * @category Lang
2944 * @param {*} value The value to check.
2945 * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
2946 * @example
2947 *
2948 * _.isUndefined(void 0);
2949 * // => true
2950 *
2951 * _.isUndefined(null);
2952 * // => false
2953 */
2954 function isUndefined(value) {
2955 return value === undefined;
2956 }
2957
2958 /**
2959 * Converts `value` to an array.
2960 *
2961 * @static
2962 * @since 0.1.0
2963 * @memberOf _
2964 * @category Lang
2965 * @param {*} value The value to convert.
2966 * @returns {Array} Returns the converted array.
2967 * @example
2968 *
2969 * _.toArray({ 'a': 1, 'b': 2 });
2970 * // => [1, 2]
2971 *
2972 * _.toArray('abc');
2973 * // => ['a', 'b', 'c']
2974 *
2975 * _.toArray(1);
2976 * // => []
2977 *
2978 * _.toArray(null);
2979 * // => []
2980 */
2981 function toArray(value) {
2982 if (!isArrayLike(value)) {
2983 return values(value);
2984 }
2985 return value.length ? copyArray(value) : [];
2986 }
2987
2988 /**
2989 * Converts `value` to an integer.
2990 *
2991 * **Note:** This method is loosely based on
2992 * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
2993 *
2994 * @static
2995 * @memberOf _
2996 * @since 4.0.0
2997 * @category Lang
2998 * @param {*} value The value to convert.
2999 * @returns {number} Returns the converted integer.
3000 * @example
3001 *
3002 * _.toInteger(3.2);
3003 * // => 3
3004 *
3005 * _.toInteger(Number.MIN_VALUE);
3006 * // => 0
3007 *
3008 * _.toInteger(Infinity);
3009 * // => 1.7976931348623157e+308
3010 *
3011 * _.toInteger('3.2');
3012 * // => 3
3013 */
3014 var toInteger = Number;
3015
3016 /**
3017 * Converts `value` to a number.
3018 *
3019 * @static
3020 * @memberOf _
3021 * @since 4.0.0
3022 * @category Lang
3023 * @param {*} value The value to process.
3024 * @returns {number} Returns the number.
3025 * @example
3026 *
3027 * _.toNumber(3.2);
3028 * // => 3.2
3029 *
3030 * _.toNumber(Number.MIN_VALUE);
3031 * // => 5e-324
3032 *
3033 * _.toNumber(Infinity);
3034 * // => Infinity
3035 *
3036 * _.toNumber('3.2');
3037 * // => 3.2
3038 */
3039 var toNumber = Number;
3040
3041 /**
3042 * Converts `value` to a string. An empty string is returned for `null`
3043 * and `undefined` values. The sign of `-0` is preserved.
3044 *
3045 * @static
3046 * @memberOf _
3047 * @since 4.0.0
3048 * @category Lang
3049 * @param {*} value The value to convert.
3050 * @returns {string} Returns the converted string.
3051 * @example
3052 *
3053 * _.toString(null);
3054 * // => ''
3055 *
3056 * _.toString(-0);
3057 * // => '-0'
3058 *
3059 * _.toString([1, 2, 3]);
3060 * // => '1,2,3'
3061 */
3062 function toString(value) {
3063 if (typeof value == 'string') {
3064 return value;
3065 }
3066 return value == null ? '' : (value + '');
3067 }
3068
3069 /*------------------------------------------------------------------------*/
3070
3071 /**
3072 * Assigns own enumerable string keyed properties of source objects to the
3073 * destination object. Source objects are applied from left to right.
3074 * Subsequent sources overwrite property assignments of previous sources.
3075 *
3076 * **Note:** This method mutates `object` and is loosely based on
3077 * [`Object.assign`](https://mdn.io/Object/assign).
3078 *
3079 * @static
3080 * @memberOf _
3081 * @since 0.10.0
3082 * @category Object
3083 * @param {Object} object The destination object.
3084 * @param {...Object} [sources] The source objects.
3085 * @returns {Object} Returns `object`.
3086 * @see _.assignIn
3087 * @example
3088 *
3089 * function Foo() {
3090 * this.a = 1;
3091 * }
3092 *
3093 * function Bar() {
3094 * this.c = 3;
3095 * }
3096 *
3097 * Foo.prototype.b = 2;
3098 * Bar.prototype.d = 4;
3099 *
3100 * _.assign({ 'a': 0 }, new Foo, new Bar);
3101 * // => { 'a': 1, 'c': 3 }
3102 */
3103 var assign = createAssigner(function(object, source) {
3104 copyObject(source, nativeKeys(source), object);
3105 });
3106
3107 /**
3108 * This method is like `_.assign` except that it iterates over own and
3109 * inherited source properties.
3110 *
3111 * **Note:** This method mutates `object`.
3112 *
3113 * @static
3114 * @memberOf _
3115 * @since 4.0.0
3116 * @alias extend
3117 * @category Object
3118 * @param {Object} object The destination object.
3119 * @param {...Object} [sources] The source objects.
3120 * @returns {Object} Returns `object`.
3121 * @see _.assign
3122 * @example
3123 *
3124 * function Foo() {
3125 * this.a = 1;
3126 * }
3127 *
3128 * function Bar() {
3129 * this.c = 3;
3130 * }
3131 *
3132 * Foo.prototype.b = 2;
3133 * Bar.prototype.d = 4;
3134 *
3135 * _.assignIn({ 'a': 0 }, new Foo, new Bar);
3136 * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
3137 */
3138 var assignIn = createAssigner(function(object, source) {
3139 copyObject(source, nativeKeysIn(source), object);
3140 });
3141
3142 /**
3143 * Creates an object that inherits from the `prototype` object. If a
3144 * `properties` object is given, its own enumerable string keyed properties
3145 * are assigned to the created object.
3146 *
3147 * @static
3148 * @memberOf _
3149 * @since 2.3.0
3150 * @category Object
3151 * @param {Object} prototype The object to inherit from.
3152 * @param {Object} [properties] The properties to assign to the object.
3153 * @returns {Object} Returns the new object.
3154 * @example
3155 *
3156 * function Shape() {
3157 * this.x = 0;
3158 * this.y = 0;
3159 * }
3160 *
3161 * function Circle() {
3162 * Shape.call(this);
3163 * }
3164 *
3165 * Circle.prototype = _.create(Shape.prototype, {
3166 * 'constructor': Circle
3167 * });
3168 *
3169 * var circle = new Circle;
3170 * circle instanceof Circle;
3171 * // => true
3172 *
3173 * circle instanceof Shape;
3174 * // => true
3175 */
3176 function create(prototype, properties) {
3177 var result = baseCreate(prototype);
3178 return properties == null ? result : assign(result, properties);
3179 }
3180
3181 /**
3182 * Assigns own and inherited enumerable string keyed properties of source
3183 * objects to the destination object for all destination properties that
3184 * resolve to `undefined`. Source objects are applied from left to right.
3185 * Once a property is set, additional values of the same property are ignored.
3186 *
3187 * **Note:** This method mutates `object`.
3188 *
3189 * @static
3190 * @since 0.1.0
3191 * @memberOf _
3192 * @category Object
3193 * @param {Object} object The destination object.
3194 * @param {...Object} [sources] The source objects.
3195 * @returns {Object} Returns `object`.
3196 * @see _.defaultsDeep
3197 * @example
3198 *
3199 * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
3200 * // => { 'a': 1, 'b': 2 }
3201 */
3202 var defaults = baseRest(function(object, sources) {
3203 object = Object(object);
3204
3205 var index = -1;
3206 var length = sources.length;
3207 var guard = length > 2 ? sources[2] : undefined;
3208
3209 if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3210 length = 1;
3211 }
3212
3213 while (++index < length) {
3214 var source = sources[index];
3215 var props = keysIn(source);
3216 var propsIndex = -1;
3217 var propsLength = props.length;
3218
3219 while (++propsIndex < propsLength) {
3220 var key = props[propsIndex];
3221 var value = object[key];
3222
3223 if (value === undefined ||
3224 (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
3225 object[key] = source[key];
3226 }
3227 }
3228 }
3229
3230 return object;
3231 });
3232
3233 /**
3234 * Checks if `path` is a direct property of `object`.
3235 *
3236 * @static
3237 * @since 0.1.0
3238 * @memberOf _
3239 * @category Object
3240 * @param {Object} object The object to query.
3241 * @param {Array|string} path The path to check.
3242 * @returns {boolean} Returns `true` if `path` exists, else `false`.
3243 * @example
3244 *
3245 * var object = { 'a': { 'b': 2 } };
3246 * var other = _.create({ 'a': _.create({ 'b': 2 }) });
3247 *
3248 * _.has(object, 'a');
3249 * // => true
3250 *
3251 * _.has(object, 'a.b');
3252 * // => true
3253 *
3254 * _.has(object, ['a', 'b']);
3255 * // => true
3256 *
3257 * _.has(other, 'a');
3258 * // => false
3259 */
3260 function has(object, path) {
3261 return object != null && hasOwnProperty.call(object, path);
3262 }
3263
3264 /**
3265 * Creates an array of the own enumerable property names of `object`.
3266 *
3267 * **Note:** Non-object values are coerced to objects. See the
3268 * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
3269 * for more details.
3270 *
3271 * @static
3272 * @since 0.1.0
3273 * @memberOf _
3274 * @category Object
3275 * @param {Object} object The object to query.
3276 * @returns {Array} Returns the array of property names.
3277 * @example
3278 *
3279 * function Foo() {
3280 * this.a = 1;
3281 * this.b = 2;
3282 * }
3283 *
3284 * Foo.prototype.c = 3;
3285 *
3286 * _.keys(new Foo);
3287 * // => ['a', 'b'] (iteration order is not guaranteed)
3288 *
3289 * _.keys('hi');
3290 * // => ['0', '1']
3291 */
3292 var keys = nativeKeys;
3293
3294 /**
3295 * Creates an array of the own and inherited enumerable property names of `object`.
3296 *
3297 * **Note:** Non-object values are coerced to objects.
3298 *
3299 * @static
3300 * @memberOf _
3301 * @since 3.0.0
3302 * @category Object
3303 * @param {Object} object The object to query.
3304 * @returns {Array} Returns the array of property names.
3305 * @example
3306 *
3307 * function Foo() {
3308 * this.a = 1;
3309 * this.b = 2;
3310 * }
3311 *
3312 * Foo.prototype.c = 3;
3313 *
3314 * _.keysIn(new Foo);
3315 * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
3316 */
3317 var keysIn = nativeKeysIn;
3318
3319 /**
3320 * Creates an object composed of the picked `object` properties.
3321 *
3322 * @static
3323 * @since 0.1.0
3324 * @memberOf _
3325 * @category Object
3326 * @param {Object} object The source object.
3327 * @param {...(string|string[])} [paths] The property paths to pick.
3328 * @returns {Object} Returns the new object.
3329 * @example
3330 *
3331 * var object = { 'a': 1, 'b': '2', 'c': 3 };
3332 *
3333 * _.pick(object, ['a', 'c']);
3334 * // => { 'a': 1, 'c': 3 }
3335 */
3336 var pick = flatRest(function(object, paths) {
3337 return object == null ? {} : basePick(object, paths);
3338 });
3339
3340 /**
3341 * This method is like `_.get` except that if the resolved value is a
3342 * function it's invoked with the `this` binding of its parent object and
3343 * its result is returned.
3344 *
3345 * @static
3346 * @since 0.1.0
3347 * @memberOf _
3348 * @category Object
3349 * @param {Object} object The object to query.
3350 * @param {Array|string} path The path of the property to resolve.
3351 * @param {*} [defaultValue] The value returned for `undefined` resolved values.
3352 * @returns {*} Returns the resolved value.
3353 * @example
3354 *
3355 * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
3356 *
3357 * _.result(object, 'a[0].b.c1');
3358 * // => 3
3359 *
3360 * _.result(object, 'a[0].b.c2');
3361 * // => 4
3362 *
3363 * _.result(object, 'a[0].b.c3', 'default');
3364 * // => 'default'
3365 *
3366 * _.result(object, 'a[0].b.c3', _.constant('default'));
3367 * // => 'default'
3368 */
3369 function result(object, path, defaultValue) {
3370 var value = object == null ? undefined : object[path];
3371 if (value === undefined) {
3372 value = defaultValue;
3373 }
3374 return isFunction(value) ? value.call(object) : value;
3375 }
3376
3377 /**
3378 * Creates an array of the own enumerable string keyed property values of `object`.
3379 *
3380 * **Note:** Non-object values are coerced to objects.
3381 *
3382 * @static
3383 * @since 0.1.0
3384 * @memberOf _
3385 * @category Object
3386 * @param {Object} object The object to query.
3387 * @returns {Array} Returns the array of property values.
3388 * @example
3389 *
3390 * function Foo() {
3391 * this.a = 1;
3392 * this.b = 2;
3393 * }
3394 *
3395 * Foo.prototype.c = 3;
3396 *
3397 * _.values(new Foo);
3398 * // => [1, 2] (iteration order is not guaranteed)
3399 *
3400 * _.values('hi');
3401 * // => ['h', 'i']
3402 */
3403 function values(object) {
3404 return object == null ? [] : baseValues(object, keys(object));
3405 }
3406
3407 /*------------------------------------------------------------------------*/
3408
3409 /**
3410 * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
3411 * corresponding HTML entities.
3412 *
3413 * **Note:** No other characters are escaped. To escape additional
3414 * characters use a third-party library like [_he_](https://mths.be/he).
3415 *
3416 * Though the ">" character is escaped for symmetry, characters like
3417 * ">" and "/" don't need escaping in HTML and have no special meaning
3418 * unless they're part of a tag or unquoted attribute value. See
3419 * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
3420 * (under "semi-related fun fact") for more details.
3421 *
3422 * When working with HTML you should always
3423 * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
3424 * XSS vectors.
3425 *
3426 * @static
3427 * @since 0.1.0
3428 * @memberOf _
3429 * @category String
3430 * @param {string} [string=''] The string to escape.
3431 * @returns {string} Returns the escaped string.
3432 * @example
3433 *
3434 * _.escape('fred, barney, & pebbles');
3435 * // => 'fred, barney, &amp; pebbles'
3436 */
3437 function escape(string) {
3438 string = toString(string);
3439 return (string && reHasUnescapedHtml.test(string))
3440 ? string.replace(reUnescapedHtml, escapeHtmlChar)
3441 : string;
3442 }
3443
3444 /*------------------------------------------------------------------------*/
3445
3446 /**
3447 * This method returns the first argument it receives.
3448 *
3449 * @static
3450 * @since 0.1.0
3451 * @memberOf _
3452 * @category Util
3453 * @param {*} value Any value.
3454 * @returns {*} Returns `value`.
3455 * @example
3456 *
3457 * var object = { 'a': 1 };
3458 *
3459 * console.log(_.identity(object) === object);
3460 * // => true
3461 */
3462 function identity(value) {
3463 return value;
3464 }
3465
3466 /**
3467 * Creates a function that invokes `func` with the arguments of the created
3468 * function. If `func` is a property name, the created function returns the
3469 * property value for a given element. If `func` is an array or object, the
3470 * created function returns `true` for elements that contain the equivalent
3471 * source properties, otherwise it returns `false`.
3472 *
3473 * @static
3474 * @since 4.0.0
3475 * @memberOf _
3476 * @category Util
3477 * @param {*} [func=_.identity] The value to convert to a callback.
3478 * @returns {Function} Returns the callback.
3479 * @example
3480 *
3481 * var users = [
3482 * { 'user': 'barney', 'age': 36, 'active': true },
3483 * { 'user': 'fred', 'age': 40, 'active': false }
3484 * ];
3485 *
3486 * // The `_.matches` iteratee shorthand.
3487 * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
3488 * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
3489 *
3490 * // The `_.matchesProperty` iteratee shorthand.
3491 * _.filter(users, _.iteratee(['user', 'fred']));
3492 * // => [{ 'user': 'fred', 'age': 40 }]
3493 *
3494 * // The `_.property` iteratee shorthand.
3495 * _.map(users, _.iteratee('user'));
3496 * // => ['barney', 'fred']
3497 *
3498 * // Create custom iteratee shorthands.
3499 * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
3500 * return !_.isRegExp(func) ? iteratee(func) : function(string) {
3501 * return func.test(string);
3502 * };
3503 * });
3504 *
3505 * _.filter(['abc', 'def'], /ef/);
3506 * // => ['def']
3507 */
3508 var iteratee = baseIteratee;
3509
3510 /**
3511 * Creates a function that performs a partial deep comparison between a given
3512 * object and `source`, returning `true` if the given object has equivalent
3513 * property values, else `false`.
3514 *
3515 * **Note:** The created function is equivalent to `_.isMatch` with `source`
3516 * partially applied.
3517 *
3518 * Partial comparisons will match empty array and empty object `source`
3519 * values against any array or object value, respectively. See `_.isEqual`
3520 * for a list of supported value comparisons.
3521 *
3522 * **Note:** Multiple values can be checked by combining several matchers
3523 * using `_.overSome`
3524 *
3525 * @static
3526 * @memberOf _
3527 * @since 3.0.0
3528 * @category Util
3529 * @param {Object} source The object of property values to match.
3530 * @returns {Function} Returns the new spec function.
3531 * @example
3532 *
3533 * var objects = [
3534 * { 'a': 1, 'b': 2, 'c': 3 },
3535 * { 'a': 4, 'b': 5, 'c': 6 }
3536 * ];
3537 *
3538 * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
3539 * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
3540 *
3541 * // Checking for several possible values
3542 * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
3543 * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
3544 */
3545 function matches(source) {
3546 return baseMatches(assign({}, source));
3547 }
3548
3549 /**
3550 * Adds all own enumerable string keyed function properties of a source
3551 * object to the destination object. If `object` is a function, then methods
3552 * are added to its prototype as well.
3553 *
3554 * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
3555 * avoid conflicts caused by modifying the original.
3556 *
3557 * @static
3558 * @since 0.1.0
3559 * @memberOf _
3560 * @category Util
3561 * @param {Function|Object} [object=lodash] The destination object.
3562 * @param {Object} source The object of functions to add.
3563 * @param {Object} [options={}] The options object.
3564 * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
3565 * @returns {Function|Object} Returns `object`.
3566 * @example
3567 *
3568 * function vowels(string) {
3569 * return _.filter(string, function(v) {
3570 * return /[aeiou]/i.test(v);
3571 * });
3572 * }
3573 *
3574 * _.mixin({ 'vowels': vowels });
3575 * _.vowels('fred');
3576 * // => ['e']
3577 *
3578 * _('fred').vowels().value();
3579 * // => ['e']
3580 *
3581 * _.mixin({ 'vowels': vowels }, { 'chain': false });
3582 * _('fred').vowels();
3583 * // => ['e']
3584 */
3585 function mixin(object, source, options) {
3586 var props = keys(source),
3587 methodNames = baseFunctions(source, props);
3588
3589 if (options == null &&
3590 !(isObject(source) && (methodNames.length || !props.length))) {
3591 options = source;
3592 source = object;
3593 object = this;
3594 methodNames = baseFunctions(source, keys(source));
3595 }
3596 var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
3597 isFunc = isFunction(object);
3598
3599 baseEach(methodNames, function(methodName) {
3600 var func = source[methodName];
3601 object[methodName] = func;
3602 if (isFunc) {
3603 object.prototype[methodName] = function() {
3604 var chainAll = this.__chain__;
3605 if (chain || chainAll) {
3606 var result = object(this.__wrapped__),
3607 actions = result.__actions__ = copyArray(this.__actions__);
3608
3609 actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
3610 result.__chain__ = chainAll;
3611 return result;
3612 }
3613 return func.apply(object, arrayPush([this.value()], arguments));
3614 };
3615 }
3616 });
3617
3618 return object;
3619 }
3620
3621 /**
3622 * Reverts the `_` variable to its previous value and returns a reference to
3623 * the `lodash` function.
3624 *
3625 * @static
3626 * @since 0.1.0
3627 * @memberOf _
3628 * @category Util
3629 * @returns {Function} Returns the `lodash` function.
3630 * @example
3631 *
3632 * var lodash = _.noConflict();
3633 */
3634 function noConflict() {
3635 if (root._ === this) {
3636 root._ = oldDash;
3637 }
3638 return this;
3639 }
3640
3641 /**
3642 * This method returns `undefined`.
3643 *
3644 * @static
3645 * @memberOf _
3646 * @since 2.3.0
3647 * @category Util
3648 * @example
3649 *
3650 * _.times(2, _.noop);
3651 * // => [undefined, undefined]
3652 */
3653 function noop() {
3654 // No operation performed.
3655 }
3656
3657 /**
3658 * Generates a unique ID. If `prefix` is given, the ID is appended to it.
3659 *
3660 * @static
3661 * @since 0.1.0
3662 * @memberOf _
3663 * @category Util
3664 * @param {string} [prefix=''] The value to prefix the ID with.
3665 * @returns {string} Returns the unique ID.
3666 * @example
3667 *
3668 * _.uniqueId('contact_');
3669 * // => 'contact_104'
3670 *
3671 * _.uniqueId();
3672 * // => '105'
3673 */
3674 function uniqueId(prefix) {
3675 var id = ++idCounter;
3676 return toString(prefix) + id;
3677 }
3678
3679 /*------------------------------------------------------------------------*/
3680
3681 /**
3682 * Computes the maximum value of `array`. If `array` is empty or falsey,
3683 * `undefined` is returned.
3684 *
3685 * @static
3686 * @since 0.1.0
3687 * @memberOf _
3688 * @category Math
3689 * @param {Array} array The array to iterate over.
3690 * @returns {*} Returns the maximum value.
3691 * @example
3692 *
3693 * _.max([4, 2, 8, 6]);
3694 * // => 8
3695 *
3696 * _.max([]);
3697 * // => undefined
3698 */
3699 function max(array) {
3700 return (array && array.length)
3701 ? baseExtremum(array, identity, baseGt)
3702 : undefined;
3703 }
3704
3705 /**
3706 * Computes the minimum value of `array`. If `array` is empty or falsey,
3707 * `undefined` is returned.
3708 *
3709 * @static
3710 * @since 0.1.0
3711 * @memberOf _
3712 * @category Math
3713 * @param {Array} array The array to iterate over.
3714 * @returns {*} Returns the minimum value.
3715 * @example
3716 *
3717 * _.min([4, 2, 8, 6]);
3718 * // => 2
3719 *
3720 * _.min([]);
3721 * // => undefined
3722 */
3723 function min(array) {
3724 return (array && array.length)
3725 ? baseExtremum(array, identity, baseLt)
3726 : undefined;
3727 }
3728
3729 /*------------------------------------------------------------------------*/
3730
3731 // Add methods that return wrapped values in chain sequences.
3732 lodash.assignIn = assignIn;
3733 lodash.before = before;
3734 lodash.bind = bind;
3735 lodash.chain = chain;
3736 lodash.compact = compact;
3737 lodash.concat = concat;
3738 lodash.create = create;
3739 lodash.defaults = defaults;
3740 lodash.defer = defer;
3741 lodash.delay = delay;
3742 lodash.filter = filter;
3743 lodash.flatten = flatten;
3744 lodash.flattenDeep = flattenDeep;
3745 lodash.iteratee = iteratee;
3746 lodash.keys = keys;
3747 lodash.map = map;
3748 lodash.matches = matches;
3749 lodash.mixin = mixin;
3750 lodash.negate = negate;
3751 lodash.once = once;
3752 lodash.pick = pick;
3753 lodash.slice = slice;
3754 lodash.sortBy = sortBy;
3755 lodash.tap = tap;
3756 lodash.thru = thru;
3757 lodash.toArray = toArray;
3758 lodash.values = values;
3759
3760 // Add aliases.
3761 lodash.extend = assignIn;
3762
3763 // Add methods to `lodash.prototype`.
3764 mixin(lodash, lodash);
3765
3766 /*------------------------------------------------------------------------*/
3767
3768 // Add methods that return unwrapped values in chain sequences.
3769 lodash.clone = clone;
3770 lodash.escape = escape;
3771 lodash.every = every;
3772 lodash.find = find;
3773 lodash.forEach = forEach;
3774 lodash.has = has;
3775 lodash.head = head;
3776 lodash.identity = identity;
3777 lodash.indexOf = indexOf;
3778 lodash.isArguments = isArguments;
3779 lodash.isArray = isArray;
3780 lodash.isBoolean = isBoolean;
3781 lodash.isDate = isDate;
3782 lodash.isEmpty = isEmpty;
3783 lodash.isEqual = isEqual;
3784 lodash.isFinite = isFinite;
3785 lodash.isFunction = isFunction;
3786 lodash.isNaN = isNaN;
3787 lodash.isNull = isNull;
3788 lodash.isNumber = isNumber;
3789 lodash.isObject = isObject;
3790 lodash.isRegExp = isRegExp;
3791 lodash.isString = isString;
3792 lodash.isUndefined = isUndefined;
3793 lodash.last = last;
3794 lodash.max = max;
3795 lodash.min = min;
3796 lodash.noConflict = noConflict;
3797 lodash.noop = noop;
3798 lodash.reduce = reduce;
3799 lodash.result = result;
3800 lodash.size = size;
3801 lodash.some = some;
3802 lodash.uniqueId = uniqueId;
3803
3804 // Add aliases.
3805 lodash.each = forEach;
3806 lodash.first = head;
3807
3808 mixin(lodash, (function() {
3809 var source = {};
3810 baseForOwn(lodash, function(func, methodName) {
3811 if (!hasOwnProperty.call(lodash.prototype, methodName)) {
3812 source[methodName] = func;
3813 }
3814 });
3815 return source;
3816 }()), { 'chain': false });
3817
3818 /*------------------------------------------------------------------------*/
3819
3820 /**
3821 * The semantic version number.
3822 *
3823 * @static
3824 * @memberOf _
3825 * @type {string}
3826 */
3827 lodash.VERSION = VERSION;
3828
3829 // Add `Array` methods to `lodash.prototype`.
3830 baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
3831 var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
3832 chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
3833 retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
3834
3835 lodash.prototype[methodName] = function() {
3836 var args = arguments;
3837 if (retUnwrapped && !this.__chain__) {
3838 var value = this.value();
3839 return func.apply(isArray(value) ? value : [], args);
3840 }
3841 return this[chainName](function(value) {
3842 return func.apply(isArray(value) ? value : [], args);
3843 });
3844 };
3845 });
3846
3847 // Add chain sequence methods to the `lodash` wrapper.
3848 lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
3849
3850 /*--------------------------------------------------------------------------*/
3851
3852 // Some AMD build optimizers, like r.js, check for condition patterns like:
3853 if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
3854 // Expose Lodash on the global object to prevent errors when Lodash is
3855 // loaded by a script tag in the presence of an AMD loader.
3856 // See http://requirejs.org/docs/errors.html#mismatch for more details.
3857 // Use `_.noConflict` to remove Lodash from the global object.
3858 root._ = lodash;
3859
3860 // Define as an anonymous module so, through path mapping, it can be
3861 // referenced as the "underscore" module.
3862 define(function() {
3863 return lodash;
3864 });
3865 }
3866 // Check for `exports` after `define` in case a build optimizer adds it.
3867 else if (freeModule) {
3868 // Export for Node.js.
3869 (freeModule.exports = lodash)._ = lodash;
3870 // Export for CommonJS support.
3871 freeExports._ = lodash;
3872 }
3873 else {
3874 // Export to the global object.
3875 root._ = lodash;
3876 }
3877}.call(this));