core.js (115957B)
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 '&': '&', 58 '<': '<', 59 '>': '>', 60 '"': '"', 61 "'": ''' 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, & 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));