mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-04 08:57:49 +00:00
Bump to v4.0.0.
This commit is contained in:
17
internal/Hash.js
Normal file
17
internal/Hash.js
Normal file
@@ -0,0 +1,17 @@
|
||||
import nativeCreate from './nativeCreate';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/**
|
||||
* Creates an hash object.
|
||||
*
|
||||
* @private
|
||||
* @returns {Object} Returns the new hash object.
|
||||
*/
|
||||
function Hash() {}
|
||||
|
||||
// Avoid inheriting from `Object.prototype` when possible.
|
||||
Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto;
|
||||
|
||||
export default Hash;
|
||||
@@ -1,8 +1,8 @@
|
||||
import baseCreate from './baseCreate';
|
||||
import baseLodash from './baseLodash';
|
||||
|
||||
/** Used as references for `-Infinity` and `Infinity`. */
|
||||
var POSITIVE_INFINITY = Number.POSITIVE_INFINITY;
|
||||
/** Used as references for the maximum length and index of an array. */
|
||||
var MAX_ARRAY_LENGTH = 4294967295;
|
||||
|
||||
/**
|
||||
* Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
|
||||
@@ -16,7 +16,7 @@ function LazyWrapper(value) {
|
||||
this.__dir__ = 1;
|
||||
this.__filtered__ = false;
|
||||
this.__iteratees__ = [];
|
||||
this.__takeCount__ = POSITIVE_INFINITY;
|
||||
this.__takeCount__ = MAX_ARRAY_LENGTH;
|
||||
this.__views__ = [];
|
||||
}
|
||||
|
||||
|
||||
@@ -7,12 +7,13 @@ import baseLodash from './baseLodash';
|
||||
* @private
|
||||
* @param {*} value The value to wrap.
|
||||
* @param {boolean} [chainAll] Enable chaining for all wrapper methods.
|
||||
* @param {Array} [actions=[]] Actions to peform to resolve the unwrapped value.
|
||||
*/
|
||||
function LodashWrapper(value, chainAll, actions) {
|
||||
function LodashWrapper(value, chainAll) {
|
||||
this.__wrapped__ = value;
|
||||
this.__actions__ = actions || [];
|
||||
this.__actions__ = [];
|
||||
this.__chain__ = !!chainAll;
|
||||
this.__index__ = 0;
|
||||
this.__values__ = undefined;
|
||||
}
|
||||
|
||||
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
|
||||
|
||||
7
internal/Map.js
Normal file
7
internal/Map.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import getNative from './getNative';
|
||||
import root from './root';
|
||||
|
||||
/* Built-in method references that are verified to be native. */
|
||||
var Map = getNative(root, 'Map');
|
||||
|
||||
export default Map;
|
||||
@@ -1,21 +1,28 @@
|
||||
import mapClear from './mapClear';
|
||||
import mapDelete from './mapDelete';
|
||||
import mapGet from './mapGet';
|
||||
import mapHas from './mapHas';
|
||||
import mapSet from './mapSet';
|
||||
|
||||
/**
|
||||
* Creates a cache object to store key/value pairs.
|
||||
* Creates a map cache object to store key-value pairs.
|
||||
*
|
||||
* @private
|
||||
* @static
|
||||
* @name Cache
|
||||
* @memberOf _.memoize
|
||||
* @param {Array} [values] The values to cache.
|
||||
*/
|
||||
function MapCache() {
|
||||
this.__data__ = {};
|
||||
function MapCache(values) {
|
||||
var index = -1,
|
||||
length = values ? values.length : 0;
|
||||
|
||||
this.clear();
|
||||
while (++index < length) {
|
||||
var entry = values[index];
|
||||
this.set(entry[0], entry[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add functions to the `Map` cache.
|
||||
// Add functions to the `MapCache`.
|
||||
MapCache.prototype.clear = mapClear;
|
||||
MapCache.prototype['delete'] = mapDelete;
|
||||
MapCache.prototype.get = mapGet;
|
||||
MapCache.prototype.has = mapHas;
|
||||
|
||||
6
internal/Reflect.js
Normal file
6
internal/Reflect.js
Normal file
@@ -0,0 +1,6 @@
|
||||
import root from './root';
|
||||
|
||||
/** Built-in value references. */
|
||||
var Reflect = root.Reflect;
|
||||
|
||||
export default Reflect;
|
||||
7
internal/Set.js
Normal file
7
internal/Set.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import getNative from './getNative';
|
||||
import root from './root';
|
||||
|
||||
/* Built-in method references that are verified to be native. */
|
||||
var Set = getNative(root, 'Set');
|
||||
|
||||
export default Set;
|
||||
@@ -1,30 +1,24 @@
|
||||
import MapCache from './MapCache';
|
||||
import cachePush from './cachePush';
|
||||
import getNative from './getNative';
|
||||
import root from './root';
|
||||
|
||||
/** Native method references. */
|
||||
var Set = getNative(root, 'Set');
|
||||
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeCreate = getNative(Object, 'create');
|
||||
|
||||
/**
|
||||
*
|
||||
* Creates a cache object to store unique values.
|
||||
* Creates a set cache object to store unique values.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} [values] The values to cache.
|
||||
*/
|
||||
function SetCache(values) {
|
||||
var length = values ? values.length : 0;
|
||||
var index = -1,
|
||||
length = values ? values.length : 0;
|
||||
|
||||
this.data = { 'hash': nativeCreate(null), 'set': new Set };
|
||||
while (length--) {
|
||||
this.push(values[length]);
|
||||
this.__data__ = new MapCache;
|
||||
while (++index < length) {
|
||||
this.push(values[index]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add functions to the `Set` cache.
|
||||
// Add functions to the `SetCache`.
|
||||
SetCache.prototype.push = cachePush;
|
||||
|
||||
export default SetCache;
|
||||
|
||||
31
internal/Stack.js
Normal file
31
internal/Stack.js
Normal file
@@ -0,0 +1,31 @@
|
||||
import stackClear from './stackClear';
|
||||
import stackDelete from './stackDelete';
|
||||
import stackGet from './stackGet';
|
||||
import stackHas from './stackHas';
|
||||
import stackSet from './stackSet';
|
||||
|
||||
/**
|
||||
* Creates a stack cache object to store key-value pairs.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} [values] The values to cache.
|
||||
*/
|
||||
function Stack(values) {
|
||||
var index = -1,
|
||||
length = values ? values.length : 0;
|
||||
|
||||
this.clear();
|
||||
while (++index < length) {
|
||||
var entry = values[index];
|
||||
this.set(entry[0], entry[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add functions to the `Stack` cache.
|
||||
Stack.prototype.clear = stackClear;
|
||||
Stack.prototype['delete'] = stackDelete;
|
||||
Stack.prototype.get = stackGet;
|
||||
Stack.prototype.has = stackHas;
|
||||
Stack.prototype.set = stackSet;
|
||||
|
||||
export default Stack;
|
||||
6
internal/Uint8Array.js
Normal file
6
internal/Uint8Array.js
Normal file
@@ -0,0 +1,6 @@
|
||||
import root from './root';
|
||||
|
||||
/** Built-in value references. */
|
||||
var Uint8Array = root.Uint8Array;
|
||||
|
||||
export default Uint8Array;
|
||||
7
internal/WeakMap.js
Normal file
7
internal/WeakMap.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import getNative from './getNative';
|
||||
import root from './root';
|
||||
|
||||
/* Built-in method references that are verified to be native. */
|
||||
var WeakMap = getNative(root, 'WeakMap');
|
||||
|
||||
export default WeakMap;
|
||||
6
internal/_Symbol.js
Normal file
6
internal/_Symbol.js
Normal file
@@ -0,0 +1,6 @@
|
||||
import root from './root';
|
||||
|
||||
/** Built-in value references. */
|
||||
var _Symbol = root.Symbol;
|
||||
|
||||
export default _Symbol;
|
||||
14
internal/addMapEntry.js
Normal file
14
internal/addMapEntry.js
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Adds the key-value `pair` to `map`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} map The map to modify.
|
||||
* @param {Array} pair The key-value pair to add.
|
||||
* @returns {Object} Returns `map`.
|
||||
*/
|
||||
function addMapEntry(map, pair) {
|
||||
map.set(pair[0], pair[1]);
|
||||
return map;
|
||||
}
|
||||
|
||||
export default addMapEntry;
|
||||
14
internal/addSetEntry.js
Normal file
14
internal/addSetEntry.js
Normal file
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Adds `value` to `set`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} set The set to modify.
|
||||
* @param {*} value The value to add.
|
||||
* @returns {Object} Returns `set`.
|
||||
*/
|
||||
function addSetEntry(set, value) {
|
||||
set.add(value);
|
||||
return set;
|
||||
}
|
||||
|
||||
export default addSetEntry;
|
||||
22
internal/apply.js
Normal file
22
internal/apply.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* A faster alternative to `Function#apply`, this function invokes `func`
|
||||
* with the `this` binding of `thisArg` and the arguments of `args`.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to invoke.
|
||||
* @param {*} thisArg The `this` binding of `func`.
|
||||
* @param {...*} [args] The arguments to invoke `func` with.
|
||||
* @returns {*} Returns the result of `func`.
|
||||
*/
|
||||
function apply(func, thisArg, args) {
|
||||
var length = args ? args.length : 0;
|
||||
switch (length) {
|
||||
case 0: return func.call(thisArg);
|
||||
case 1: return func.call(thisArg, args[0]);
|
||||
case 2: return func.call(thisArg, args[0], args[1]);
|
||||
case 3: return func.call(thisArg, args[0], args[1], args[2]);
|
||||
}
|
||||
return func.apply(thisArg, args);
|
||||
}
|
||||
|
||||
export default apply;
|
||||
@@ -1,9 +1,9 @@
|
||||
/**
|
||||
* Creates a new array joining `array` with `other`.
|
||||
* Creates a new array concatenating `array` with `other`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to join.
|
||||
* @param {Array} other The other array to join.
|
||||
* @param {Array} array The first array to concatenate.
|
||||
* @param {Array} other The second array to concatenate.
|
||||
* @returns {Array} Returns the new concatenated array.
|
||||
*/
|
||||
function arrayConcat(array, other) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* A specialized version of `_.forEach` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.forEach` for arrays without support for
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* A specialized version of `_.forEachRight` for arrays without support for
|
||||
* callback shorthands and `this` binding.
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
/**
|
||||
* A specialized version of `_.every` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.every` for arrays without support for
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||
* else `false`.
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false`.
|
||||
*/
|
||||
function arrayEvery(array, predicate) {
|
||||
var index = -1,
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
/**
|
||||
* A specialized version of `baseExtremum` for arrays which invokes `iteratee`
|
||||
* with one argument: (value).
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {Function} comparator The function used to compare values.
|
||||
* @param {*} exValue The initial extremum value.
|
||||
* @returns {*} Returns the extremum value.
|
||||
*/
|
||||
function arrayExtremum(array, iteratee, comparator, exValue) {
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
computed = exValue,
|
||||
result = computed;
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index],
|
||||
current = +iteratee(value);
|
||||
|
||||
if (comparator(current, computed)) {
|
||||
computed = current;
|
||||
result = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arrayExtremum;
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* A specialized version of `_.filter` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.filter` for arrays without support for
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
|
||||
16
internal/arrayIncludes.js
Normal file
16
internal/arrayIncludes.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import baseIndexOf from './baseIndexOf';
|
||||
|
||||
/**
|
||||
* A specialized version of `_.includes` for arrays without support for
|
||||
* specifying an index to search from.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
* @param {*} target The value to search for.
|
||||
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||||
*/
|
||||
function arrayIncludes(array, value) {
|
||||
return !!array.length && baseIndexOf(array, value, 0) > -1;
|
||||
}
|
||||
|
||||
export default arrayIncludes;
|
||||
23
internal/arrayIncludesWith.js
Normal file
23
internal/arrayIncludesWith.js
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* A specialized version of `_.includesWith` for arrays without support for
|
||||
* specifying an index to search from.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
* @param {*} target The value to search for.
|
||||
* @param {Function} comparator The comparator invoked per element.
|
||||
* @returns {boolean} Returns `true` if `target` is found, else `false`.
|
||||
*/
|
||||
function arrayIncludesWith(array, value, comparator) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
while (++index < length) {
|
||||
if (comparator(value, array[index])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export default arrayIncludesWith;
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* A specialized version of `_.map` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.map` for arrays without support for iteratee
|
||||
* shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
/**
|
||||
* A specialized version of `_.reduce` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.reduce` for arrays without support for
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} [accumulator] The initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the first element of `array`
|
||||
* as the initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the first element of `array` as the initial value.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
function arrayReduce(array, iteratee, accumulator, initFromArray) {
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
/**
|
||||
* A specialized version of `_.reduceRight` for arrays without support for
|
||||
* callback shorthands and `this` binding.
|
||||
* iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} [accumulator] The initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the last element of `array`
|
||||
* as the initial value.
|
||||
* @param {boolean} [initFromArray] Specify using the last element of `array` as the initial value.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
/**
|
||||
* A specialized version of `_.some` for arrays without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* A specialized version of `_.some` for arrays without support for iteratee
|
||||
* shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||||
* else `false`.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`.
|
||||
*/
|
||||
function arraySome(array, predicate) {
|
||||
var index = -1,
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* A specialized version of `_.sum` for arrays without support for callback
|
||||
* shorthands and `this` binding..
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {number} Returns the sum.
|
||||
*/
|
||||
function arraySum(array, iteratee) {
|
||||
var length = array.length,
|
||||
result = 0;
|
||||
|
||||
while (length--) {
|
||||
result += +iteratee(array[length]) || 0;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default arraySum;
|
||||
@@ -1,13 +0,0 @@
|
||||
/**
|
||||
* Used by `_.defaults` to customize its `_.assign` use.
|
||||
*
|
||||
* @private
|
||||
* @param {*} objectValue The destination object property value.
|
||||
* @param {*} sourceValue The source object property value.
|
||||
* @returns {*} Returns the value to assign to the destination object.
|
||||
*/
|
||||
function assignDefaults(objectValue, sourceValue) {
|
||||
return objectValue === undefined ? sourceValue : objectValue;
|
||||
}
|
||||
|
||||
export default assignDefaults;
|
||||
27
internal/assignInDefaults.js
Normal file
27
internal/assignInDefaults.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import eq from '../eq';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Used by `_.defaults` to customize its `_.assignIn` use.
|
||||
*
|
||||
* @private
|
||||
* @param {*} objValue The destination value.
|
||||
* @param {*} srcValue The source value.
|
||||
* @param {string} key The key of the property to assign.
|
||||
* @param {Object} object The parent object of `objValue`.
|
||||
* @returns {*} Returns the value to assign.
|
||||
*/
|
||||
function assignInDefaults(objValue, srcValue, key, object) {
|
||||
if (objValue === undefined ||
|
||||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
|
||||
return srcValue;
|
||||
}
|
||||
return objValue;
|
||||
}
|
||||
|
||||
export default assignInDefaults;
|
||||
18
internal/assignMergeValue.js
Normal file
18
internal/assignMergeValue.js
Normal file
@@ -0,0 +1,18 @@
|
||||
import eq from '../eq';
|
||||
|
||||
/**
|
||||
* This function is like `assignValue` except that it doesn't assign `undefined` values.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to modify.
|
||||
* @param {string} key The key of the property to assign.
|
||||
* @param {*} value The value to assign.
|
||||
*/
|
||||
function assignMergeValue(object, key, value) {
|
||||
if ((value !== undefined && !eq(object[key], value)) ||
|
||||
(typeof key == 'number' && value === undefined && !(key in object))) {
|
||||
object[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
export default assignMergeValue;
|
||||
@@ -1,26 +0,0 @@
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Used by `_.template` to customize its `_.assign` use.
|
||||
*
|
||||
* **Note:** This function is like `assignDefaults` except that it ignores
|
||||
* inherited property values when checking if a property is `undefined`.
|
||||
*
|
||||
* @private
|
||||
* @param {*} objectValue The destination object property value.
|
||||
* @param {*} sourceValue The source object property value.
|
||||
* @param {string} key The key associated with the object and source values.
|
||||
* @param {Object} object The destination object.
|
||||
* @returns {*} Returns the value to assign to the destination object.
|
||||
*/
|
||||
function assignOwnDefaults(objectValue, sourceValue, key, object) {
|
||||
return (objectValue === undefined || !hasOwnProperty.call(object, key))
|
||||
? sourceValue
|
||||
: objectValue;
|
||||
}
|
||||
|
||||
export default assignOwnDefaults;
|
||||
28
internal/assignValue.js
Normal file
28
internal/assignValue.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import eq from '../eq';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Assigns `value` to `key` of `object` if the existing value is not equivalent
|
||||
* using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
|
||||
* for equality comparisons.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to modify.
|
||||
* @param {string} key The key of the property to assign.
|
||||
* @param {*} value The value to assign.
|
||||
*/
|
||||
function assignValue(object, key, value) {
|
||||
var objValue = object[key];
|
||||
if ((!eq(objValue, value) ||
|
||||
(eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) ||
|
||||
(value === undefined && !(key in object))) {
|
||||
object[key] = value;
|
||||
}
|
||||
}
|
||||
|
||||
export default assignValue;
|
||||
@@ -1,32 +0,0 @@
|
||||
import keys from '../object/keys';
|
||||
|
||||
/**
|
||||
* A specialized version of `_.assign` for customizing assigned values without
|
||||
* support for argument juggling, multiple sources, and `this` binding `customizer`
|
||||
* functions.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
* @param {Object} source The source object.
|
||||
* @param {Function} customizer The function to customize assigned values.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function assignWith(object, source, customizer) {
|
||||
var index = -1,
|
||||
props = keys(source),
|
||||
length = props.length;
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index],
|
||||
value = object[key],
|
||||
result = customizer(value, source[key], key, object, source);
|
||||
|
||||
if ((result === result ? (result !== value) : (value === value)) ||
|
||||
(value === undefined && !(key in object))) {
|
||||
object[key] = result;
|
||||
}
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default assignWith;
|
||||
31
internal/assocDelete.js
Normal file
31
internal/assocDelete.js
Normal file
@@ -0,0 +1,31 @@
|
||||
import assocIndexOf from './assocIndexOf';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var arrayProto = Array.prototype;
|
||||
|
||||
/** Built-in value references. */
|
||||
var splice = arrayProto.splice;
|
||||
|
||||
/**
|
||||
* Removes `key` and its value from the associative array.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to query.
|
||||
* @param {string} key The key of the value to remove.
|
||||
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
|
||||
*/
|
||||
function assocDelete(array, key) {
|
||||
var index = assocIndexOf(array, key);
|
||||
if (index < 0) {
|
||||
return false;
|
||||
}
|
||||
var lastIndex = array.length - 1;
|
||||
if (index == lastIndex) {
|
||||
array.pop();
|
||||
} else {
|
||||
splice.call(array, index, 1);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
export default assocDelete;
|
||||
16
internal/assocGet.js
Normal file
16
internal/assocGet.js
Normal file
@@ -0,0 +1,16 @@
|
||||
import assocIndexOf from './assocIndexOf';
|
||||
|
||||
/**
|
||||
* Gets the associative array value for `key`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to query.
|
||||
* @param {string} key The key of the value to get.
|
||||
* @returns {*} Returns the entry value.
|
||||
*/
|
||||
function assocGet(array, key) {
|
||||
var index = assocIndexOf(array, key);
|
||||
return index < 0 ? undefined : array[index][1];
|
||||
}
|
||||
|
||||
export default assocGet;
|
||||
15
internal/assocHas.js
Normal file
15
internal/assocHas.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import assocIndexOf from './assocIndexOf';
|
||||
|
||||
/**
|
||||
* Checks if an associative array value for `key` exists.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to query.
|
||||
* @param {string} key The key of the entry to check.
|
||||
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
|
||||
*/
|
||||
function assocHas(array, key) {
|
||||
return assocIndexOf(array, key) > -1;
|
||||
}
|
||||
|
||||
export default assocHas;
|
||||
22
internal/assocIndexOf.js
Normal file
22
internal/assocIndexOf.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import eq from '../eq';
|
||||
|
||||
/**
|
||||
* Gets the index at which the first occurrence of `key` is found in `array`
|
||||
* of key-value pairs.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
* @param {*} key The key to search for.
|
||||
* @returns {number} Returns the index of the matched value, else `-1`.
|
||||
*/
|
||||
function assocIndexOf(array, key) {
|
||||
var length = array.length;
|
||||
while (length--) {
|
||||
if (eq(array[length][0], key)) {
|
||||
return length;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
export default assocIndexOf;
|
||||
20
internal/assocSet.js
Normal file
20
internal/assocSet.js
Normal file
@@ -0,0 +1,20 @@
|
||||
import assocIndexOf from './assocIndexOf';
|
||||
|
||||
/**
|
||||
* Sets the associative array `key` to `value`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to modify.
|
||||
* @param {string} key The key of the value to set.
|
||||
* @param {*} value The value to set.
|
||||
*/
|
||||
function assocSet(array, key, value) {
|
||||
var index = assocIndexOf(array, key);
|
||||
if (index < 0) {
|
||||
array.push([key, value]);
|
||||
} else {
|
||||
array[index][1] = value;
|
||||
}
|
||||
}
|
||||
|
||||
export default assocSet;
|
||||
@@ -1,9 +1,9 @@
|
||||
import baseCopy from './baseCopy';
|
||||
import keys from '../object/keys';
|
||||
import copyObject from './copyObject';
|
||||
import keys from '../keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.assign` without support for argument juggling,
|
||||
* multiple sources, and `customizer` functions.
|
||||
* The base implementation of `_.assign` without support for multiple sources
|
||||
* or `customizer` functions.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
@@ -11,9 +11,7 @@ import keys from '../object/keys';
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseAssign(object, source) {
|
||||
return source == null
|
||||
? object
|
||||
: baseCopy(source, keys(source), object);
|
||||
return object && copyObject(source, keys(source), object);
|
||||
}
|
||||
|
||||
export default baseAssign;
|
||||
|
||||
@@ -1,30 +1,21 @@
|
||||
import isArrayLike from './isArrayLike';
|
||||
import isIndex from './isIndex';
|
||||
import get from '../get';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.at` without support for string collections
|
||||
* and individual key arguments.
|
||||
* The base implementation of `_.at` without support for individual paths.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {number[]|string[]} props The property names or indexes of elements to pick.
|
||||
* @param {Object} object The object to iterate over.
|
||||
* @param {string[]} paths The property paths of elements to pick.
|
||||
* @returns {Array} Returns the new array of picked elements.
|
||||
*/
|
||||
function baseAt(collection, props) {
|
||||
function baseAt(object, paths) {
|
||||
var index = -1,
|
||||
isNil = collection == null,
|
||||
isArr = !isNil && isArrayLike(collection),
|
||||
length = isArr ? collection.length : 0,
|
||||
propsLength = props.length,
|
||||
result = Array(propsLength);
|
||||
isNil = object == null,
|
||||
length = paths.length,
|
||||
result = Array(length);
|
||||
|
||||
while(++index < propsLength) {
|
||||
var key = props[index];
|
||||
if (isArr) {
|
||||
result[index] = isIndex(key, length) ? collection[key] : undefined;
|
||||
} else {
|
||||
result[index] = isNil ? undefined : collection[key];
|
||||
}
|
||||
while (++index < length) {
|
||||
result[index] = isNil ? undefined : get(object, paths[index]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
import baseMatches from './baseMatches';
|
||||
import baseMatchesProperty from './baseMatchesProperty';
|
||||
import bindCallback from './bindCallback';
|
||||
import identity from '../utility/identity';
|
||||
import property from '../utility/property';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.callback` which supports specifying the
|
||||
* number of arguments to provide to `func`.
|
||||
*
|
||||
* @private
|
||||
* @param {*} [func=_.identity] The value to convert to a callback.
|
||||
* @param {*} [thisArg] The `this` binding of `func`.
|
||||
* @param {number} [argCount] The number of arguments to provide to `func`.
|
||||
* @returns {Function} Returns the callback.
|
||||
*/
|
||||
function baseCallback(func, thisArg, argCount) {
|
||||
var type = typeof func;
|
||||
if (type == 'function') {
|
||||
return thisArg === undefined
|
||||
? func
|
||||
: bindCallback(func, thisArg, argCount);
|
||||
}
|
||||
if (func == null) {
|
||||
return identity;
|
||||
}
|
||||
if (type == 'object') {
|
||||
return baseMatches(func);
|
||||
}
|
||||
return thisArg === undefined
|
||||
? property(func)
|
||||
: baseMatchesProperty(func, thisArg);
|
||||
}
|
||||
|
||||
export default baseCallback;
|
||||
22
internal/baseClamp.js
Normal file
22
internal/baseClamp.js
Normal file
@@ -0,0 +1,22 @@
|
||||
/**
|
||||
* The base implementation of `_.clamp` which doesn't coerce arguments to numbers.
|
||||
*
|
||||
* @private
|
||||
* @param {number} number The number to clamp.
|
||||
* @param {number} [lower] The lower bound.
|
||||
* @param {number} upper The upper bound.
|
||||
* @returns {number} Returns the clamped number.
|
||||
*/
|
||||
function baseClamp(number, lower, upper) {
|
||||
if (number === number) {
|
||||
if (upper !== undefined) {
|
||||
number = number <= upper ? number : upper;
|
||||
}
|
||||
if (lower !== undefined) {
|
||||
number = number >= lower ? number : lower;
|
||||
}
|
||||
}
|
||||
return number;
|
||||
}
|
||||
|
||||
export default baseClamp;
|
||||
@@ -1,12 +1,17 @@
|
||||
import arrayCopy from './arrayCopy';
|
||||
import Stack from './Stack';
|
||||
import arrayEach from './arrayEach';
|
||||
import assignValue from './assignValue';
|
||||
import baseAssign from './baseAssign';
|
||||
import baseForOwn from './baseForOwn';
|
||||
import copyArray from './copyArray';
|
||||
import copySymbols from './copySymbols';
|
||||
import getTag from './getTag';
|
||||
import initCloneArray from './initCloneArray';
|
||||
import initCloneByTag from './initCloneByTag';
|
||||
import initCloneObject from './initCloneObject';
|
||||
import isArray from '../lang/isArray';
|
||||
import isObject from '../lang/isObject';
|
||||
import isArray from '../isArray';
|
||||
import isHostObject from './isHostObject';
|
||||
import isObject from '../isObject';
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var argsTag = '[object Arguments]',
|
||||
@@ -15,12 +20,14 @@ var argsTag = '[object Arguments]',
|
||||
dateTag = '[object Date]',
|
||||
errorTag = '[object Error]',
|
||||
funcTag = '[object Function]',
|
||||
genTag = '[object GeneratorFunction]',
|
||||
mapTag = '[object Map]',
|
||||
numberTag = '[object Number]',
|
||||
objectTag = '[object Object]',
|
||||
regexpTag = '[object RegExp]',
|
||||
setTag = '[object Set]',
|
||||
stringTag = '[object String]',
|
||||
symbolTag = '[object Symbol]',
|
||||
weakMapTag = '[object WeakMap]';
|
||||
|
||||
var arrayBufferTag = '[object ArrayBuffer]',
|
||||
@@ -41,41 +48,32 @@ cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
|
||||
cloneableTags[dateTag] = cloneableTags[float32Tag] =
|
||||
cloneableTags[float64Tag] = cloneableTags[int8Tag] =
|
||||
cloneableTags[int16Tag] = cloneableTags[int32Tag] =
|
||||
cloneableTags[numberTag] = cloneableTags[objectTag] =
|
||||
cloneableTags[regexpTag] = cloneableTags[stringTag] =
|
||||
cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
|
||||
cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
|
||||
cloneableTags[mapTag] = cloneableTags[numberTag] =
|
||||
cloneableTags[objectTag] = cloneableTags[regexpTag] =
|
||||
cloneableTags[setTag] = cloneableTags[stringTag] =
|
||||
cloneableTags[symbolTag] = cloneableTags[uint8Tag] =
|
||||
cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] =
|
||||
cloneableTags[uint32Tag] = true;
|
||||
cloneableTags[errorTag] = cloneableTags[funcTag] =
|
||||
cloneableTags[mapTag] = cloneableTags[setTag] =
|
||||
cloneableTags[weakMapTag] = false;
|
||||
|
||||
/** Used for native method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/**
|
||||
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
|
||||
* of values.
|
||||
*/
|
||||
var objToString = objectProto.toString;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.clone` without support for argument juggling
|
||||
* and `this` binding `customizer` functions.
|
||||
* The base implementation of `_.clone` and `_.cloneDeep` which tracks
|
||||
* traversed objects.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to clone.
|
||||
* @param {boolean} [isDeep] Specify a deep clone.
|
||||
* @param {Function} [customizer] The function to customize cloning values.
|
||||
* @param {Function} [customizer] The function to customize cloning.
|
||||
* @param {string} [key] The key of `value`.
|
||||
* @param {Object} [object] The object `value` belongs to.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates clones with source counterparts.
|
||||
* @param {Object} [object] The parent object of `value`.
|
||||
* @param {Object} [stack] Tracks traversed objects and their clone counterparts.
|
||||
* @returns {*} Returns the cloned value.
|
||||
*/
|
||||
function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
|
||||
function baseClone(value, isDeep, customizer, key, object, stack) {
|
||||
var result;
|
||||
if (customizer) {
|
||||
result = object ? customizer(value, key, object) : customizer(value);
|
||||
result = object ? customizer(value, key, object, stack) : customizer(value);
|
||||
}
|
||||
if (result !== undefined) {
|
||||
return result;
|
||||
@@ -87,16 +85,19 @@ function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
|
||||
if (isArr) {
|
||||
result = initCloneArray(value);
|
||||
if (!isDeep) {
|
||||
return arrayCopy(value, result);
|
||||
return copyArray(value, result);
|
||||
}
|
||||
} else {
|
||||
var tag = objToString.call(value),
|
||||
isFunc = tag == funcTag;
|
||||
var tag = getTag(value),
|
||||
isFunc = tag == funcTag || tag == genTag;
|
||||
|
||||
if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
|
||||
if (isHostObject(value)) {
|
||||
return object ? value : {};
|
||||
}
|
||||
result = initCloneObject(isFunc ? {} : value);
|
||||
if (!isDeep) {
|
||||
return baseAssign(result, value);
|
||||
return copySymbols(value, baseAssign(result, value));
|
||||
}
|
||||
} else {
|
||||
return cloneableTags[tag]
|
||||
@@ -105,24 +106,18 @@ function baseClone(value, isDeep, customizer, key, object, stackA, stackB) {
|
||||
}
|
||||
}
|
||||
// Check for circular references and return its corresponding clone.
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
|
||||
var length = stackA.length;
|
||||
while (length--) {
|
||||
if (stackA[length] == value) {
|
||||
return stackB[length];
|
||||
}
|
||||
stack || (stack = new Stack);
|
||||
var stacked = stack.get(value);
|
||||
if (stacked) {
|
||||
return stacked;
|
||||
}
|
||||
// Add the source value to the stack of traversed objects and associate it with its clone.
|
||||
stackA.push(value);
|
||||
stackB.push(result);
|
||||
stack.set(value, result);
|
||||
|
||||
// Recursively populate clone (susceptible to call stack limits).
|
||||
(isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
|
||||
result[key] = baseClone(subValue, isDeep, customizer, key, value, stackA, stackB);
|
||||
assignValue(result, key, baseClone(subValue, isDeep, customizer, key, value, stack));
|
||||
});
|
||||
return result;
|
||||
return isArr ? result : copySymbols(value, result);
|
||||
}
|
||||
|
||||
export default baseClone;
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* The base implementation of `compareAscending` which compares values and
|
||||
* sorts them in ascending order without guaranteeing a stable sort.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to compare.
|
||||
* @param {*} other The other value to compare.
|
||||
* @returns {number} Returns the sort order indicator for `value`.
|
||||
*/
|
||||
function baseCompareAscending(value, other) {
|
||||
if (value !== other) {
|
||||
var valIsNull = value === null,
|
||||
valIsUndef = value === undefined,
|
||||
valIsReflexive = value === value;
|
||||
|
||||
var othIsNull = other === null,
|
||||
othIsUndef = other === undefined,
|
||||
othIsReflexive = other === other;
|
||||
|
||||
if ((value > other && !othIsNull) || !valIsReflexive ||
|
||||
(valIsNull && !othIsUndef && othIsReflexive) ||
|
||||
(valIsUndef && othIsReflexive)) {
|
||||
return 1;
|
||||
}
|
||||
if ((value < other && !valIsNull) || !othIsReflexive ||
|
||||
(othIsNull && !valIsUndef && valIsReflexive) ||
|
||||
(othIsUndef && valIsReflexive)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
export default baseCompareAscending;
|
||||
32
internal/baseConforms.js
Normal file
32
internal/baseConforms.js
Normal file
@@ -0,0 +1,32 @@
|
||||
import keys from '../keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.conforms` which doesn't clone `source`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} source The object of property predicates to conform to.
|
||||
* @returns {Function} Returns the new function.
|
||||
*/
|
||||
function baseConforms(source) {
|
||||
var props = keys(source),
|
||||
length = props.length;
|
||||
|
||||
return function(object) {
|
||||
if (object == null) {
|
||||
return !length;
|
||||
}
|
||||
var index = length;
|
||||
while (index--) {
|
||||
var key = props[index],
|
||||
predicate = source[key],
|
||||
value = object[key];
|
||||
|
||||
if ((value === undefined && !(key in Object(object))) || !predicate(value)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
export default baseConforms;
|
||||
@@ -1,4 +1,4 @@
|
||||
import isObject from '../lang/isObject';
|
||||
import isObject from '../isObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.create` without support for assigning
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
var FUNC_ERROR_TEXT = 'Expected a function';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.delay` and `_.defer` which accepts an index
|
||||
* of where to slice the arguments to provide to `func`.
|
||||
* The base implementation of `_.delay` and `_.defer` which accepts an array
|
||||
* of `func` arguments.
|
||||
*
|
||||
* @private
|
||||
* @param {Function} func The function to delay.
|
||||
|
||||
@@ -1,51 +1,62 @@
|
||||
import baseIndexOf from './baseIndexOf';
|
||||
import cacheIndexOf from './cacheIndexOf';
|
||||
import createCache from './createCache';
|
||||
import SetCache from './SetCache';
|
||||
import arrayIncludes from './arrayIncludes';
|
||||
import arrayIncludesWith from './arrayIncludesWith';
|
||||
import arrayMap from './arrayMap';
|
||||
import baseUnary from './baseUnary';
|
||||
import cacheHas from './cacheHas';
|
||||
|
||||
/** Used as the size to enable large array optimizations. */
|
||||
var LARGE_ARRAY_SIZE = 200;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.difference` which accepts a single array
|
||||
* of values to exclude.
|
||||
* The base implementation of methods like `_.difference` without support for
|
||||
* excluding multiple arrays or iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to inspect.
|
||||
* @param {Array} values The values to exclude.
|
||||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||
* @param {Function} [comparator] The comparator invoked per element.
|
||||
* @returns {Array} Returns the new array of filtered values.
|
||||
*/
|
||||
function baseDifference(array, values) {
|
||||
var length = array ? array.length : 0,
|
||||
result = [];
|
||||
function baseDifference(array, values, iteratee, comparator) {
|
||||
var index = -1,
|
||||
includes = arrayIncludes,
|
||||
isCommon = true,
|
||||
length = array.length,
|
||||
result = [],
|
||||
valuesLength = values.length;
|
||||
|
||||
if (!length) {
|
||||
return result;
|
||||
}
|
||||
var index = -1,
|
||||
indexOf = baseIndexOf,
|
||||
isCommon = true,
|
||||
cache = (isCommon && values.length >= LARGE_ARRAY_SIZE) ? createCache(values) : null,
|
||||
valuesLength = values.length;
|
||||
|
||||
if (cache) {
|
||||
indexOf = cacheIndexOf;
|
||||
if (iteratee) {
|
||||
values = arrayMap(values, baseUnary(iteratee));
|
||||
}
|
||||
if (comparator) {
|
||||
includes = arrayIncludesWith;
|
||||
isCommon = false;
|
||||
values = cache;
|
||||
}
|
||||
else if (values.length >= LARGE_ARRAY_SIZE) {
|
||||
includes = cacheHas;
|
||||
isCommon = false;
|
||||
values = new SetCache(values);
|
||||
}
|
||||
outer:
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
var value = array[index],
|
||||
computed = iteratee ? iteratee(value) : value;
|
||||
|
||||
if (isCommon && value === value) {
|
||||
if (isCommon && computed === computed) {
|
||||
var valuesIndex = valuesLength;
|
||||
while (valuesIndex--) {
|
||||
if (values[valuesIndex] === value) {
|
||||
if (values[valuesIndex] === computed) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
result.push(value);
|
||||
}
|
||||
else if (indexOf(values, value, 0) < 0) {
|
||||
else if (!includes(values, computed, comparator)) {
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,12 @@ import baseForOwn from './baseForOwn';
|
||||
import createBaseEach from './createBaseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forEach` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.forEach` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array|Object|string} Returns `collection`.
|
||||
* @returns {Array|Object} Returns `collection`.
|
||||
*/
|
||||
var baseEach = createBaseEach(baseForOwn);
|
||||
|
||||
|
||||
@@ -2,13 +2,12 @@ import baseForOwnRight from './baseForOwnRight';
|
||||
import createBaseEach from './createBaseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forEachRight` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.forEachRight` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array|Object|string} Returns `collection`.
|
||||
* @returns {Array|Object} Returns `collection`.
|
||||
*/
|
||||
var baseEachRight = createBaseEach(baseForOwnRight, true);
|
||||
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.every` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.every` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check,
|
||||
* else `false`
|
||||
* @returns {boolean} Returns `true` if all elements pass the predicate check, else `false`
|
||||
*/
|
||||
function baseEvery(collection, predicate) {
|
||||
var result = true;
|
||||
|
||||
@@ -1,28 +1,29 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* Gets the extremum value of `collection` invoking `iteratee` for each value
|
||||
* in `collection` to generate the criterion by which the value is ranked.
|
||||
* The `iteratee` is invoked with three arguments: (value, index|key, collection).
|
||||
* The base implementation of methods like `_.max` and `_.min` which accepts a
|
||||
* `comparator` to determine the extremum value.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {Function} comparator The function used to compare values.
|
||||
* @param {*} exValue The initial extremum value.
|
||||
* @param {Array} array The array to iterate over.
|
||||
* @param {Function} iteratee The iteratee invoked per iteration.
|
||||
* @param {Function} comparator The comparator used to compare values.
|
||||
* @returns {*} Returns the extremum value.
|
||||
*/
|
||||
function baseExtremum(collection, iteratee, comparator, exValue) {
|
||||
var computed = exValue,
|
||||
result = computed;
|
||||
function baseExtremum(array, iteratee, comparator) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
baseEach(collection, function(value, index, collection) {
|
||||
var current = +iteratee(value, index, collection);
|
||||
if (comparator(current, computed) || (current === exValue && current === result)) {
|
||||
computed = current;
|
||||
result = value;
|
||||
while (++index < length) {
|
||||
var value = array[index],
|
||||
current = iteratee(value);
|
||||
|
||||
if (current != null && (computed === undefined
|
||||
? current === current
|
||||
: comparator(current, computed)
|
||||
)) {
|
||||
var computed = current,
|
||||
result = value;
|
||||
}
|
||||
});
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import toInteger from '../toInteger';
|
||||
import toLength from '../toLength';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.fill` without an iteratee call guard.
|
||||
*
|
||||
@@ -11,18 +14,16 @@
|
||||
function baseFill(array, value, start, end) {
|
||||
var length = array.length;
|
||||
|
||||
start = start == null ? 0 : (+start || 0);
|
||||
start = toInteger(start);
|
||||
if (start < 0) {
|
||||
start = -start > length ? 0 : (length + start);
|
||||
}
|
||||
end = (end === undefined || end > length) ? length : (+end || 0);
|
||||
end = (end === undefined || end > length) ? length : toInteger(end);
|
||||
if (end < 0) {
|
||||
end += length;
|
||||
}
|
||||
length = start > end ? 0 : (end >>> 0);
|
||||
start >>>= 0;
|
||||
|
||||
while (start < length) {
|
||||
end = start > end ? 0 : toLength(end);
|
||||
while (start < end) {
|
||||
array[start++] = value;
|
||||
}
|
||||
return array;
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.filter` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.filter` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {Array} Returns the new filtered array.
|
||||
*/
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
/**
|
||||
* The base implementation of `_.find`, `_.findLast`, `_.findKey`, and `_.findLastKey`,
|
||||
* without support for callback shorthands and `this` binding, which iterates
|
||||
* over `collection` using the provided `eachFunc`.
|
||||
* The base implementation of methods like `_.find` and `_.findKey`, without
|
||||
* support for iteratee shorthands, which iterates over `collection` using
|
||||
* the provided `eachFunc`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to search.
|
||||
* @param {Array|Object} collection The collection to search.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||||
* @param {boolean} [retKey] Specify returning the key of the found element
|
||||
* instead of the element itself.
|
||||
* @param {boolean} [retKey] Specify returning the key of the found element instead of the element itself.
|
||||
* @returns {*} Returns the found element or its key, else `undefined`.
|
||||
*/
|
||||
function baseFind(collection, predicate, eachFunc, retKey) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/**
|
||||
* The base implementation of `_.findIndex` and `_.findLastIndex` without
|
||||
* support for callback shorthands and `this` binding.
|
||||
* support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import arrayPush from './arrayPush';
|
||||
import isArguments from '../lang/isArguments';
|
||||
import isArray from '../lang/isArray';
|
||||
import isArrayLike from './isArrayLike';
|
||||
import isObjectLike from './isObjectLike';
|
||||
import isArguments from '../isArguments';
|
||||
import isArray from '../isArray';
|
||||
import isArrayLikeObject from '../isArrayLikeObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.flatten` with added support for restricting
|
||||
* flattening and specifying the start index.
|
||||
* The base implementation of `_.flatten` with support for restricting flattening.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to flatten.
|
||||
@@ -23,7 +21,7 @@ function baseFlatten(array, isDeep, isStrict, result) {
|
||||
|
||||
while (++index < length) {
|
||||
var value = array[index];
|
||||
if (isObjectLike(value) && isArrayLike(value) &&
|
||||
if (isArrayLikeObject(value) &&
|
||||
(isStrict || isArray(value) || isArguments(value))) {
|
||||
if (isDeep) {
|
||||
// Recursively flatten arrays (susceptible to call stack limits).
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import baseFor from './baseFor';
|
||||
import keysIn from '../object/keysIn';
|
||||
import keysIn from '../keysIn';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forIn` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.forIn` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
@@ -11,7 +10,7 @@ import keysIn from '../object/keysIn';
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForIn(object, iteratee) {
|
||||
return baseFor(object, iteratee, keysIn);
|
||||
return object == null ? object : baseFor(object, iteratee, keysIn);
|
||||
}
|
||||
|
||||
export default baseForIn;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import baseFor from './baseFor';
|
||||
import keys from '../object/keys';
|
||||
import keys from '../keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forOwn` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.forOwn` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
@@ -11,7 +10,7 @@ import keys from '../object/keys';
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForOwn(object, iteratee) {
|
||||
return baseFor(object, iteratee, keys);
|
||||
return object && baseFor(object, iteratee, keys);
|
||||
}
|
||||
|
||||
export default baseForOwn;
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import baseForRight from './baseForRight';
|
||||
import keys from '../object/keys';
|
||||
import keys from '../keys';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.forOwnRight` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.forOwnRight` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to iterate over.
|
||||
@@ -11,7 +10,7 @@ import keys from '../object/keys';
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseForOwnRight(object, iteratee) {
|
||||
return baseForRight(object, iteratee, keys);
|
||||
return object && baseForRight(object, iteratee, keys);
|
||||
}
|
||||
|
||||
export default baseForOwnRight;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import isFunction from '../lang/isFunction';
|
||||
import arrayFilter from './arrayFilter';
|
||||
import isFunction from '../isFunction';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.functions` which creates an array of
|
||||
@@ -10,18 +11,9 @@ import isFunction from '../lang/isFunction';
|
||||
* @returns {Array} Returns the new array of filtered property names.
|
||||
*/
|
||||
function baseFunctions(object, props) {
|
||||
var index = -1,
|
||||
length = props.length,
|
||||
resIndex = -1,
|
||||
result = [];
|
||||
|
||||
while (++index < length) {
|
||||
var key = props[index];
|
||||
if (isFunction(object[key])) {
|
||||
result[++resIndex] = key;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return arrayFilter(props, function(key) {
|
||||
return isFunction(object[key]);
|
||||
});
|
||||
}
|
||||
|
||||
export default baseFunctions;
|
||||
|
||||
@@ -1,22 +1,17 @@
|
||||
import toObject from './toObject';
|
||||
import baseToPath from './baseToPath';
|
||||
import isKey from './isKey';
|
||||
|
||||
/**
|
||||
* The base implementation of `get` without support for string paths
|
||||
* and default values.
|
||||
* The base implementation of `_.get` without support for default values.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array} path The path of the property to get.
|
||||
* @param {string} [pathKey] The key representation of path.
|
||||
* @param {Array|string} path The path of the property to get.
|
||||
* @returns {*} Returns the resolved value.
|
||||
*/
|
||||
function baseGet(object, path, pathKey) {
|
||||
if (object == null) {
|
||||
return;
|
||||
}
|
||||
if (pathKey !== undefined && pathKey in toObject(object)) {
|
||||
path = [pathKey];
|
||||
}
|
||||
function baseGet(object, path) {
|
||||
path = isKey(path, object) ? [path + ''] : baseToPath(path);
|
||||
|
||||
var index = 0,
|
||||
length = path.length;
|
||||
|
||||
|
||||
26
internal/baseHas.js
Normal file
26
internal/baseHas.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/** Built-in value references. */
|
||||
var getPrototypeOf = Object.getPrototypeOf;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.has` without support for deep paths.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array|string} key The key to check.
|
||||
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||||
*/
|
||||
function baseHas(object, key) {
|
||||
// Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
|
||||
// that are composed entirely of index properties, return `false` for
|
||||
// `hasOwnProperty` checks of them.
|
||||
return hasOwnProperty.call(object, key) ||
|
||||
(typeof object == 'object' && key in object && getPrototypeOf(object) === null);
|
||||
}
|
||||
|
||||
export default baseHas;
|
||||
13
internal/baseHasIn.js
Normal file
13
internal/baseHasIn.js
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* The base implementation of `_.hasIn` without support for deep paths.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array|string} key The key to check.
|
||||
* @returns {boolean} Returns `true` if `key` exists, else `false`.
|
||||
*/
|
||||
function baseHasIn(object, key) {
|
||||
return key in Object(object);
|
||||
}
|
||||
|
||||
export default baseHasIn;
|
||||
18
internal/baseInRange.js
Normal file
18
internal/baseInRange.js
Normal file
@@ -0,0 +1,18 @@
|
||||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||
var nativeMax = Math.max,
|
||||
nativeMin = Math.min;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.inRange` which doesn't coerce arguments to numbers.
|
||||
*
|
||||
* @private
|
||||
* @param {number} number The number to check.
|
||||
* @param {number} start The start of the range.
|
||||
* @param {number} end The end of the range.
|
||||
* @returns {boolean} Returns `true` if `number` is in the range, else `false`.
|
||||
*/
|
||||
function baseInRange(number, start, end) {
|
||||
return number >= nativeMin(start, end) && number < nativeMax(start, end);
|
||||
}
|
||||
|
||||
export default baseInRange;
|
||||
@@ -1,7 +1,7 @@
|
||||
import indexOfNaN from './indexOfNaN';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.indexOf` without support for binary searches.
|
||||
* The base implementation of `_.indexOf` without `fromIndex` bounds checks.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to search.
|
||||
|
||||
62
internal/baseIntersection.js
Normal file
62
internal/baseIntersection.js
Normal file
@@ -0,0 +1,62 @@
|
||||
import SetCache from './SetCache';
|
||||
import arrayIncludes from './arrayIncludes';
|
||||
import arrayIncludesWith from './arrayIncludesWith';
|
||||
import arrayMap from './arrayMap';
|
||||
import baseUnary from './baseUnary';
|
||||
import cacheHas from './cacheHas';
|
||||
|
||||
/**
|
||||
* The base implementation of methods like `_.intersection`, without support
|
||||
* for iteratee shorthands, that accepts an array of arrays to inspect.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} arrays The arrays to inspect.
|
||||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||
* @param {Function} [comparator] The comparator invoked per element.
|
||||
* @returns {Array} Returns the new array of shared values.
|
||||
*/
|
||||
function baseIntersection(arrays, iteratee, comparator) {
|
||||
var includes = comparator ? arrayIncludesWith : arrayIncludes,
|
||||
othLength = arrays.length,
|
||||
othIndex = othLength,
|
||||
caches = Array(othLength),
|
||||
result = [];
|
||||
|
||||
while (othIndex--) {
|
||||
var array = arrays[othIndex];
|
||||
if (othIndex && iteratee) {
|
||||
array = arrayMap(array, baseUnary(iteratee));
|
||||
}
|
||||
caches[othIndex] = !comparator && (iteratee || array.length >= 120)
|
||||
? new SetCache(othIndex && array)
|
||||
: undefined;
|
||||
}
|
||||
array = arrays[0];
|
||||
|
||||
var index = -1,
|
||||
length = array.length,
|
||||
seen = caches[0];
|
||||
|
||||
outer:
|
||||
while (++index < length) {
|
||||
var value = array[index],
|
||||
computed = iteratee ? iteratee(value) : value;
|
||||
|
||||
if (!(seen ? cacheHas(seen, computed) : includes(result, computed, comparator))) {
|
||||
var othIndex = othLength;
|
||||
while (--othIndex) {
|
||||
var cache = caches[othIndex];
|
||||
if (!(cache ? cacheHas(cache, computed) : includes(arrays[othIndex], computed, comparator))) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
if (seen) {
|
||||
seen.push(computed);
|
||||
}
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseIntersection;
|
||||
28
internal/baseInvoke.js
Normal file
28
internal/baseInvoke.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import apply from './apply';
|
||||
import baseToPath from './baseToPath';
|
||||
import isKey from './isKey';
|
||||
import last from '../last';
|
||||
import parent from './parent';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.invoke` without support for individual
|
||||
* method arguments.
|
||||
*
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array|string} path The path of the method to invoke.
|
||||
* @param {Array} args The arguments to invoke the method with.
|
||||
* @returns {*} Returns the result of the invoked method.
|
||||
*/
|
||||
function baseInvoke(object, path, args) {
|
||||
if (!isKey(path, object)) {
|
||||
path = baseToPath(path);
|
||||
object = parent(object, path);
|
||||
path = last(path);
|
||||
}
|
||||
var func = object == null ? object : object[path];
|
||||
return func == null ? undefined : apply(func, object, args);
|
||||
}
|
||||
|
||||
export default baseInvoke;
|
||||
@@ -1,28 +1,30 @@
|
||||
import baseIsEqualDeep from './baseIsEqualDeep';
|
||||
import isObject from '../lang/isObject';
|
||||
import isObjectLike from './isObjectLike';
|
||||
import isObject from '../isObject';
|
||||
import isObjectLike from '../isObjectLike';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.isEqual` without support for `this` binding
|
||||
* `customizer` functions.
|
||||
* The base implementation of `_.isEqual` which supports partial comparisons
|
||||
* and tracks traversed objects.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to compare.
|
||||
* @param {*} other The other value to compare.
|
||||
* @param {Function} [customizer] The function to customize comparing values.
|
||||
* @param {boolean} [isLoose] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB] Tracks traversed `other` objects.
|
||||
* @param {Function} [customizer] The function to customize comparisons.
|
||||
* @param {boolean} [bitmask] The bitmask of comparison flags.
|
||||
* The bitmask may be composed of the following flags:
|
||||
* 1 - Unordered comparison
|
||||
* 2 - Partial comparison
|
||||
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
|
||||
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
||||
*/
|
||||
function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
|
||||
function baseIsEqual(value, other, customizer, bitmask, stack) {
|
||||
if (value === other) {
|
||||
return true;
|
||||
}
|
||||
if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
|
||||
return value !== value && other !== other;
|
||||
}
|
||||
return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
|
||||
return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
|
||||
}
|
||||
|
||||
export default baseIsEqual;
|
||||
|
||||
@@ -1,26 +1,26 @@
|
||||
import Stack from './Stack';
|
||||
import equalArrays from './equalArrays';
|
||||
import equalByTag from './equalByTag';
|
||||
import equalObjects from './equalObjects';
|
||||
import isArray from '../lang/isArray';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
import getTag from './getTag';
|
||||
import isArray from '../isArray';
|
||||
import isHostObject from './isHostObject';
|
||||
import isTypedArray from '../isTypedArray';
|
||||
|
||||
/** Used to compose bitmasks for comparison styles. */
|
||||
var PARTIAL_COMPARE_FLAG = 2;
|
||||
|
||||
/** `Object#toString` result references. */
|
||||
var argsTag = '[object Arguments]',
|
||||
arrayTag = '[object Array]',
|
||||
objectTag = '[object Object]';
|
||||
|
||||
/** Used for native method references. */
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Used to check objects for own properties. */
|
||||
var hasOwnProperty = objectProto.hasOwnProperty;
|
||||
|
||||
/**
|
||||
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
|
||||
* of values.
|
||||
*/
|
||||
var objToString = objectProto.toString;
|
||||
|
||||
/**
|
||||
* A specialized version of `baseIsEqual` for arrays and objects which performs
|
||||
* deep comparisons and tracks traversed objects enabling objects with circular
|
||||
@@ -30,20 +30,19 @@ var objToString = objectProto.toString;
|
||||
* @param {Object} object The object to compare.
|
||||
* @param {Object} other The other object to compare.
|
||||
* @param {Function} equalFunc The function to determine equivalents of values.
|
||||
* @param {Function} [customizer] The function to customize comparing objects.
|
||||
* @param {boolean} [isLoose] Specify performing partial comparisons.
|
||||
* @param {Array} [stackA=[]] Tracks traversed `value` objects.
|
||||
* @param {Array} [stackB=[]] Tracks traversed `other` objects.
|
||||
* @param {Function} [customizer] The function to customize comparisons.
|
||||
* @param {number} [bitmask] The bitmask of comparison flags. See `baseIsEqual` for more details.
|
||||
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
*/
|
||||
function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
|
||||
function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
|
||||
var objIsArr = isArray(object),
|
||||
othIsArr = isArray(other),
|
||||
objTag = arrayTag,
|
||||
othTag = arrayTag;
|
||||
|
||||
if (!objIsArr) {
|
||||
objTag = objToString.call(object);
|
||||
objTag = getTag(object);
|
||||
if (objTag == argsTag) {
|
||||
objTag = objectTag;
|
||||
} else if (objTag != objectTag) {
|
||||
@@ -51,52 +50,34 @@ function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA,
|
||||
}
|
||||
}
|
||||
if (!othIsArr) {
|
||||
othTag = objToString.call(other);
|
||||
othTag = getTag(other);
|
||||
if (othTag == argsTag) {
|
||||
othTag = objectTag;
|
||||
} else if (othTag != objectTag) {
|
||||
othIsArr = isTypedArray(other);
|
||||
}
|
||||
}
|
||||
var objIsObj = objTag == objectTag,
|
||||
othIsObj = othTag == objectTag,
|
||||
var objIsObj = objTag == objectTag && !isHostObject(object),
|
||||
othIsObj = othTag == objectTag && !isHostObject(other),
|
||||
isSameTag = objTag == othTag;
|
||||
|
||||
if (isSameTag && !(objIsArr || objIsObj)) {
|
||||
return equalByTag(object, other, objTag);
|
||||
return equalByTag(object, other, objTag, equalFunc, customizer, bitmask);
|
||||
}
|
||||
if (!isLoose) {
|
||||
var isPartial = bitmask & PARTIAL_COMPARE_FLAG;
|
||||
if (!isPartial) {
|
||||
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
|
||||
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
|
||||
|
||||
if (objIsWrapped || othIsWrapped) {
|
||||
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
|
||||
return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, customizer, bitmask, stack);
|
||||
}
|
||||
}
|
||||
if (!isSameTag) {
|
||||
return false;
|
||||
}
|
||||
// Assume cyclic values are equal.
|
||||
// For more information on detecting circular references see https://es5.github.io/#JO.
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
|
||||
var length = stackA.length;
|
||||
while (length--) {
|
||||
if (stackA[length] == object) {
|
||||
return stackB[length] == other;
|
||||
}
|
||||
}
|
||||
// Add `object` and `other` to the stack of traversed objects.
|
||||
stackA.push(object);
|
||||
stackB.push(other);
|
||||
|
||||
var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
|
||||
|
||||
stackA.pop();
|
||||
stackB.pop();
|
||||
|
||||
return result;
|
||||
stack || (stack = new Stack);
|
||||
return (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, bitmask, stack);
|
||||
}
|
||||
|
||||
export default baseIsEqualDeep;
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
/**
|
||||
* The base implementation of `_.isFunction` without support for environments
|
||||
* with incorrect `typeof` results.
|
||||
*
|
||||
* @private
|
||||
* @param {*} value The value to check.
|
||||
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
|
||||
*/
|
||||
function baseIsFunction(value) {
|
||||
// Avoid a Chakra JIT bug in compatibility modes of IE 11.
|
||||
// See https://github.com/jashkenas/underscore/issues/1621 for more details.
|
||||
return typeof value == 'function' || false;
|
||||
}
|
||||
|
||||
export default baseIsFunction;
|
||||
@@ -1,17 +1,21 @@
|
||||
import Stack from './Stack';
|
||||
import baseIsEqual from './baseIsEqual';
|
||||
import toObject from './toObject';
|
||||
|
||||
/** Used to compose bitmasks for comparison styles. */
|
||||
var UNORDERED_COMPARE_FLAG = 1,
|
||||
PARTIAL_COMPARE_FLAG = 2;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.isMatch` without support for callback
|
||||
* shorthands and `this` binding.
|
||||
* The base implementation of `_.isMatch` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to inspect.
|
||||
* @param {Array} matchData The propery names, values, and compare flags to match.
|
||||
* @param {Function} [customizer] The function to customize comparing objects.
|
||||
* @param {Object} source The object of property values to match.
|
||||
* @param {Array} matchData The property names, values, and compare flags to match.
|
||||
* @param {Function} [customizer] The function to customize comparisons.
|
||||
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
|
||||
*/
|
||||
function baseIsMatch(object, matchData, customizer) {
|
||||
function baseIsMatch(object, source, matchData, customizer) {
|
||||
var index = matchData.length,
|
||||
length = index,
|
||||
noCustomizer = !customizer;
|
||||
@@ -19,7 +23,7 @@ function baseIsMatch(object, matchData, customizer) {
|
||||
if (object == null) {
|
||||
return !length;
|
||||
}
|
||||
object = toObject(object);
|
||||
object = Object(object);
|
||||
while (index--) {
|
||||
var data = matchData[index];
|
||||
if ((noCustomizer && data[2])
|
||||
@@ -40,8 +44,10 @@ function baseIsMatch(object, matchData, customizer) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
var result = customizer ? customizer(objValue, srcValue, key) : undefined;
|
||||
if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, true) : result)) {
|
||||
var stack = new Stack,
|
||||
result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined;
|
||||
|
||||
if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) : result)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
30
internal/baseIteratee.js
Normal file
30
internal/baseIteratee.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import baseMatches from './baseMatches';
|
||||
import baseMatchesProperty from './baseMatchesProperty';
|
||||
import identity from '../identity';
|
||||
import isArray from '../isArray';
|
||||
import property from '../property';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.iteratee`.
|
||||
*
|
||||
* @private
|
||||
* @param {*} [value=_.identity] The value to convert to an iteratee.
|
||||
* @returns {Function} Returns the iteratee.
|
||||
*/
|
||||
function baseIteratee(value) {
|
||||
var type = typeof value;
|
||||
if (type == 'function') {
|
||||
return value;
|
||||
}
|
||||
if (value == null) {
|
||||
return identity;
|
||||
}
|
||||
if (type == 'object') {
|
||||
return isArray(value)
|
||||
? baseMatchesProperty(value[0], value[1])
|
||||
: baseMatches(value);
|
||||
}
|
||||
return property(value);
|
||||
}
|
||||
|
||||
export default baseIteratee;
|
||||
17
internal/baseKeys.js
Normal file
17
internal/baseKeys.js
Normal file
@@ -0,0 +1,17 @@
|
||||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||
var nativeKeys = Object.keys;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.keys` which doesn't skip the constructor
|
||||
* property of prototypes or treat sparse arrays as dense.
|
||||
*
|
||||
* @private
|
||||
* @type Function
|
||||
* @param {Object} object The object to query.
|
||||
* @returns {Array} Returns the array of property names.
|
||||
*/
|
||||
function baseKeys(object) {
|
||||
return nativeKeys(Object(object));
|
||||
}
|
||||
|
||||
export default baseKeys;
|
||||
36
internal/baseKeysIn.js
Normal file
36
internal/baseKeysIn.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import Reflect from './Reflect';
|
||||
import iteratorToArray from './iteratorToArray';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var objectProto = Object.prototype;
|
||||
|
||||
/** Built-in value references. */
|
||||
var enumerate = Reflect ? Reflect.enumerate : undefined,
|
||||
propertyIsEnumerable = objectProto.propertyIsEnumerable;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.keysIn` which doesn't skip the constructor
|
||||
* property of prototypes or treat sparse arrays as dense.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @returns {Array} Returns the array of property names.
|
||||
*/
|
||||
function baseKeysIn(object) {
|
||||
object = object == null ? object : Object(object);
|
||||
|
||||
var result = [];
|
||||
for (var key in object) {
|
||||
result.push(key);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Fallback for IE < 9 with es6-shim.
|
||||
if (enumerate && !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf')) {
|
||||
baseKeysIn = function(object) {
|
||||
return iteratorToArray(enumerate(object));
|
||||
};
|
||||
}
|
||||
|
||||
export default baseKeysIn;
|
||||
@@ -1,12 +1,11 @@
|
||||
import baseEach from './baseEach';
|
||||
import isArrayLike from './isArrayLike';
|
||||
import isArrayLike from '../isArrayLike';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.map` without support for callback shorthands
|
||||
* and `this` binding.
|
||||
* The base implementation of `_.map` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @returns {Array} Returns the new mapped array.
|
||||
*/
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import baseIsMatch from './baseIsMatch';
|
||||
import getMatchData from './getMatchData';
|
||||
import toObject from './toObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.matches` which does not clone `source`.
|
||||
* The base implementation of `_.matches` which doesn't clone `source`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} source The object of property values to match.
|
||||
@@ -19,11 +18,12 @@ function baseMatches(source) {
|
||||
if (object == null) {
|
||||
return false;
|
||||
}
|
||||
return object[key] === value && (value !== undefined || (key in toObject(object)));
|
||||
return object[key] === value &&
|
||||
(value !== undefined || (key in Object(object)));
|
||||
};
|
||||
}
|
||||
return function(object) {
|
||||
return baseIsMatch(object, matchData);
|
||||
return object === source || baseIsMatch(object, source, matchData);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,44 +1,25 @@
|
||||
import baseGet from './baseGet';
|
||||
import baseIsEqual from './baseIsEqual';
|
||||
import baseSlice from './baseSlice';
|
||||
import isArray from '../lang/isArray';
|
||||
import isKey from './isKey';
|
||||
import isStrictComparable from './isStrictComparable';
|
||||
import last from '../array/last';
|
||||
import toObject from './toObject';
|
||||
import toPath from './toPath';
|
||||
import get from '../get';
|
||||
import hasIn from '../hasIn';
|
||||
|
||||
/** Used to compose bitmasks for comparison styles. */
|
||||
var UNORDERED_COMPARE_FLAG = 1,
|
||||
PARTIAL_COMPARE_FLAG = 2;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.matchesProperty` which does not clone `srcValue`.
|
||||
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
|
||||
*
|
||||
* @private
|
||||
* @param {string} path The path of the property to get.
|
||||
* @param {*} srcValue The value to compare.
|
||||
* @param {*} srcValue The value to match.
|
||||
* @returns {Function} Returns the new function.
|
||||
*/
|
||||
function baseMatchesProperty(path, srcValue) {
|
||||
var isArr = isArray(path),
|
||||
isCommon = isKey(path) && isStrictComparable(srcValue),
|
||||
pathKey = (path + '');
|
||||
|
||||
path = toPath(path);
|
||||
return function(object) {
|
||||
if (object == null) {
|
||||
return false;
|
||||
}
|
||||
var key = pathKey;
|
||||
object = toObject(object);
|
||||
if ((isArr || !isCommon) && !(key in object)) {
|
||||
object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
|
||||
if (object == null) {
|
||||
return false;
|
||||
}
|
||||
key = last(path);
|
||||
object = toObject(object);
|
||||
}
|
||||
return object[key] === srcValue
|
||||
? (srcValue !== undefined || (key in object))
|
||||
: baseIsEqual(srcValue, object[key], undefined, true);
|
||||
var objValue = get(object, path);
|
||||
return (objValue === undefined && objValue === srcValue)
|
||||
? hasIn(object, path)
|
||||
: baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,56 +1,43 @@
|
||||
import Stack from './Stack';
|
||||
import arrayEach from './arrayEach';
|
||||
import assignMergeValue from './assignMergeValue';
|
||||
import baseMergeDeep from './baseMergeDeep';
|
||||
import isArray from '../lang/isArray';
|
||||
import isArrayLike from './isArrayLike';
|
||||
import isObject from '../lang/isObject';
|
||||
import isObjectLike from './isObjectLike';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
import keys from '../object/keys';
|
||||
import isArray from '../isArray';
|
||||
import isObject from '../isObject';
|
||||
import isTypedArray from '../isTypedArray';
|
||||
import keysIn from '../keysIn';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.merge` without support for argument juggling,
|
||||
* multiple sources, and `this` binding `customizer` functions.
|
||||
* The base implementation of `_.merge` without support for multiple sources.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The destination object.
|
||||
* @param {Object} source The source object.
|
||||
* @param {Function} [customizer] The function to customize merged values.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates values with source counterparts.
|
||||
* @returns {Object} Returns `object`.
|
||||
* @param {Object} [stack] Tracks traversed source values and their merged counterparts.
|
||||
*/
|
||||
function baseMerge(object, source, customizer, stackA, stackB) {
|
||||
if (!isObject(object)) {
|
||||
return object;
|
||||
function baseMerge(object, source, customizer, stack) {
|
||||
if (object === source) {
|
||||
return;
|
||||
}
|
||||
var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
|
||||
props = isSrcArr ? undefined : keys(source);
|
||||
|
||||
var props = (isArray(source) || isTypedArray(source)) ? undefined : keysIn(source);
|
||||
arrayEach(props || source, function(srcValue, key) {
|
||||
if (props) {
|
||||
key = srcValue;
|
||||
srcValue = source[key];
|
||||
}
|
||||
if (isObjectLike(srcValue)) {
|
||||
stackA || (stackA = []);
|
||||
stackB || (stackB = []);
|
||||
baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
|
||||
if (isObject(srcValue)) {
|
||||
stack || (stack = new Stack);
|
||||
baseMergeDeep(object, source, key, baseMerge, customizer, stack);
|
||||
}
|
||||
else {
|
||||
var value = object[key],
|
||||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||||
isCommon = result === undefined;
|
||||
|
||||
if (isCommon) {
|
||||
result = srcValue;
|
||||
}
|
||||
if ((result !== undefined || (isSrcArr && !(key in object))) &&
|
||||
(isCommon || (result === result ? (result !== value) : (value === value)))) {
|
||||
object[key] = result;
|
||||
var newValue = customizer ? customizer(object[key], srcValue, (key + ''), object, source, stack) : undefined;
|
||||
if (newValue === undefined) {
|
||||
newValue = srcValue;
|
||||
}
|
||||
assignMergeValue(object, key, newValue);
|
||||
}
|
||||
});
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseMerge;
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
import arrayCopy from './arrayCopy';
|
||||
import isArguments from '../lang/isArguments';
|
||||
import isArray from '../lang/isArray';
|
||||
import isArrayLike from './isArrayLike';
|
||||
import isPlainObject from '../lang/isPlainObject';
|
||||
import isTypedArray from '../lang/isTypedArray';
|
||||
import toPlainObject from '../lang/toPlainObject';
|
||||
import assignMergeValue from './assignMergeValue';
|
||||
import baseClone from './baseClone';
|
||||
import copyArray from './copyArray';
|
||||
import isArguments from '../isArguments';
|
||||
import isArray from '../isArray';
|
||||
import isArrayLikeObject from '../isArrayLikeObject';
|
||||
import isFunction from '../isFunction';
|
||||
import isObject from '../isObject';
|
||||
import isPlainObject from '../isPlainObject';
|
||||
import isTypedArray from '../isTypedArray';
|
||||
import toPlainObject from '../toPlainObject';
|
||||
|
||||
/**
|
||||
* A specialized version of `baseMerge` for arrays and objects which performs
|
||||
@@ -16,52 +20,44 @@ import toPlainObject from '../lang/toPlainObject';
|
||||
* @param {Object} source The source object.
|
||||
* @param {string} key The key of the value to merge.
|
||||
* @param {Function} mergeFunc The function to merge values.
|
||||
* @param {Function} [customizer] The function to customize merged values.
|
||||
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
||||
* @param {Array} [stackB=[]] Associates values with source counterparts.
|
||||
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
|
||||
* @param {Function} [customizer] The function to customize assigned values.
|
||||
* @param {Object} [stack] Tracks traversed source values and their merged counterparts.
|
||||
*/
|
||||
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
|
||||
var length = stackA.length,
|
||||
srcValue = source[key];
|
||||
function baseMergeDeep(object, source, key, mergeFunc, customizer, stack) {
|
||||
var objValue = object[key],
|
||||
srcValue = source[key],
|
||||
stacked = stack.get(srcValue) || stack.get(objValue);
|
||||
|
||||
while (length--) {
|
||||
if (stackA[length] == srcValue) {
|
||||
object[key] = stackB[length];
|
||||
return;
|
||||
}
|
||||
if (stacked) {
|
||||
assignMergeValue(object, key, stacked);
|
||||
return;
|
||||
}
|
||||
var value = object[key],
|
||||
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
|
||||
isCommon = result === undefined;
|
||||
var newValue = customizer ? customizer(objValue, srcValue, (key + ''), object, source, stack) : undefined,
|
||||
isCommon = newValue === undefined;
|
||||
|
||||
if (isCommon) {
|
||||
result = srcValue;
|
||||
if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
|
||||
result = isArray(value)
|
||||
? value
|
||||
: (isArrayLike(value) ? arrayCopy(value) : []);
|
||||
newValue = srcValue;
|
||||
if (isArray(srcValue) || isTypedArray(srcValue)) {
|
||||
newValue = isArray(objValue)
|
||||
? objValue
|
||||
: ((isArrayLikeObject(objValue)) ? copyArray(objValue) : baseClone(srcValue));
|
||||
}
|
||||
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
|
||||
result = isArguments(value)
|
||||
? toPlainObject(value)
|
||||
: (isPlainObject(value) ? value : {});
|
||||
newValue = isArguments(objValue)
|
||||
? toPlainObject(objValue)
|
||||
: (isObject(objValue) ? objValue : baseClone(srcValue));
|
||||
}
|
||||
else {
|
||||
isCommon = false;
|
||||
isCommon = isFunction(srcValue);
|
||||
}
|
||||
}
|
||||
// Add the source value to the stack of traversed objects and associate
|
||||
// it with its merged value.
|
||||
stackA.push(srcValue);
|
||||
stackB.push(result);
|
||||
stack.set(srcValue, newValue);
|
||||
|
||||
if (isCommon) {
|
||||
// Recursively merge objects and arrays (susceptible to call stack limits).
|
||||
object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
|
||||
} else if (result === result ? (result !== value) : (value === value)) {
|
||||
object[key] = result;
|
||||
mergeFunc(newValue, srcValue, customizer, stack);
|
||||
}
|
||||
assignMergeValue(object, key, newValue);
|
||||
}
|
||||
|
||||
export default baseMergeDeep;
|
||||
|
||||
36
internal/baseOrderBy.js
Normal file
36
internal/baseOrderBy.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import arrayMap from './arrayMap';
|
||||
import baseIteratee from './baseIteratee';
|
||||
import baseMap from './baseMap';
|
||||
import baseSortBy from './baseSortBy';
|
||||
import compareMultiple from './compareMultiple';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.orderBy` without param guards.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
|
||||
* @param {string[]} orders The sort orders of `iteratees`.
|
||||
* @returns {Array} Returns the new sorted array.
|
||||
*/
|
||||
function baseOrderBy(collection, iteratees, orders) {
|
||||
var index = -1,
|
||||
toIteratee = baseIteratee;
|
||||
|
||||
iteratees = arrayMap(iteratees.length ? iteratees : Array(1), function(iteratee) {
|
||||
return toIteratee(iteratee);
|
||||
});
|
||||
|
||||
var result = baseMap(collection, function(value, key, collection) {
|
||||
var criteria = arrayMap(iteratees, function(iteratee) {
|
||||
return iteratee(value);
|
||||
});
|
||||
return { 'criteria': criteria, 'index': ++index, 'value': value };
|
||||
});
|
||||
|
||||
return baseSortBy(result, function(object, other) {
|
||||
return compareMultiple(object, other, orders);
|
||||
});
|
||||
}
|
||||
|
||||
export default baseOrderBy;
|
||||
22
internal/basePick.js
Normal file
22
internal/basePick.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import arrayReduce from './arrayReduce';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pick` without support for individual
|
||||
* property names.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The source object.
|
||||
* @param {string[]} props The property names to pick.
|
||||
* @returns {Object} Returns the new object.
|
||||
*/
|
||||
function basePick(object, props) {
|
||||
object = Object(object);
|
||||
return arrayReduce(props, function(result, key) {
|
||||
if (key in object) {
|
||||
result[key] = object[key];
|
||||
}
|
||||
return result;
|
||||
}, {});
|
||||
}
|
||||
|
||||
export default basePick;
|
||||
21
internal/basePickBy.js
Normal file
21
internal/basePickBy.js
Normal file
@@ -0,0 +1,21 @@
|
||||
import baseForIn from './baseForIn';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pickBy` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The source object.
|
||||
* @param {Function} predicate The function invoked per property.
|
||||
* @returns {Object} Returns the new object.
|
||||
*/
|
||||
function basePickBy(object, predicate) {
|
||||
var result = {};
|
||||
baseForIn(object, function(value, key) {
|
||||
if (predicate(value)) {
|
||||
result[key] = value;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
export default basePickBy;
|
||||
@@ -1,5 +1,4 @@
|
||||
import baseGet from './baseGet';
|
||||
import toPath from './toPath';
|
||||
|
||||
/**
|
||||
* A specialized version of `baseProperty` which supports deep paths.
|
||||
@@ -9,10 +8,8 @@ import toPath from './toPath';
|
||||
* @returns {Function} Returns the new function.
|
||||
*/
|
||||
function basePropertyDeep(path) {
|
||||
var pathKey = (path + '');
|
||||
path = toPath(path);
|
||||
return function(object) {
|
||||
return baseGet(object, path, pathKey);
|
||||
return baseGet(object, path);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
15
internal/basePullAll.js
Normal file
15
internal/basePullAll.js
Normal file
@@ -0,0 +1,15 @@
|
||||
import basePullAllBy from './basePullAllBy';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pullAll`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to modify.
|
||||
* @param {Array} values The values to remove.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function basePullAll(array, values) {
|
||||
return basePullAllBy(array, values);
|
||||
}
|
||||
|
||||
export default basePullAll;
|
||||
43
internal/basePullAllBy.js
Normal file
43
internal/basePullAllBy.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import arrayMap from './arrayMap';
|
||||
import baseIndexOf from './baseIndexOf';
|
||||
|
||||
/** Used for built-in method references. */
|
||||
var arrayProto = Array.prototype;
|
||||
|
||||
/** Built-in value references. */
|
||||
var splice = arrayProto.splice;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pullAllBy` without support for iteratee
|
||||
* shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to modify.
|
||||
* @param {Array} values The values to remove.
|
||||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function basePullAllBy(array, values, iteratee) {
|
||||
var index = -1,
|
||||
length = values.length,
|
||||
seen = array;
|
||||
|
||||
if (iteratee) {
|
||||
seen = arrayMap(array, function(value) { return iteratee(value); });
|
||||
}
|
||||
while (++index < length) {
|
||||
var fromIndex = 0,
|
||||
value = values[index],
|
||||
computed = iteratee ? iteratee(value) : value;
|
||||
|
||||
while ((fromIndex = baseIndexOf(seen, computed, fromIndex)) > -1) {
|
||||
if (seen !== array) {
|
||||
splice.call(seen, fromIndex, 1);
|
||||
}
|
||||
splice.call(array, fromIndex, 1);
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
export default basePullAllBy;
|
||||
@@ -1,14 +1,18 @@
|
||||
import baseToPath from './baseToPath';
|
||||
import isIndex from './isIndex';
|
||||
import isKey from './isKey';
|
||||
import last from '../last';
|
||||
import parent from './parent';
|
||||
|
||||
/** Used for native method references. */
|
||||
/** Used for built-in method references. */
|
||||
var arrayProto = Array.prototype;
|
||||
|
||||
/** Native method references. */
|
||||
/** Built-in value references. */
|
||||
var splice = arrayProto.splice;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.pullAt` without support for individual
|
||||
* index arguments and capturing the removed elements.
|
||||
* indexes or capturing the removed elements.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to modify.
|
||||
@@ -16,12 +20,27 @@ var splice = arrayProto.splice;
|
||||
* @returns {Array} Returns `array`.
|
||||
*/
|
||||
function basePullAt(array, indexes) {
|
||||
var length = array ? indexes.length : 0;
|
||||
var length = array ? indexes.length : 0,
|
||||
lastIndex = length - 1;
|
||||
|
||||
while (length--) {
|
||||
var index = indexes[length];
|
||||
if (index != previous && isIndex(index)) {
|
||||
if (lastIndex == length || index != previous) {
|
||||
var previous = index;
|
||||
splice.call(array, index, 1);
|
||||
if (isIndex(index)) {
|
||||
splice.call(array, index, 1);
|
||||
}
|
||||
else if (!isKey(index, array)) {
|
||||
var path = baseToPath(index),
|
||||
object = parent(array, path);
|
||||
|
||||
if (object != null) {
|
||||
delete object[last(path)];
|
||||
}
|
||||
}
|
||||
else {
|
||||
delete array[index];
|
||||
}
|
||||
}
|
||||
}
|
||||
return array;
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||
var nativeFloor = Math.floor,
|
||||
nativeRandom = Math.random;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.random` without support for argument juggling
|
||||
* and returning floating-point numbers.
|
||||
* The base implementation of `_.random` without support for returning
|
||||
* floating-point numbers.
|
||||
*
|
||||
* @private
|
||||
* @param {number} min The minimum possible value.
|
||||
* @param {number} max The maximum possible value.
|
||||
* @param {number} lower The lower bound.
|
||||
* @param {number} upper The upper bound.
|
||||
* @returns {number} Returns the random number.
|
||||
*/
|
||||
function baseRandom(min, max) {
|
||||
return min + nativeFloor(nativeRandom() * (max - min + 1));
|
||||
function baseRandom(lower, upper) {
|
||||
return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
|
||||
}
|
||||
|
||||
export default baseRandom;
|
||||
|
||||
28
internal/baseRange.js
Normal file
28
internal/baseRange.js
Normal file
@@ -0,0 +1,28 @@
|
||||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||
var nativeCeil = Math.ceil,
|
||||
nativeMax = Math.max;
|
||||
|
||||
/**
|
||||
* The base implementation of `_.range` and `_.rangeRight` which doesn't
|
||||
* coerce arguments to numbers.
|
||||
*
|
||||
* @private
|
||||
* @param {number} start The start of the range.
|
||||
* @param {number} end The end of the range.
|
||||
* @param {number} step The value to increment or decrement by.
|
||||
* @param {boolean} [fromRight] Specify iterating from right to left.
|
||||
* @returns {Array} Returns the new array of numbers.
|
||||
*/
|
||||
function baseRange(start, end, step, fromRight) {
|
||||
var index = -1,
|
||||
length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
|
||||
result = Array(length);
|
||||
|
||||
while (length--) {
|
||||
result[fromRight ? length : ++index] = start;
|
||||
start += step;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseRange;
|
||||
@@ -1,14 +1,13 @@
|
||||
/**
|
||||
* The base implementation of `_.reduce` and `_.reduceRight` without support
|
||||
* for callback shorthands and `this` binding, which iterates over `collection`
|
||||
* using the provided `eachFunc`.
|
||||
* The base implementation of `_.reduce` and `_.reduceRight`, without support
|
||||
* for iteratee shorthands, which iterates over `collection` using the provided
|
||||
* `eachFunc`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {*} accumulator The initial value.
|
||||
* @param {boolean} initFromCollection Specify using the first or last element
|
||||
* of `collection` as the initial value.
|
||||
* @param {boolean} initFromCollection Specify using the first or last element of `collection` as the initial value.
|
||||
* @param {Function} eachFunc The function to iterate over `collection`.
|
||||
* @returns {*} Returns the accumulated value.
|
||||
*/
|
||||
|
||||
43
internal/baseSet.js
Normal file
43
internal/baseSet.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import assignValue from './assignValue';
|
||||
import baseToPath from './baseToPath';
|
||||
import isIndex from './isIndex';
|
||||
import isKey from './isKey';
|
||||
import isObject from '../isObject';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.set`.
|
||||
*
|
||||
* @private
|
||||
* @param {Object} object The object to query.
|
||||
* @param {Array|string} path The path of the property to set.
|
||||
* @param {*} value The value to set.
|
||||
* @param {Function} [customizer] The function to customize path creation.
|
||||
* @returns {Object} Returns `object`.
|
||||
*/
|
||||
function baseSet(object, path, value, customizer) {
|
||||
path = isKey(path, object) ? [path + ''] : baseToPath(path);
|
||||
|
||||
var index = -1,
|
||||
length = path.length,
|
||||
lastIndex = length - 1,
|
||||
nested = object;
|
||||
|
||||
while (nested != null && ++index < length) {
|
||||
var key = path[index];
|
||||
if (isObject(nested)) {
|
||||
var newValue = value;
|
||||
if (index != lastIndex) {
|
||||
var objValue = nested[key];
|
||||
newValue = customizer ? customizer(objValue, key, nested) : undefined;
|
||||
if (newValue === undefined) {
|
||||
newValue = objValue == null ? (isIndex(path[index + 1]) ? [] : {}) : objValue;
|
||||
}
|
||||
}
|
||||
assignValue(nested, key, newValue);
|
||||
}
|
||||
nested = nested[key];
|
||||
}
|
||||
return object;
|
||||
}
|
||||
|
||||
export default baseSet;
|
||||
@@ -1,4 +1,4 @@
|
||||
import identity from '../utility/identity';
|
||||
import identity from '../identity';
|
||||
import metaMap from './metaMap';
|
||||
|
||||
/**
|
||||
|
||||
@@ -11,11 +11,10 @@ function baseSlice(array, start, end) {
|
||||
var index = -1,
|
||||
length = array.length;
|
||||
|
||||
start = start == null ? 0 : (+start || 0);
|
||||
if (start < 0) {
|
||||
start = -start > length ? 0 : (length + start);
|
||||
}
|
||||
end = (end === undefined || end > length) ? length : (+end || 0);
|
||||
end = end > length ? length : end;
|
||||
if (end < 0) {
|
||||
end += length;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import baseEach from './baseEach';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.some` without support for callback shorthands
|
||||
* and `this` binding.
|
||||
* The base implementation of `_.some` without support for iteratee shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Array|Object} collection The collection to iterate over.
|
||||
* @param {Function} predicate The function invoked per iteration.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check,
|
||||
* else `false`.
|
||||
* @returns {boolean} Returns `true` if any element passes the predicate check, else `false`.
|
||||
*/
|
||||
function baseSome(collection, predicate) {
|
||||
var result;
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
import arrayMap from './arrayMap';
|
||||
import baseCallback from './baseCallback';
|
||||
import baseMap from './baseMap';
|
||||
import baseSortBy from './baseSortBy';
|
||||
import compareMultiple from './compareMultiple';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.sortByOrder` without param guards.
|
||||
*
|
||||
* @private
|
||||
* @param {Array|Object|string} collection The collection to iterate over.
|
||||
* @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
|
||||
* @param {boolean[]} orders The sort orders of `iteratees`.
|
||||
* @returns {Array} Returns the new sorted array.
|
||||
*/
|
||||
function baseSortByOrder(collection, iteratees, orders) {
|
||||
var index = -1;
|
||||
|
||||
iteratees = arrayMap(iteratees, function(iteratee) { return baseCallback(iteratee); });
|
||||
|
||||
var result = baseMap(collection, function(value) {
|
||||
var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
|
||||
return { 'criteria': criteria, 'index': ++index, 'value': value };
|
||||
});
|
||||
|
||||
return baseSortBy(result, function(object, other) {
|
||||
return compareMultiple(object, other, orders);
|
||||
});
|
||||
}
|
||||
|
||||
export default baseSortByOrder;
|
||||
@@ -1,12 +1,13 @@
|
||||
import binaryIndexBy from './binaryIndexBy';
|
||||
import identity from '../utility/identity';
|
||||
import baseSortedIndexBy from './baseSortedIndexBy';
|
||||
import identity from '../identity';
|
||||
|
||||
/** Used as references for the maximum length and index of an array. */
|
||||
var MAX_ARRAY_LENGTH = 4294967295,
|
||||
HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
|
||||
|
||||
/**
|
||||
* Performs a binary search of `array` to determine the index at which `value`
|
||||
* The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
|
||||
* performs a binary search of `array` to determine the index at which `value`
|
||||
* should be inserted into `array` in order to maintain its sort order.
|
||||
*
|
||||
* @private
|
||||
@@ -16,7 +17,7 @@ var MAX_ARRAY_LENGTH = 4294967295,
|
||||
* @returns {number} Returns the index at which `value` should be inserted
|
||||
* into `array`.
|
||||
*/
|
||||
function binaryIndex(array, value, retHighest) {
|
||||
function baseSortedIndex(array, value, retHighest) {
|
||||
var low = 0,
|
||||
high = array ? array.length : low;
|
||||
|
||||
@@ -33,7 +34,7 @@ function binaryIndex(array, value, retHighest) {
|
||||
}
|
||||
return high;
|
||||
}
|
||||
return binaryIndexBy(array, value, identity, retHighest);
|
||||
return baseSortedIndexBy(array, value, identity, retHighest);
|
||||
}
|
||||
|
||||
export default binaryIndex;
|
||||
export default baseSortedIndex;
|
||||
@@ -1,25 +1,24 @@
|
||||
/* Native method references for those with the same name as other `lodash` methods. */
|
||||
var nativeFloor = Math.floor,
|
||||
nativeMin = Math.min;
|
||||
|
||||
/** Used as references for the maximum length and index of an array. */
|
||||
var MAX_ARRAY_LENGTH = 4294967295,
|
||||
MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1;
|
||||
|
||||
/* Built-in method references for those with the same name as other `lodash` methods. */
|
||||
var nativeFloor = Math.floor,
|
||||
nativeMin = Math.min;
|
||||
|
||||
/**
|
||||
* This function is like `binaryIndex` except that it invokes `iteratee` for
|
||||
* `value` and each element of `array` to compute their sort ranking. The
|
||||
* iteratee is invoked with one argument; (value).
|
||||
* The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
|
||||
* which invokes `iteratee` for `value` and each element of `array` to compute
|
||||
* their sort ranking. The iteratee is invoked with one argument; (value).
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The sorted array to inspect.
|
||||
* @param {*} value The value to evaluate.
|
||||
* @param {Function} iteratee The function invoked per iteration.
|
||||
* @param {Function} iteratee The iteratee invoked per element.
|
||||
* @param {boolean} [retHighest] Specify returning the highest qualified index.
|
||||
* @returns {number} Returns the index at which `value` should be inserted
|
||||
* into `array`.
|
||||
* @returns {number} Returns the index at which `value` should be inserted into `array`.
|
||||
*/
|
||||
function binaryIndexBy(array, value, iteratee, retHighest) {
|
||||
function baseSortedIndexBy(array, value, iteratee, retHighest) {
|
||||
value = iteratee(value);
|
||||
|
||||
var low = 0,
|
||||
@@ -54,4 +53,4 @@ function binaryIndexBy(array, value, iteratee, retHighest) {
|
||||
return nativeMin(high, MAX_ARRAY_INDEX);
|
||||
}
|
||||
|
||||
export default binaryIndexBy;
|
||||
export default baseSortedIndexBy;
|
||||
14
internal/baseSortedUniq.js
Normal file
14
internal/baseSortedUniq.js
Normal file
@@ -0,0 +1,14 @@
|
||||
import baseSortedUniqBy from './baseSortedUniqBy';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.sortedUniq`.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to inspect.
|
||||
* @returns {Array} Returns the new duplicate free array.
|
||||
*/
|
||||
function baseSortedUniq(array) {
|
||||
return baseSortedUniqBy(array);
|
||||
}
|
||||
|
||||
export default baseSortedUniq;
|
||||
33
internal/baseSortedUniqBy.js
Normal file
33
internal/baseSortedUniqBy.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import eq from '../eq';
|
||||
|
||||
/**
|
||||
* The base implementation of `_.sortedUniqBy` without support for iteratee
|
||||
* shorthands.
|
||||
*
|
||||
* @private
|
||||
* @param {Array} array The array to inspect.
|
||||
* @param {Function} [iteratee] The iteratee invoked per element.
|
||||
* @returns {Array} Returns the new duplicate free array.
|
||||
*/
|
||||
function baseSortedUniqBy(array, iteratee) {
|
||||
var index = 0,
|
||||
length = array.length,
|
||||
value = array[0],
|
||||
computed = iteratee ? iteratee(value) : value,
|
||||
seen = computed,
|
||||
resIndex = 0,
|
||||
result = [value];
|
||||
|
||||
while (++index < length) {
|
||||
value = array[index],
|
||||
computed = iteratee ? iteratee(value) : value;
|
||||
|
||||
if (!eq(computed, seen)) {
|
||||
seen = computed;
|
||||
result[++resIndex] = value;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
export default baseSortedUniqBy;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user