diff --git a/README.md b/README.md
index 336187271..4d1258e05 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# lodash v3.5.0
+# lodash v3.6.0
The [modern build](https://github.com/lodash/lodash/wiki/Build-Differences) of [lodash](https://lodash.com/) exported as [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules.
diff --git a/array/difference.js b/array/difference.js
index 218bcd5b6..073c5a9cf 100644
--- a/array/difference.js
+++ b/array/difference.js
@@ -1,13 +1,12 @@
-define(['../internal/baseDifference', '../internal/baseFlatten', '../lang/isArguments', '../lang/isArray'], function(baseDifference, baseFlatten, isArguments, isArray) {
+define(['../internal/baseDifference', '../internal/baseFlatten', '../lang/isArguments', '../lang/isArray', '../function/restParam'], function(baseDifference, baseFlatten, isArguments, isArray, restParam) {
/**
* Creates an array excluding all values of the provided arrays using
* `SameValueZero` for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -20,19 +19,11 @@ define(['../internal/baseDifference', '../internal/baseFlatten', '../lang/isArgu
* _.difference([1, 2, 3], [4, 2]);
* // => [1, 3]
*/
- function difference() {
- var args = arguments,
- index = -1,
- length = args.length;
-
- while (++index < length) {
- var value = args[index];
- if (isArray(value) || isArguments(value)) {
- break;
- }
- }
- return baseDifference(value, baseFlatten(args, false, true, ++index));
- }
+ var difference = restParam(function(array, values) {
+ return (isArray(array) || isArguments(array))
+ ? baseDifference(array, baseFlatten(values, false, true))
+ : [];
+ });
return difference;
});
diff --git a/array/dropRightWhile.js b/array/dropRightWhile.js
index 5d62ff0e5..8a245bfb5 100644
--- a/array/dropRightWhile.js
+++ b/array/dropRightWhile.js
@@ -1,9 +1,9 @@
-define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallback, baseSlice) {
+define(['../internal/baseCallback', '../internal/baseWhile'], function(baseCallback, baseWhile) {
/**
* Creates a slice of `array` excluding elements dropped from the end.
* Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, index, array).
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -50,13 +50,9 @@ define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallb
* // => ['barney', 'fred', 'pebbles']
*/
function dropRightWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- predicate = baseCallback(predicate, thisArg, 3);
- while (length-- && predicate(array[length], length, array)) {}
- return baseSlice(array, 0, length + 1);
+ return (array && array.length)
+ ? baseWhile(array, baseCallback(predicate, thisArg, 3), true, true)
+ : [];
}
return dropRightWhile;
diff --git a/array/dropWhile.js b/array/dropWhile.js
index 7148f4ffb..09c4b70e9 100644
--- a/array/dropWhile.js
+++ b/array/dropWhile.js
@@ -1,9 +1,9 @@
-define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallback, baseSlice) {
+define(['../internal/baseCallback', '../internal/baseWhile'], function(baseCallback, baseWhile) {
/**
* Creates a slice of `array` excluding elements dropped from the beginning.
* Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, index, array).
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -50,14 +50,9 @@ define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallb
* // => ['barney', 'fred', 'pebbles']
*/
function dropWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- var index = -1;
- predicate = baseCallback(predicate, thisArg, 3);
- while (++index < length && predicate(array[index], index, array)) {}
- return baseSlice(array, index);
+ return (array && array.length)
+ ? baseWhile(array, baseCallback(predicate, thisArg, 3), true)
+ : [];
}
return dropWhile;
diff --git a/array/fill.js b/array/fill.js
index ef172dd02..a8e067839 100644
--- a/array/fill.js
+++ b/array/fill.js
@@ -14,6 +14,19 @@ define(['../internal/baseFill', '../internal/isIterateeCall'], function(baseFill
* @param {number} [start=0] The start position.
* @param {number} [end=array.length] The end position.
* @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8], '*', 1, 2);
+ * // => [4, '*', 8]
*/
function fill(array, value, start, end) {
var length = array ? array.length : 0;
diff --git a/array/findIndex.js b/array/findIndex.js
index 7edf0a794..3f8c8fd6c 100644
--- a/array/findIndex.js
+++ b/array/findIndex.js
@@ -1,8 +1,8 @@
-define(['../internal/baseCallback'], function(baseCallback) {
+define(['../internal/createFindIndex'], function(createFindIndex) {
/**
* This method is like `_.find` except that it returns the index of the first
- * element `predicate` returns truthy for, instead of the element itself.
+ * element `predicate` returns truthy for instead of the element itself.
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -48,18 +48,7 @@ define(['../internal/baseCallback'], function(baseCallback) {
* _.findIndex(users, 'active');
* // => 2
*/
- function findIndex(array, predicate, thisArg) {
- var index = -1,
- length = array ? array.length : 0;
-
- predicate = baseCallback(predicate, thisArg, 3);
- while (++index < length) {
- if (predicate(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
+ var findIndex = createFindIndex();
return findIndex;
});
diff --git a/array/findLastIndex.js b/array/findLastIndex.js
index f5eee6303..dc9a99e98 100644
--- a/array/findLastIndex.js
+++ b/array/findLastIndex.js
@@ -1,4 +1,4 @@
-define(['../internal/baseCallback'], function(baseCallback) {
+define(['../internal/createFindIndex'], function(createFindIndex) {
/**
* This method is like `_.findIndex` except that it iterates over elements
@@ -48,16 +48,7 @@ define(['../internal/baseCallback'], function(baseCallback) {
* _.findLastIndex(users, 'active');
* // => 0
*/
- function findLastIndex(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- predicate = baseCallback(predicate, thisArg, 3);
- while (length--) {
- if (predicate(array[length], length, array)) {
- return length;
- }
- }
- return -1;
- }
+ var findLastIndex = createFindIndex(true);
return findLastIndex;
});
diff --git a/array/flatten.js b/array/flatten.js
index b1ad7c3af..8461c11be 100644
--- a/array/flatten.js
+++ b/array/flatten.js
@@ -14,18 +14,18 @@ define(['../internal/baseFlatten', '../internal/isIterateeCall'], function(baseF
* @example
*
* _.flatten([1, [2, 3, [4]]]);
- * // => [1, 2, 3, [4]];
+ * // => [1, 2, 3, [4]]
*
* // using `isDeep`
* _.flatten([1, [2, 3, [4]]], true);
- * // => [1, 2, 3, 4];
+ * // => [1, 2, 3, 4]
*/
function flatten(array, isDeep, guard) {
var length = array ? array.length : 0;
if (guard && isIterateeCall(array, isDeep, guard)) {
isDeep = false;
}
- return length ? baseFlatten(array, isDeep, false, 0) : [];
+ return length ? baseFlatten(array, isDeep) : [];
}
return flatten;
diff --git a/array/flattenDeep.js b/array/flattenDeep.js
index 1c64fe39c..3245d8670 100644
--- a/array/flattenDeep.js
+++ b/array/flattenDeep.js
@@ -11,11 +11,11 @@ define(['../internal/baseFlatten'], function(baseFlatten) {
* @example
*
* _.flattenDeep([1, [2, 3, [4]]]);
- * // => [1, 2, 3, 4];
+ * // => [1, 2, 3, 4]
*/
function flattenDeep(array) {
var length = array ? array.length : 0;
- return length ? baseFlatten(array, true, false, 0) : [];
+ return length ? baseFlatten(array, true) : [];
}
return flattenDeep;
diff --git a/array/indexOf.js b/array/indexOf.js
index 54c4f13a1..af8c09ac9 100644
--- a/array/indexOf.js
+++ b/array/indexOf.js
@@ -9,10 +9,9 @@ define(['../internal/baseIndexOf', '../internal/binaryIndex'], function(baseInde
* it is used as the offset from the end of `array`. If `array` is sorted
* providing `true` for `fromIndex` performs a faster binary search.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
diff --git a/array/intersection.js b/array/intersection.js
index fae848e3c..fda10ebeb 100644
--- a/array/intersection.js
+++ b/array/intersection.js
@@ -4,10 +4,9 @@ define(['../internal/baseIndexOf', '../internal/cacheIndexOf', '../internal/crea
* Creates an array of unique values in all provided arrays using `SameValueZero`
* for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
diff --git a/array/pull.js b/array/pull.js
index 2a86bc79d..3ae67b26a 100644
--- a/array/pull.js
+++ b/array/pull.js
@@ -11,10 +11,10 @@ define(['../internal/baseIndexOf'], function(baseIndexOf) {
* comparisons.
*
* **Notes:**
- * - Unlike `_.without`, this method mutates `array`.
- * - `SameValueZero` comparisons are like strict equality comparisons, e.g. `===`,
- * except that `NaN` matches `NaN`. See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * - Unlike `_.without`, this method mutates `array`
+ * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except
+ * that `NaN` matches `NaN`
*
* @static
* @memberOf _
diff --git a/array/pullAt.js b/array/pullAt.js
index 48b79401f..58ba6e175 100644
--- a/array/pullAt.js
+++ b/array/pullAt.js
@@ -1,4 +1,10 @@
-define(['../internal/baseFlatten', '../internal/basePullAt'], function(baseFlatten, basePullAt) {
+define(['../internal/baseAt', '../internal/baseCompareAscending', '../internal/baseFlatten', '../internal/isIndex', '../function/restParam'], function(baseAt, baseCompareAscending, baseFlatten, isIndex, restParam) {
+
+ /** Used for native method references. */
+ var arrayProto = Array.prototype;
+
+ /** Native method references. */
+ var splice = arrayProto.splice;
/**
* Removes elements from `array` corresponding to the given indexes and returns
@@ -25,9 +31,23 @@ define(['../internal/baseFlatten', '../internal/basePullAt'], function(baseFlatt
* console.log(evens);
* // => [10, 20]
*/
- function pullAt(array) {
- return basePullAt(array || [], baseFlatten(arguments, false, false, 1));
- }
+ var pullAt = restParam(function(array, indexes) {
+ array || (array = []);
+ indexes = baseFlatten(indexes);
+
+ var length = indexes.length,
+ result = baseAt(array, indexes);
+
+ indexes.sort(baseCompareAscending);
+ while (length--) {
+ var index = parseFloat(indexes[length]);
+ if (index != previous && isIndex(index)) {
+ var previous = index;
+ splice.call(array, index, 1);
+ }
+ }
+ return result;
+ });
return pullAt;
});
diff --git a/array/remove.js b/array/remove.js
index 5a5f33182..60dac434e 100644
--- a/array/remove.js
+++ b/array/remove.js
@@ -9,7 +9,7 @@ define(['../internal/baseCallback'], function(baseCallback) {
/**
* Removes all elements from `array` that `predicate` returns truthy for
* and returns an array of the removed elements. The predicate is bound to
- * `thisArg` and invoked with three arguments; (value, index, array).
+ * `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
diff --git a/array/sortedIndex.js b/array/sortedIndex.js
index 51f6c67fc..9b65515ea 100644
--- a/array/sortedIndex.js
+++ b/array/sortedIndex.js
@@ -1,4 +1,4 @@
-define(['../internal/baseCallback', '../internal/binaryIndex', '../internal/binaryIndexBy'], function(baseCallback, binaryIndex, binaryIndexBy) {
+define(['../internal/createSortedIndex'], function(createSortedIndex) {
/**
* Uses a binary search to determine the lowest index at which `value` should
@@ -7,14 +7,14 @@ define(['../internal/baseCallback', '../internal/binaryIndex', '../internal/bina
* to compute their sort ranking. The iteratee is bound to `thisArg` and
* invoked with one argument; (value).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -48,11 +48,7 @@ define(['../internal/baseCallback', '../internal/binaryIndex', '../internal/bina
* _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
* // => 1
*/
- function sortedIndex(array, value, iteratee, thisArg) {
- return iteratee == null
- ? binaryIndex(array, value)
- : binaryIndexBy(array, value, baseCallback(iteratee, thisArg, 1));
- }
+ var sortedIndex = createSortedIndex();
return sortedIndex;
});
diff --git a/array/sortedLastIndex.js b/array/sortedLastIndex.js
index 1628dc8bc..20c917697 100644
--- a/array/sortedLastIndex.js
+++ b/array/sortedLastIndex.js
@@ -1,4 +1,4 @@
-define(['../internal/baseCallback', '../internal/binaryIndex', '../internal/binaryIndexBy'], function(baseCallback, binaryIndex, binaryIndexBy) {
+define(['../internal/createSortedIndex'], function(createSortedIndex) {
/**
* This method is like `_.sortedIndex` except that it returns the highest
@@ -20,11 +20,7 @@ define(['../internal/baseCallback', '../internal/binaryIndex', '../internal/bina
* _.sortedLastIndex([4, 4, 5, 5], 5);
* // => 4
*/
- function sortedLastIndex(array, value, iteratee, thisArg) {
- return iteratee == null
- ? binaryIndex(array, value, true)
- : binaryIndexBy(array, value, baseCallback(iteratee, thisArg, 1), true);
- }
+ var sortedLastIndex = createSortedIndex(true);
return sortedLastIndex;
});
diff --git a/array/takeRightWhile.js b/array/takeRightWhile.js
index dbcef3d5a..bca3955bb 100644
--- a/array/takeRightWhile.js
+++ b/array/takeRightWhile.js
@@ -1,9 +1,9 @@
-define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallback, baseSlice) {
+define(['../internal/baseCallback', '../internal/baseWhile'], function(baseCallback, baseWhile) {
/**
* Creates a slice of `array` with elements taken from the end. Elements are
* taken until `predicate` returns falsey. The predicate is bound to `thisArg`
- * and invoked with three arguments; (value, index, array).
+ * and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -50,13 +50,9 @@ define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallb
* // => []
*/
function takeRightWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- predicate = baseCallback(predicate, thisArg, 3);
- while (length-- && predicate(array[length], length, array)) {}
- return baseSlice(array, length + 1);
+ return (array && array.length)
+ ? baseWhile(array, baseCallback(predicate, thisArg, 3), false, true)
+ : [];
}
return takeRightWhile;
diff --git a/array/takeWhile.js b/array/takeWhile.js
index e4fe044f1..62de8f90b 100644
--- a/array/takeWhile.js
+++ b/array/takeWhile.js
@@ -1,9 +1,9 @@
-define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallback, baseSlice) {
+define(['../internal/baseCallback', '../internal/baseWhile'], function(baseCallback, baseWhile) {
/**
* Creates a slice of `array` with elements taken from the beginning. Elements
* are taken until `predicate` returns falsey. The predicate is bound to
- * `thisArg` and invoked with three arguments; (value, index, array).
+ * `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -50,14 +50,9 @@ define(['../internal/baseCallback', '../internal/baseSlice'], function(baseCallb
* // => []
*/
function takeWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- var index = -1;
- predicate = baseCallback(predicate, thisArg, 3);
- while (++index < length && predicate(array[index], index, array)) {}
- return baseSlice(array, 0, index);
+ return (array && array.length)
+ ? baseWhile(array, baseCallback(predicate, thisArg, 3))
+ : [];
}
return takeWhile;
diff --git a/array/union.js b/array/union.js
index 8648246ab..74ba1e47e 100644
--- a/array/union.js
+++ b/array/union.js
@@ -1,13 +1,12 @@
-define(['../internal/baseFlatten', '../internal/baseUniq'], function(baseFlatten, baseUniq) {
+define(['../internal/baseFlatten', '../internal/baseUniq', '../function/restParam'], function(baseFlatten, baseUniq, restParam) {
/**
* Creates an array of unique values, in order, of the provided arrays using
* `SameValueZero` for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -19,9 +18,9 @@ define(['../internal/baseFlatten', '../internal/baseUniq'], function(baseFlatten
* _.union([1, 2], [4, 2], [2, 1]);
* // => [1, 2, 4]
*/
- function union() {
- return baseUniq(baseFlatten(arguments, false, true, 0));
- }
+ var union = restParam(function(arrays) {
+ return baseUniq(baseFlatten(arrays, false, true));
+ });
return union;
});
diff --git a/array/uniq.js b/array/uniq.js
index 13626f167..ff6f96d8e 100644
--- a/array/uniq.js
+++ b/array/uniq.js
@@ -6,23 +6,22 @@ define(['../internal/baseCallback', '../internal/baseUniq', '../internal/isItera
* search algorithm for sorted arrays. If an iteratee function is provided it
* is invoked for each value in the array to generate the criterion by which
* uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked
- * with three arguments; (value, index, array).
+ * with three arguments: (value, index, array).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
diff --git a/array/without.js b/array/without.js
index 9da8d5466..743b8952f 100644
--- a/array/without.js
+++ b/array/without.js
@@ -1,13 +1,12 @@
-define(['../internal/baseDifference', '../internal/baseSlice'], function(baseDifference, baseSlice) {
+define(['../internal/baseDifference', '../lang/isArguments', '../lang/isArray', '../function/restParam'], function(baseDifference, isArguments, isArray, restParam) {
/**
* Creates an array excluding all provided values using `SameValueZero` for
* equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -20,9 +19,11 @@ define(['../internal/baseDifference', '../internal/baseSlice'], function(baseDif
* _.without([1, 2, 1, 3], 1, 2);
* // => [3]
*/
- function without(array) {
- return baseDifference(array, baseSlice(arguments, 1));
- }
+ var without = restParam(function(array, values) {
+ return (isArray(array) || isArguments(array))
+ ? baseDifference(array, values)
+ : [];
+ });
return without;
});
diff --git a/array/xor.js b/array/xor.js
index fa3e7e058..bb25427d2 100644
--- a/array/xor.js
+++ b/array/xor.js
@@ -1,9 +1,8 @@
define(['../internal/baseDifference', '../internal/baseUniq', '../lang/isArguments', '../lang/isArray'], function(baseDifference, baseUniq, isArguments, isArray) {
/**
- * Creates an array that is the symmetric difference of the provided arrays.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Symmetric_difference) for
- * more details.
+ * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the provided arrays.
*
* @static
* @memberOf _
diff --git a/array/zip.js b/array/zip.js
index be0db166d..ef9add3be 100644
--- a/array/zip.js
+++ b/array/zip.js
@@ -1,4 +1,4 @@
-define(['./unzip'], function(unzip) {
+define(['../function/restParam', './unzip'], function(restParam, unzip) {
/**
* Creates an array of grouped elements, the first of which contains the first
@@ -15,15 +15,7 @@ define(['./unzip'], function(unzip) {
* _.zip(['fred', 'barney'], [30, 40], [true, false]);
* // => [['fred', 30, true], ['barney', 40, false]]
*/
- function zip() {
- var length = arguments.length,
- array = Array(length);
-
- while (length--) {
- array[length] = arguments[length];
- }
- return unzip(array);
- }
+ var zip = restParam(unzip);
return zip;
});
diff --git a/array/zipObject.js b/array/zipObject.js
index 4561ab23a..8c4425cf4 100644
--- a/array/zipObject.js
+++ b/array/zipObject.js
@@ -1,9 +1,10 @@
define(['../lang/isArray'], function(isArray) {
/**
- * Creates an object composed from arrays of property names and values. Provide
- * either a single two dimensional array, e.g. `[[key1, value1], [key2, value2]]`
- * or two arrays, one of property names and one of corresponding values.
+ * The inverse of `_.pairs`; this method returns an object composed from arrays
+ * of property names and values. Provide either a single two dimensional array,
+ * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
+ * and one of corresponding values.
*
* @static
* @memberOf _
@@ -14,6 +15,9 @@ define(['../lang/isArray'], function(isArray) {
* @returns {Object} Returns the new object.
* @example
*
+ * _.zipObject([['fred', 30], ['barney', 40]]);
+ * // => { 'fred': 30, 'barney': 40 }
+ *
* _.zipObject(['fred', 'barney'], [30, 40]);
* // => { 'fred': 30, 'barney': 40 }
*/
diff --git a/chain/thru.js b/chain/thru.js
index d597635a2..102e019e7 100644
--- a/chain/thru.js
+++ b/chain/thru.js
@@ -12,13 +12,14 @@ define([], function() {
* @returns {*} Returns the result of `interceptor`.
* @example
*
- * _([1, 2, 3])
- * .last()
+ * _(' abc ')
+ * .chain()
+ * .trim()
* .thru(function(value) {
* return [value];
* })
* .value();
- * // => [3]
+ * // => ['abc']
*/
function thru(value, interceptor, thisArg) {
return interceptor.call(thisArg, value);
diff --git a/collection/at.js b/collection/at.js
index f8bdba9aa..983344d7f 100644
--- a/collection/at.js
+++ b/collection/at.js
@@ -1,4 +1,4 @@
-define(['../internal/baseAt', '../internal/baseFlatten', '../internal/isLength', '../internal/toIterable'], function(baseAt, baseFlatten, isLength, toIterable) {
+define(['../internal/baseAt', '../internal/baseFlatten', '../internal/isLength', '../function/restParam', '../internal/toIterable'], function(baseAt, baseFlatten, isLength, restParam, toIterable) {
/**
* Creates an array of elements corresponding to the given keys, or indexes,
@@ -17,16 +17,16 @@ define(['../internal/baseAt', '../internal/baseFlatten', '../internal/isLength',
* _.at(['a', 'b', 'c'], [0, 2]);
* // => ['a', 'c']
*
- * _.at(['fred', 'barney', 'pebbles'], 0, 2);
- * // => ['fred', 'pebbles']
+ * _.at(['barney', 'fred', 'pebbles'], 0, 2);
+ * // => ['barney', 'pebbles']
*/
- function at(collection) {
+ var at = restParam(function(collection, props) {
var length = collection ? collection.length : 0;
if (isLength(length)) {
collection = toIterable(collection);
}
- return baseAt(collection, baseFlatten(arguments, false, false, 1));
- }
+ return baseAt(collection, baseFlatten(props));
+ });
return at;
});
diff --git a/collection/countBy.js b/collection/countBy.js
index 840ad72a0..7bf87281f 100644
--- a/collection/countBy.js
+++ b/collection/countBy.js
@@ -10,17 +10,17 @@ define(['../internal/createAggregator'], function(createAggregator) {
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is the number of times the key was returned by `iteratee`.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
diff --git a/collection/every.js b/collection/every.js
index 7e7079ddd..bce32fbb2 100644
--- a/collection/every.js
+++ b/collection/every.js
@@ -1,8 +1,8 @@
-define(['../internal/arrayEvery', '../internal/baseCallback', '../internal/baseEvery', '../lang/isArray'], function(arrayEvery, baseCallback, baseEvery, isArray) {
+define(['../internal/arrayEvery', '../internal/baseCallback', '../internal/baseEvery', '../lang/isArray', '../internal/isIterateeCall'], function(arrayEvery, baseCallback, baseEvery, isArray, isIterateeCall) {
/**
* Checks if `predicate` returns truthy for **all** elements of `collection`.
- * The predicate is bound to `thisArg` and invoked with three arguments;
+ * The predicate is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
@@ -50,6 +50,9 @@ define(['../internal/arrayEvery', '../internal/baseCallback', '../internal/baseE
*/
function every(collection, predicate, thisArg) {
var func = isArray(collection) ? arrayEvery : baseEvery;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = null;
+ }
if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
predicate = baseCallback(predicate, thisArg, 3);
}
diff --git a/collection/filter.js b/collection/filter.js
index 8c24e6b66..1c66ae8a5 100644
--- a/collection/filter.js
+++ b/collection/filter.js
@@ -3,7 +3,7 @@ define(['../internal/arrayFilter', '../internal/baseCallback', '../internal/base
/**
* Iterates over elements of `collection`, returning an array of all elements
* `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
+ * invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
diff --git a/collection/find.js b/collection/find.js
index 63592a95c..1da1d77c7 100644
--- a/collection/find.js
+++ b/collection/find.js
@@ -1,12 +1,9 @@
-define(['../internal/baseCallback', '../internal/baseEach', '../internal/baseFind', '../array/findIndex', '../lang/isArray'], function(baseCallback, baseEach, baseFind, findIndex, isArray) {
-
- /** Used as a safe reference for `undefined` in pre-ES5 environments. */
- var undefined;
+define(['../internal/baseEach', '../internal/createFind'], function(baseEach, createFind) {
/**
* Iterates over elements of `collection`, returning the first element
* `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
+ * invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -53,14 +50,7 @@ define(['../internal/baseCallback', '../internal/baseEach', '../internal/baseFin
* _.result(_.find(users, 'active'), 'user');
* // => 'barney'
*/
- function find(collection, predicate, thisArg) {
- if (isArray(collection)) {
- var index = findIndex(collection, predicate, thisArg);
- return index > -1 ? collection[index] : undefined;
- }
- predicate = baseCallback(predicate, thisArg, 3);
- return baseFind(collection, predicate, baseEach);
- }
+ var find = createFind(baseEach);
return find;
});
diff --git a/collection/findLast.js b/collection/findLast.js
index 80add0958..2843eda55 100644
--- a/collection/findLast.js
+++ b/collection/findLast.js
@@ -1,4 +1,4 @@
-define(['../internal/baseCallback', '../internal/baseEachRight', '../internal/baseFind'], function(baseCallback, baseEachRight, baseFind) {
+define(['../internal/baseEachRight', '../internal/createFind'], function(baseEachRight, createFind) {
/**
* This method is like `_.find` except that it iterates over elements of
@@ -19,10 +19,7 @@ define(['../internal/baseCallback', '../internal/baseEachRight', '../internal/ba
* });
* // => 3
*/
- function findLast(collection, predicate, thisArg) {
- predicate = baseCallback(predicate, thisArg, 3);
- return baseFind(collection, predicate, baseEachRight);
- }
+ var findLast = createFind(baseEachRight, true);
return findLast;
});
diff --git a/collection/forEach.js b/collection/forEach.js
index a03c8a883..3921636d4 100644
--- a/collection/forEach.js
+++ b/collection/forEach.js
@@ -1,8 +1,8 @@
-define(['../internal/arrayEach', '../internal/baseEach', '../internal/bindCallback', '../lang/isArray'], function(arrayEach, baseEach, bindCallback, isArray) {
+define(['../internal/arrayEach', '../internal/baseEach', '../internal/createForEach'], function(arrayEach, baseEach, createForEach) {
/**
* Iterates over elements of `collection` invoking `iteratee` for each element.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection). Iterator functions may exit iteration early
* by explicitly returning `false`.
*
@@ -30,11 +30,7 @@ define(['../internal/arrayEach', '../internal/baseEach', '../internal/bindCallba
* });
* // => logs each value-key pair and returns the object (iteration order is not guaranteed)
*/
- function forEach(collection, iteratee, thisArg) {
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
- ? arrayEach(collection, iteratee)
- : baseEach(collection, bindCallback(iteratee, thisArg, 3));
- }
+ var forEach = createForEach(arrayEach, baseEach);
return forEach;
});
diff --git a/collection/forEachRight.js b/collection/forEachRight.js
index 0233ef977..77e594416 100644
--- a/collection/forEachRight.js
+++ b/collection/forEachRight.js
@@ -1,4 +1,4 @@
-define(['../internal/arrayEachRight', '../internal/baseEachRight', '../internal/bindCallback', '../lang/isArray'], function(arrayEachRight, baseEachRight, bindCallback, isArray) {
+define(['../internal/arrayEachRight', '../internal/baseEachRight', '../internal/createForEach'], function(arrayEachRight, baseEachRight, createForEach) {
/**
* This method is like `_.forEach` except that it iterates over elements of
@@ -16,14 +16,10 @@ define(['../internal/arrayEachRight', '../internal/baseEachRight', '../internal/
*
* _([1, 2]).forEachRight(function(n) {
* console.log(n);
- * }).join(',');
+ * }).value();
* // => logs each value from right to left and returns the array
*/
- function forEachRight(collection, iteratee, thisArg) {
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
- ? arrayEachRight(collection, iteratee)
- : baseEachRight(collection, bindCallback(iteratee, thisArg, 3));
- }
+ var forEachRight = createForEach(arrayEachRight, baseEachRight);
return forEachRight;
});
diff --git a/collection/groupBy.js b/collection/groupBy.js
index fbda007b4..1480304a4 100644
--- a/collection/groupBy.js
+++ b/collection/groupBy.js
@@ -10,17 +10,17 @@ define(['../internal/createAggregator'], function(createAggregator) {
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is an array of the elements responsible for generating the key.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
diff --git a/collection/includes.js b/collection/includes.js
index 9eb276b9f..0e65007fe 100644
--- a/collection/includes.js
+++ b/collection/includes.js
@@ -1,4 +1,4 @@
-define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isLength', '../lang/isString', '../object/values'], function(baseIndexOf, isArray, isLength, isString, values) {
+define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isIterateeCall', '../internal/isLength', '../lang/isString', '../object/values'], function(baseIndexOf, isArray, isIterateeCall, isLength, isString, values) {
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
@@ -8,10 +8,9 @@ define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isLength', '.
* comparisons. If `fromIndex` is negative, it is used as the offset from
* the end of `collection`.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -20,6 +19,7 @@ define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isLength', '.
* @param {Array|Object|string} collection The collection to search.
* @param {*} target The value to search for.
* @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
* @returns {boolean} Returns `true` if a matching element is found, else `false`.
* @example
*
@@ -35,7 +35,7 @@ define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isLength', '.
* _.includes('pebbles', 'eb');
* // => true
*/
- function includes(collection, target, fromIndex) {
+ function includes(collection, target, fromIndex, guard) {
var length = collection ? collection.length : 0;
if (!isLength(length)) {
collection = values(collection);
@@ -44,10 +44,10 @@ define(['../internal/baseIndexOf', '../lang/isArray', '../internal/isLength', '.
if (!length) {
return false;
}
- if (typeof fromIndex == 'number') {
- fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
- } else {
+ if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
fromIndex = 0;
+ } else {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
}
return (typeof collection == 'string' || !isArray(collection) && isString(collection))
? (fromIndex < length && collection.indexOf(target, fromIndex) > -1)
diff --git a/collection/indexBy.js b/collection/indexBy.js
index 8ffad8124..07200fafa 100644
--- a/collection/indexBy.js
+++ b/collection/indexBy.js
@@ -4,17 +4,17 @@ define(['../internal/createAggregator'], function(createAggregator) {
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is the last element responsible for generating the key. The
- * iteratee function is bound to `thisArg` and invoked with three arguments;
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
diff --git a/collection/invoke.js b/collection/invoke.js
index 06f1c09b3..9944cae8c 100644
--- a/collection/invoke.js
+++ b/collection/invoke.js
@@ -1,4 +1,7 @@
-define(['../internal/baseInvoke', '../internal/baseSlice'], function(baseInvoke, baseSlice) {
+define(['../internal/baseEach', '../internal/isLength', '../function/restParam'], function(baseEach, isLength, restParam) {
+
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+ var undefined;
/**
* Invokes the method named by `methodName` on each element in `collection`,
@@ -22,9 +25,18 @@ define(['../internal/baseInvoke', '../internal/baseSlice'], function(baseInvoke,
* _.invoke([123, 456], String.prototype.split, '');
* // => [['1', '2', '3'], ['4', '5', '6']]
*/
- function invoke(collection, methodName) {
- return baseInvoke(collection, methodName, baseSlice(arguments, 2));
- }
+ var invoke = restParam(function(collection, methodName, args) {
+ var index = -1,
+ isFunc = typeof methodName == 'function',
+ length = collection ? collection.length : 0,
+ result = isLength(length) ? Array(length) : [];
+
+ baseEach(collection, function(value) {
+ var func = isFunc ? methodName : (value != null && value[methodName]);
+ result[++index] = func ? func.apply(value, args) : undefined;
+ });
+ return result;
+ });
return invoke;
});
diff --git a/collection/map.js b/collection/map.js
index 78e1d836c..6d58970c4 100644
--- a/collection/map.js
+++ b/collection/map.js
@@ -3,16 +3,16 @@ define(['../internal/arrayMap', '../internal/baseCallback', '../internal/baseMap
/**
* Creates an array of values by running each element in `collection` through
* `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index|key, collection).
+ * arguments: (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -21,9 +21,9 @@ define(['../internal/arrayMap', '../internal/baseCallback', '../internal/baseMap
*
* The guarded methods are:
* `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,
- * `dropRight`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`, `slice`,
- * `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`, `trimRight`,
- * `trunc`, `random`, `range`, `sample`, `uniq`, and `words`
+ * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,
+ * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,
+ * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`
*
* @static
* @memberOf _
diff --git a/collection/partition.js b/collection/partition.js
index caa86d4f6..0315c25fb 100644
--- a/collection/partition.js
+++ b/collection/partition.js
@@ -4,7 +4,7 @@ define(['../internal/createAggregator'], function(createAggregator) {
* Creates an array of elements split into two groups, the first of which
* contains elements `predicate` returns truthy for, while the second of which
* contains elements `predicate` returns falsey for. The predicate is bound
- * to `thisArg` and invoked with three arguments; (value, index|key, collection).
+ * to `thisArg` and invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
diff --git a/collection/reduce.js b/collection/reduce.js
index 947d99c80..5f310b576 100644
--- a/collection/reduce.js
+++ b/collection/reduce.js
@@ -1,18 +1,18 @@
-define(['../internal/arrayReduce', '../internal/baseCallback', '../internal/baseEach', '../internal/baseReduce', '../lang/isArray'], function(arrayReduce, baseCallback, baseEach, baseReduce, isArray) {
+define(['../internal/arrayReduce', '../internal/baseEach', '../internal/createReduce'], function(arrayReduce, baseEach, createReduce) {
/**
* Reduces `collection` to a value which is the accumulated result of running
* each element in `collection` through `iteratee`, where each successive
* invocation is supplied the return value of the previous. If `accumulator`
* is not provided the first element of `collection` is used as the initial
- * value. The `iteratee` is bound to `thisArg`and invoked with four arguments;
+ * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
* (accumulator, value, index|key, collection).
*
* Many lodash methods are guarded to work as interatees for methods like
* `_.reduce`, `_.reduceRight`, and `_.transform`.
*
* The guarded methods are:
- * `assign`, `defaults`, `merge`, and `sortAllBy`
+ * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`
*
* @static
* @memberOf _
@@ -36,10 +36,7 @@ define(['../internal/arrayReduce', '../internal/baseCallback', '../internal/base
* }, {});
* // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
*/
- function reduce(collection, iteratee, accumulator, thisArg) {
- var func = isArray(collection) ? arrayReduce : baseReduce;
- return func(collection, baseCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEach);
- }
+ var reduce = createReduce(arrayReduce, baseEach);
return reduce;
});
diff --git a/collection/reduceRight.js b/collection/reduceRight.js
index e64b4d815..4af771384 100644
--- a/collection/reduceRight.js
+++ b/collection/reduceRight.js
@@ -1,4 +1,4 @@
-define(['../internal/arrayReduceRight', '../internal/baseCallback', '../internal/baseEachRight', '../internal/baseReduce', '../lang/isArray'], function(arrayReduceRight, baseCallback, baseEachRight, baseReduce, isArray) {
+define(['../internal/arrayReduceRight', '../internal/baseEachRight', '../internal/createReduce'], function(arrayReduceRight, baseEachRight, createReduce) {
/**
* This method is like `_.reduce` except that it iterates over elements of
@@ -22,10 +22,7 @@ define(['../internal/arrayReduceRight', '../internal/baseCallback', '../internal
* }, []);
* // => [4, 5, 2, 3, 0, 1]
*/
- function reduceRight(collection, iteratee, accumulator, thisArg) {
- var func = isArray(collection) ? arrayReduceRight : baseReduce;
- return func(collection, baseCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEachRight);
- }
+ var reduceRight = createReduce(arrayReduceRight, baseEachRight);
return reduceRight;
});
diff --git a/collection/shuffle.js b/collection/shuffle.js
index 873c818f0..d0dfeeccf 100644
--- a/collection/shuffle.js
+++ b/collection/shuffle.js
@@ -1,9 +1,8 @@
define(['../internal/baseRandom', '../internal/toIterable'], function(baseRandom, toIterable) {
/**
- * Creates an array of shuffled values, using a version of the Fisher-Yates
- * shuffle. See [Wikipedia](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle)
- * for more details.
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
*
* @static
* @memberOf _
diff --git a/collection/some.js b/collection/some.js
index 0b69fac4c..5d31b5b3c 100644
--- a/collection/some.js
+++ b/collection/some.js
@@ -1,10 +1,10 @@
-define(['../internal/arraySome', '../internal/baseCallback', '../internal/baseSome', '../lang/isArray'], function(arraySome, baseCallback, baseSome, isArray) {
+define(['../internal/arraySome', '../internal/baseCallback', '../internal/baseSome', '../lang/isArray', '../internal/isIterateeCall'], function(arraySome, baseCallback, baseSome, isArray, isIterateeCall) {
/**
* Checks if `predicate` returns truthy for **any** element of `collection`.
* The function returns as soon as it finds a passing value and does not iterate
* over the entire collection. The predicate is bound to `thisArg` and invoked
- * with three arguments; (value, index|key, collection).
+ * with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -51,6 +51,9 @@ define(['../internal/arraySome', '../internal/baseCallback', '../internal/baseSo
*/
function some(collection, predicate, thisArg) {
var func = isArray(collection) ? arraySome : baseSome;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = null;
+ }
if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
predicate = baseCallback(predicate, thisArg, 3);
}
diff --git a/collection/sortBy.js b/collection/sortBy.js
index 103ead6da..3deb387ac 100644
--- a/collection/sortBy.js
+++ b/collection/sortBy.js
@@ -4,17 +4,17 @@ define(['../internal/baseCallback', '../internal/baseEach', '../internal/baseSor
* Creates an array of elements, sorted in ascending order by the results of
* running each element in a collection through `iteratee`. This method performs
* a stable sort, that is, it preserves the original sort order of equal elements.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
diff --git a/collection/sortByAll.js b/collection/sortByAll.js
index 76018fad9..7f42de4a9 100644
--- a/collection/sortByAll.js
+++ b/collection/sortByAll.js
@@ -23,17 +23,24 @@ define(['../internal/baseFlatten', '../internal/baseSortByOrder', '../internal/i
* _.map(_.sortByAll(users, ['user', 'age']), _.values);
* // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
*/
- function sortByAll(collection) {
+ function sortByAll() {
+ var args = arguments,
+ collection = args[0],
+ guard = args[3],
+ index = 0,
+ length = args.length - 1;
+
if (collection == null) {
return [];
}
- var args = arguments,
- guard = args[3];
-
- if (guard && isIterateeCall(args[1], args[2], guard)) {
- args = [collection, args[1]];
+ var props = Array(length);
+ while (index < length) {
+ props[index] = args[++index];
}
- return baseSortByOrder(collection, baseFlatten(args, false, false, 1), []);
+ if (guard && isIterateeCall(args[1], args[2], guard)) {
+ props = args[1];
+ }
+ return baseSortByOrder(collection, baseFlatten(props), []);
}
return sortByAll;
diff --git a/function.js b/function.js
index 3e43364b2..86939dff7 100644
--- a/function.js
+++ b/function.js
@@ -1,4 +1,4 @@
-define(['./function/after', './function/ary', './function/backflow', './function/before', './function/bind', './function/bindAll', './function/bindKey', './function/compose', './function/curry', './function/curryRight', './function/debounce', './function/defer', './function/delay', './function/flow', './function/flowRight', './function/memoize', './function/negate', './function/once', './function/partial', './function/partialRight', './function/rearg', './function/spread', './function/throttle', './function/wrap'], function(after, ary, backflow, before, bind, bindAll, bindKey, compose, curry, curryRight, debounce, defer, delay, flow, flowRight, memoize, negate, once, partial, partialRight, rearg, spread, throttle, wrap) {
+define(['./function/after', './function/ary', './function/backflow', './function/before', './function/bind', './function/bindAll', './function/bindKey', './function/compose', './function/curry', './function/curryRight', './function/debounce', './function/defer', './function/delay', './function/flow', './function/flowRight', './function/memoize', './function/negate', './function/once', './function/partial', './function/partialRight', './function/rearg', './function/restParam', './function/spread', './function/throttle', './function/wrap'], function(after, ary, backflow, before, bind, bindAll, bindKey, compose, curry, curryRight, debounce, defer, delay, flow, flowRight, memoize, negate, once, partial, partialRight, rearg, restParam, spread, throttle, wrap) {
return {
'after': after,
'ary': ary,
@@ -21,6 +21,7 @@ define(['./function/after', './function/ary', './function/backflow', './function
'partial': partial,
'partialRight': partialRight,
'rearg': rearg,
+ 'restParam': restParam,
'spread': spread,
'throttle': throttle,
'wrap': wrap
diff --git a/function/ary.js b/function/ary.js
index e175a5fcc..5243bf806 100644
--- a/function/ary.js
+++ b/function/ary.js
@@ -1,7 +1,7 @@
define(['../internal/createWrapper', '../internal/isIterateeCall'], function(createWrapper, isIterateeCall) {
/** Used to compose bitmasks for wrapper metadata. */
- var ARY_FLAG = 256;
+ var ARY_FLAG = 128;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
diff --git a/function/bind.js b/function/bind.js
index 14e532a30..0fab79383 100644
--- a/function/bind.js
+++ b/function/bind.js
@@ -1,4 +1,4 @@
-define(['../internal/baseSlice', '../internal/createWrapper', '../internal/replaceHolders'], function(baseSlice, createWrapper, replaceHolders) {
+define(['../internal/createWrapper', '../internal/replaceHolders', './restParam'], function(createWrapper, replaceHolders, restParam) {
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -20,7 +20,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* @category Function
* @param {Function} func The function to bind.
* @param {*} thisArg The `this` binding of `func`.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
@@ -39,16 +39,14 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* bound('hi');
* // => 'hi fred!'
*/
- function bind(func, thisArg) {
+ var bind = restParam(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
- if (arguments.length > 2) {
- var partials = baseSlice(arguments, 2),
- holders = replaceHolders(partials, bind.placeholder);
-
+ if (partials.length) {
+ var holders = replaceHolders(partials, bind.placeholder);
bitmask |= PARTIAL_FLAG;
}
return createWrapper(func, bitmask, thisArg, partials, holders);
- }
+ });
// Assign default placeholders.
bind.placeholder = {};
diff --git a/function/bindAll.js b/function/bindAll.js
index ae7582483..43a1a89bb 100644
--- a/function/bindAll.js
+++ b/function/bindAll.js
@@ -1,4 +1,7 @@
-define(['../internal/baseBindAll', '../internal/baseFlatten', '../object/functions'], function(baseBindAll, baseFlatten, functions) {
+define(['../internal/baseFlatten', '../internal/createWrapper', '../object/functions', './restParam'], function(baseFlatten, createWrapper, functions, restParam) {
+
+ /** Used to compose bitmasks for wrapper metadata. */
+ var BIND_FLAG = 1;
/**
* Binds methods of an object to the object itself, overwriting the existing
@@ -28,13 +31,18 @@ define(['../internal/baseBindAll', '../internal/baseFlatten', '../object/functio
* jQuery('#docs').on('click', view.onClick);
* // => logs 'clicked docs' when the element is clicked
*/
- function bindAll(object) {
- return baseBindAll(object,
- arguments.length > 1
- ? baseFlatten(arguments, false, false, 1)
- : functions(object)
- );
- }
+ var bindAll = restParam(function(object, methodNames) {
+ methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
+
+ var index = -1,
+ length = methodNames.length;
+
+ while (++index < length) {
+ var key = methodNames[index];
+ object[key] = createWrapper(object[key], BIND_FLAG, object);
+ }
+ return object;
+ });
return bindAll;
});
diff --git a/function/bindKey.js b/function/bindKey.js
index a2cb4581d..d87912df7 100644
--- a/function/bindKey.js
+++ b/function/bindKey.js
@@ -1,4 +1,4 @@
-define(['../internal/baseSlice', '../internal/createWrapper', '../internal/replaceHolders'], function(baseSlice, createWrapper, replaceHolders) {
+define(['../internal/createWrapper', '../internal/replaceHolders', './restParam'], function(createWrapper, replaceHolders, restParam) {
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -22,7 +22,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* @category Function
* @param {Object} object The object the method belongs to.
* @param {string} key The key of the method.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
@@ -49,16 +49,14 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* bound('hi');
* // => 'hiya fred!'
*/
- function bindKey(object, key) {
+ var bindKey = restParam(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
- if (arguments.length > 2) {
- var partials = baseSlice(arguments, 2),
- holders = replaceHolders(partials, bindKey.placeholder);
-
+ if (partials.length) {
+ var holders = replaceHolders(partials, bindKey.placeholder);
bitmask |= PARTIAL_FLAG;
}
return createWrapper(key, bitmask, object, partials, holders);
- }
+ });
// Assign default placeholders.
bindKey.placeholder = {};
diff --git a/function/curry.js b/function/curry.js
index f1ce35e1d..a74e28c8e 100644
--- a/function/curry.js
+++ b/function/curry.js
@@ -1,4 +1,4 @@
-define(['../internal/createWrapper', '../internal/isIterateeCall'], function(createWrapper, isIterateeCall) {
+define(['../internal/createCurry'], function(createCurry) {
/** Used to compose bitmasks for wrapper metadata. */
var CURRY_FLAG = 8;
@@ -43,14 +43,7 @@ define(['../internal/createWrapper', '../internal/isIterateeCall'], function(cre
* curried(1)(_, 3)(2);
* // => [1, 2, 3]
*/
- function curry(func, arity, guard) {
- if (guard && isIterateeCall(func, arity, guard)) {
- arity = null;
- }
- var result = createWrapper(func, CURRY_FLAG, null, null, null, null, null, arity);
- result.placeholder = curry.placeholder;
- return result;
- }
+ var curry = createCurry(CURRY_FLAG);
// Assign default placeholders.
curry.placeholder = {};
diff --git a/function/curryRight.js b/function/curryRight.js
index 52fedcf54..2cbc9c559 100644
--- a/function/curryRight.js
+++ b/function/curryRight.js
@@ -1,4 +1,4 @@
-define(['../internal/createWrapper', '../internal/isIterateeCall'], function(createWrapper, isIterateeCall) {
+define(['../internal/createCurry'], function(createCurry) {
/** Used to compose bitmasks for wrapper metadata. */
var CURRY_RIGHT_FLAG = 16;
@@ -40,14 +40,7 @@ define(['../internal/createWrapper', '../internal/isIterateeCall'], function(cre
* curried(3)(1, _)(2);
* // => [1, 2, 3]
*/
- function curryRight(func, arity, guard) {
- if (guard && isIterateeCall(func, arity, guard)) {
- arity = null;
- }
- var result = createWrapper(func, CURRY_RIGHT_FLAG, null, null, null, null, null, arity);
- result.placeholder = curryRight.placeholder;
- return result;
- }
+ var curryRight = createCurry(CURRY_RIGHT_FLAG);
// Assign default placeholders.
curryRight.placeholder = {};
diff --git a/function/defer.js b/function/defer.js
index 281ccaf49..e67b8ee89 100644
--- a/function/defer.js
+++ b/function/defer.js
@@ -1,4 +1,4 @@
-define(['../internal/baseDelay'], function(baseDelay) {
+define(['../internal/baseDelay', './restParam'], function(baseDelay, restParam) {
/**
* Defers invoking the `func` until the current call stack has cleared. Any
@@ -17,9 +17,9 @@ define(['../internal/baseDelay'], function(baseDelay) {
* }, 'deferred');
* // logs 'deferred' after one or more milliseconds
*/
- function defer(func) {
- return baseDelay(func, 1, arguments, 1);
- }
+ var defer = restParam(function(func, args) {
+ return baseDelay(func, 1, args);
+ });
return defer;
});
diff --git a/function/delay.js b/function/delay.js
index e7431ed10..2969e4ac0 100644
--- a/function/delay.js
+++ b/function/delay.js
@@ -1,4 +1,4 @@
-define(['../internal/baseDelay'], function(baseDelay) {
+define(['../internal/baseDelay', './restParam'], function(baseDelay, restParam) {
/**
* Invokes `func` after `wait` milliseconds. Any additional arguments are
@@ -18,9 +18,9 @@ define(['../internal/baseDelay'], function(baseDelay) {
* }, 1000, 'later');
* // => logs 'later' after one second
*/
- function delay(func, wait) {
- return baseDelay(func, wait, arguments, 2);
- }
+ var delay = restParam(function(func, wait, args) {
+ return baseDelay(func, wait, args);
+ });
return delay;
});
diff --git a/function/flow.js b/function/flow.js
index 03a3ccb18..8ad1fcbfd 100644
--- a/function/flow.js
+++ b/function/flow.js
@@ -1,4 +1,4 @@
-define(['../internal/createComposer'], function(createComposer) {
+define(['../internal/createFlow'], function(createFlow) {
/**
* Creates a function that returns the result of invoking the provided
@@ -20,7 +20,7 @@ define(['../internal/createComposer'], function(createComposer) {
* addSquare(1, 2);
* // => 9
*/
- var flow = createComposer();
+ var flow = createFlow();
return flow;
});
diff --git a/function/flowRight.js b/function/flowRight.js
index 12048e817..b9a66ca3f 100644
--- a/function/flowRight.js
+++ b/function/flowRight.js
@@ -1,4 +1,4 @@
-define(['../internal/createComposer'], function(createComposer) {
+define(['../internal/createFlow'], function(createFlow) {
/**
* This method is like `_.flow` except that it creates a function that
@@ -20,7 +20,7 @@ define(['../internal/createComposer'], function(createComposer) {
* addSquare(1, 2);
* // => 9
*/
- var flowRight = createComposer(true);
+ var flowRight = createFlow(true);
return flowRight;
});
diff --git a/function/memoize.js b/function/memoize.js
index 1d082b89e..c839d552c 100644
--- a/function/memoize.js
+++ b/function/memoize.js
@@ -13,10 +13,8 @@ define(['../internal/MapCache'], function(MapCache) {
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the ES `Map` method interface
- * of `get`, `has`, and `set`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)
- * for more details.
+ * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)
+ * method interface of `get`, `has`, and `set`.
*
* @static
* @memberOf _
diff --git a/function/once.js b/function/once.js
index a03252262..5993ff479 100644
--- a/function/once.js
+++ b/function/once.js
@@ -3,7 +3,7 @@ define(['./before'], function(before) {
/**
* Creates a function that is restricted to invoking `func` once. Repeat calls
* to the function return the value of the first call. The `func` is invoked
- * with the `this` binding of the created function.
+ * with the `this` binding and arguments of the created function.
*
* @static
* @memberOf _
diff --git a/function/partial.js b/function/partial.js
index 57624932b..96055c474 100644
--- a/function/partial.js
+++ b/function/partial.js
@@ -1,4 +1,4 @@
-define(['../internal/baseSlice', '../internal/createWrapper', '../internal/replaceHolders'], function(baseSlice, createWrapper, replaceHolders) {
+define(['../internal/createPartial'], function(createPartial) {
/** Used to compose bitmasks for wrapper metadata. */
var PARTIAL_FLAG = 32;
@@ -18,7 +18,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* @memberOf _
* @category Function
* @param {Function} func The function to partially apply arguments to.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
@@ -35,12 +35,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* greetFred('hi');
* // => 'hi fred'
*/
- function partial(func) {
- var partials = baseSlice(arguments, 1),
- holders = replaceHolders(partials, partial.placeholder);
-
- return createWrapper(func, PARTIAL_FLAG, null, partials, holders);
- }
+ var partial = createPartial(PARTIAL_FLAG);
// Assign default placeholders.
partial.placeholder = {};
diff --git a/function/partialRight.js b/function/partialRight.js
index 7fc345a2a..a3ffeae4c 100644
--- a/function/partialRight.js
+++ b/function/partialRight.js
@@ -1,4 +1,4 @@
-define(['../internal/baseSlice', '../internal/createWrapper', '../internal/replaceHolders'], function(baseSlice, createWrapper, replaceHolders) {
+define(['../internal/createPartial'], function(createPartial) {
/** Used to compose bitmasks for wrapper metadata. */
var PARTIAL_RIGHT_FLAG = 64;
@@ -17,7 +17,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* @memberOf _
* @category Function
* @param {Function} func The function to partially apply arguments to.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
@@ -34,12 +34,7 @@ define(['../internal/baseSlice', '../internal/createWrapper', '../internal/repla
* sayHelloTo('fred');
* // => 'hello fred'
*/
- function partialRight(func) {
- var partials = baseSlice(arguments, 1),
- holders = replaceHolders(partials, partialRight.placeholder);
-
- return createWrapper(func, PARTIAL_RIGHT_FLAG, null, partials, holders);
- }
+ var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
// Assign default placeholders.
partialRight.placeholder = {};
diff --git a/function/rearg.js b/function/rearg.js
index 630fb2c00..e41eee197 100644
--- a/function/rearg.js
+++ b/function/rearg.js
@@ -1,7 +1,7 @@
-define(['../internal/baseFlatten', '../internal/createWrapper'], function(baseFlatten, createWrapper) {
+define(['../internal/baseFlatten', '../internal/createWrapper', './restParam'], function(baseFlatten, createWrapper, restParam) {
/** Used to compose bitmasks for wrapper metadata. */
- var REARG_FLAG = 128;
+ var REARG_FLAG = 256;
/**
* Creates a function that invokes `func` with arguments arranged according
@@ -31,10 +31,9 @@ define(['../internal/baseFlatten', '../internal/createWrapper'], function(baseFl
* }, [1, 2, 3]);
* // => [3, 6, 9]
*/
- function rearg(func) {
- var indexes = baseFlatten(arguments, false, false, 1);
- return createWrapper(func, REARG_FLAG, null, null, null, indexes);
- }
+ var rearg = restParam(function(func, indexes) {
+ return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes));
+ });
return rearg;
});
diff --git a/function/restParam.js b/function/restParam.js
new file mode 100644
index 000000000..55b6b345b
--- /dev/null
+++ b/function/restParam.js
@@ -0,0 +1,61 @@
+define([], function() {
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Native method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as an array.
+ *
+ * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.restParam(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
+ function restParam(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ rest = Array(length);
+
+ while (++index < length) {
+ rest[index] = args[start + index];
+ }
+ switch (start) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, args[0], rest);
+ case 2: return func.call(this, args[0], args[1], rest);
+ }
+ var otherArgs = Array(start + 1);
+ index = -1;
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = rest;
+ return func.apply(this, otherArgs);
+ };
+ }
+
+ return restParam;
+});
diff --git a/function/spread.js b/function/spread.js
index 544896b3f..8f370c5e0 100644
--- a/function/spread.js
+++ b/function/spread.js
@@ -4,23 +4,24 @@ define([], function() {
var FUNC_ERROR_TEXT = 'Expected a function';
/**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and the array of arguments provided to the created
- * function much like [Function#apply](http://es5.github.io/#x15.3.4.3).
+ * Creates a function that invokes `func` with the `this` binding of the created
+ * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
+ *
+ * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to spread arguments over.
- * @returns {*} Returns the new function.
+ * @returns {Function} Returns the new function.
* @example
*
- * var spread = _.spread(function(who, what) {
+ * var say = _.spread(function(who, what) {
* return who + ' says ' + what;
* });
*
- * spread(['Fred', 'hello']);
- * // => 'Fred says hello'
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
*
* // with a Promise
* var numbers = Promise.all([
diff --git a/internal/arrayEach.js b/internal/arrayEach.js
index c52ed0956..b5653b5de 100644
--- a/internal/arrayEach.js
+++ b/internal/arrayEach.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.forEach` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayEachRight.js b/internal/arrayEachRight.js
index c93ba640d..81818a671 100644
--- a/internal/arrayEachRight.js
+++ b/internal/arrayEachRight.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.forEachRight` for arrays without support for
- * callback shorthands or `this` binding.
+ * callback shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayEvery.js b/internal/arrayEvery.js
index fc262a60e..3a3375273 100644
--- a/internal/arrayEvery.js
+++ b/internal/arrayEvery.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.every` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayFilter.js b/internal/arrayFilter.js
index 9b4dae8e0..82484f020 100644
--- a/internal/arrayFilter.js
+++ b/internal/arrayFilter.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.filter` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayMap.js b/internal/arrayMap.js
index 4e56197fb..d9f287fa0 100644
--- a/internal/arrayMap.js
+++ b/internal/arrayMap.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.map` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayReduce.js b/internal/arrayReduce.js
index e27c057c5..52b03c1f6 100644
--- a/internal/arrayReduce.js
+++ b/internal/arrayReduce.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.reduce` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arrayReduceRight.js b/internal/arrayReduceRight.js
index 04acc6242..fe9edbf64 100644
--- a/internal/arrayReduceRight.js
+++ b/internal/arrayReduceRight.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.reduceRight` for arrays without support for
- * callback shorthands or `this` binding.
+ * callback shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arraySome.js b/internal/arraySome.js
index cfde62c64..a5f00f0cc 100644
--- a/internal/arraySome.js
+++ b/internal/arraySome.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* A specialized version of `_.some` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
diff --git a/internal/arraySum.js b/internal/arraySum.js
new file mode 100644
index 000000000..9c5ac0baa
--- /dev/null
+++ b/internal/arraySum.js
@@ -0,0 +1,21 @@
+define([], function() {
+
+ /**
+ * A specialized version of `_.sum` for arrays without support for iteratees.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @returns {number} Returns the sum.
+ */
+ function arraySum(array) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ result += +array[length] || 0;
+ }
+ return result;
+ }
+
+ return arraySum;
+});
diff --git a/internal/baseBindAll.js b/internal/baseBindAll.js
deleted file mode 100644
index 3768f00ee..000000000
--- a/internal/baseBindAll.js
+++ /dev/null
@@ -1,27 +0,0 @@
-define(['./createWrapper'], function(createWrapper) {
-
- /** Used to compose bitmasks for wrapper metadata. */
- var BIND_FLAG = 1;
-
- /**
- * The base implementation of `_.bindAll` without support for individual
- * method name arguments.
- *
- * @private
- * @param {Object} object The object to bind and assign the bound methods to.
- * @param {string[]} methodNames The object method names to bind.
- * @returns {Object} Returns `object`.
- */
- function baseBindAll(object, methodNames) {
- var index = -1,
- length = methodNames.length;
-
- while (++index < length) {
- var key = methodNames[index];
- object[key] = createWrapper(object[key], BIND_FLAG, object);
- }
- return object;
- }
-
- return baseBindAll;
-});
diff --git a/internal/baseCallback.js b/internal/baseCallback.js
index 4d177792d..588c7589a 100644
--- a/internal/baseCallback.js
+++ b/internal/baseCallback.js
@@ -1,4 +1,4 @@
-define(['./baseMatches', './baseMatchesProperty', './baseProperty', './bindCallback', '../utility/identity', './isBindable'], function(baseMatches, baseMatchesProperty, baseProperty, bindCallback, identity, isBindable) {
+define(['./baseMatches', './baseMatchesProperty', './baseProperty', './bindCallback', '../utility/identity'], function(baseMatches, baseMatchesProperty, baseProperty, bindCallback, identity) {
/**
* The base implementation of `_.callback` which supports specifying the
@@ -13,9 +13,9 @@ define(['./baseMatches', './baseMatchesProperty', './baseProperty', './bindCallb
function baseCallback(func, thisArg, argCount) {
var type = typeof func;
if (type == 'function') {
- return (typeof thisArg != 'undefined' && isBindable(func))
- ? bindCallback(func, thisArg, argCount)
- : func;
+ return typeof thisArg == 'undefined'
+ ? func
+ : bindCallback(func, thisArg, argCount);
}
if (func == null) {
return identity;
diff --git a/internal/baseClone.js b/internal/baseClone.js
index 82e11bc50..5b614d548 100644
--- a/internal/baseClone.js
+++ b/internal/baseClone.js
@@ -45,9 +45,8 @@ define(['./arrayCopy', './arrayEach', './baseCopy', './baseForOwn', './initClone
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
diff --git a/internal/baseDelay.js b/internal/baseDelay.js
index c6f0eba47..38cc9b9cf 100644
--- a/internal/baseDelay.js
+++ b/internal/baseDelay.js
@@ -1,4 +1,4 @@
-define(['./baseSlice'], function(baseSlice) {
+define([], function() {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -13,14 +13,14 @@ define(['./baseSlice'], function(baseSlice) {
* @private
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The `arguments` object to slice and provide to `func`.
+ * @param {Object} args The arguments provide to `func`.
* @returns {number} Returns the timer id.
*/
- function baseDelay(func, wait, args, fromIndex) {
+ function baseDelay(func, wait, args) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
- return setTimeout(function() { func.apply(undefined, baseSlice(args, fromIndex)); }, wait);
+ return setTimeout(function() { func.apply(undefined, args); }, wait);
}
return baseDelay;
diff --git a/internal/baseEach.js b/internal/baseEach.js
index b55924431..555261b18 100644
--- a/internal/baseEach.js
+++ b/internal/baseEach.js
@@ -1,4 +1,4 @@
-define(['./baseForOwn', './isLength', './toObject'], function(baseForOwn, isLength, toObject) {
+define(['./baseForOwn', './createBaseEach'], function(baseForOwn, createBaseEach) {
/**
* The base implementation of `_.forEach` without support for callback
@@ -9,21 +9,7 @@ define(['./baseForOwn', './isLength', './toObject'], function(baseForOwn, isLeng
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object|string} Returns `collection`.
*/
- function baseEach(collection, iteratee) {
- var length = collection ? collection.length : 0;
- if (!isLength(length)) {
- return baseForOwn(collection, iteratee);
- }
- var index = -1,
- iterable = toObject(collection);
-
- while (++index < length) {
- if (iteratee(iterable[index], index, iterable) === false) {
- break;
- }
- }
- return collection;
- }
+ var baseEach = createBaseEach(baseForOwn);
return baseEach;
});
diff --git a/internal/baseEachRight.js b/internal/baseEachRight.js
index 704f0d665..8114fbe02 100644
--- a/internal/baseEachRight.js
+++ b/internal/baseEachRight.js
@@ -1,4 +1,4 @@
-define(['./baseForOwnRight', './isLength', './toObject'], function(baseForOwnRight, isLength, toObject) {
+define(['./baseForOwnRight', './createBaseEach'], function(baseForOwnRight, createBaseEach) {
/**
* The base implementation of `_.forEachRight` without support for callback
@@ -9,19 +9,7 @@ define(['./baseForOwnRight', './isLength', './toObject'], function(baseForOwnRig
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object|string} Returns `collection`.
*/
- function baseEachRight(collection, iteratee) {
- var length = collection ? collection.length : 0;
- if (!isLength(length)) {
- return baseForOwnRight(collection, iteratee);
- }
- var iterable = toObject(collection);
- while (length--) {
- if (iteratee(iterable[length], length, iterable) === false) {
- break;
- }
- }
- return collection;
- }
+ var baseEachRight = createBaseEach(baseForOwnRight, true);
return baseEachRight;
});
diff --git a/internal/baseEvery.js b/internal/baseEvery.js
index b4d88b713..cece23d1d 100644
--- a/internal/baseEvery.js
+++ b/internal/baseEvery.js
@@ -2,7 +2,7 @@ define(['./baseEach'], function(baseEach) {
/**
* The base implementation of `_.every` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
diff --git a/internal/baseFilter.js b/internal/baseFilter.js
index 398dd5d22..4da845478 100644
--- a/internal/baseFilter.js
+++ b/internal/baseFilter.js
@@ -2,7 +2,7 @@ define(['./baseEach'], function(baseEach) {
/**
* The base implementation of `_.filter` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
diff --git a/internal/baseFindIndex.js b/internal/baseFindIndex.js
new file mode 100644
index 000000000..5a6dd094b
--- /dev/null
+++ b/internal/baseFindIndex.js
@@ -0,0 +1,26 @@
+define([], function() {
+
+ /**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseFindIndex(array, predicate, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (predicate(array[index], index, array)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ return baseFindIndex;
+});
diff --git a/internal/baseFlatten.js b/internal/baseFlatten.js
index 7b7c49dbf..6e57dcb14 100644
--- a/internal/baseFlatten.js
+++ b/internal/baseFlatten.js
@@ -8,11 +8,10 @@ define(['../lang/isArguments', '../lang/isArray', './isLength', './isObjectLike'
* @param {Array} array The array to flatten.
* @param {boolean} isDeep Specify a deep flatten.
* @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
- * @param {number} fromIndex The index to start from.
* @returns {Array} Returns the new flattened array.
*/
- function baseFlatten(array, isDeep, isStrict, fromIndex) {
- var index = fromIndex - 1,
+ function baseFlatten(array, isDeep, isStrict) {
+ var index = -1,
length = array.length,
resIndex = -1,
result = [];
@@ -23,7 +22,7 @@ define(['../lang/isArguments', '../lang/isArray', './isLength', './isObjectLike'
if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
if (isDeep) {
// Recursively flatten arrays (susceptible to call stack limits).
- value = baseFlatten(value, isDeep, isStrict, 0);
+ value = baseFlatten(value, isDeep, isStrict);
}
var valIndex = -1,
valLength = value.length;
diff --git a/internal/baseFor.js b/internal/baseFor.js
index a8827fdae..88f12fdfd 100644
--- a/internal/baseFor.js
+++ b/internal/baseFor.js
@@ -1,4 +1,4 @@
-define(['./toObject'], function(toObject) {
+define(['./createBaseFor'], function(createBaseFor) {
/**
* The base implementation of `baseForIn` and `baseForOwn` which iterates
@@ -12,20 +12,7 @@ define(['./toObject'], function(toObject) {
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
- function baseFor(object, iteratee, keysFunc) {
- var index = -1,
- iterable = toObject(object),
- props = keysFunc(object),
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
- }
- }
- return object;
- }
+ var baseFor = createBaseFor();
return baseFor;
});
diff --git a/internal/baseForRight.js b/internal/baseForRight.js
index fe345f582..9f4d51bdd 100644
--- a/internal/baseForRight.js
+++ b/internal/baseForRight.js
@@ -1,4 +1,4 @@
-define(['./toObject'], function(toObject) {
+define(['./createBaseFor'], function(createBaseFor) {
/**
* This function is like `baseFor` except that it iterates over properties
@@ -10,19 +10,7 @@ define(['./toObject'], function(toObject) {
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
- function baseForRight(object, iteratee, keysFunc) {
- var iterable = toObject(object),
- props = keysFunc(object),
- length = props.length;
-
- while (length--) {
- var key = props[length];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
- }
- }
- return object;
- }
+ var baseForRight = createBaseFor(true);
return baseForRight;
});
diff --git a/internal/baseInvoke.js b/internal/baseInvoke.js
deleted file mode 100644
index 4934559f1..000000000
--- a/internal/baseInvoke.js
+++ /dev/null
@@ -1,31 +0,0 @@
-define(['./baseEach', './isLength'], function(baseEach, isLength) {
-
- /** Used as a safe reference for `undefined` in pre-ES5 environments. */
- var undefined;
-
- /**
- * The base implementation of `_.invoke` which requires additional arguments
- * to be provided as an array of arguments rather than individually.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|string} methodName The name of the method to invoke or
- * the function invoked per iteration.
- * @param {Array} [args] The arguments to invoke the method with.
- * @returns {Array} Returns the array of results.
- */
- function baseInvoke(collection, methodName, args) {
- var index = -1,
- isFunc = typeof methodName == 'function',
- length = collection ? collection.length : 0,
- result = isLength(length) ? Array(length) : [];
-
- baseEach(collection, function(value) {
- var func = isFunc ? methodName : (value != null && value[methodName]);
- result[++index] = func ? func.apply(value, args) : undefined;
- });
- return result;
- }
-
- return baseInvoke;
-});
diff --git a/internal/baseIsEqual.js b/internal/baseIsEqual.js
index 6d3fdc96f..67c930cf4 100644
--- a/internal/baseIsEqual.js
+++ b/internal/baseIsEqual.js
@@ -8,12 +8,12 @@ define(['./baseIsEqualDeep'], function(baseIsEqualDeep) {
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
- function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) {
+ function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
// Exit early for identical values.
if (value === other) {
// Treat `+0` vs. `-0` as not equal.
@@ -28,7 +28,7 @@ define(['./baseIsEqualDeep'], function(baseIsEqualDeep) {
// Return `false` unless both values are `NaN`.
return value !== value && other !== other;
}
- return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB);
+ return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
}
return baseIsEqual;
diff --git a/internal/baseIsEqualDeep.js b/internal/baseIsEqualDeep.js
index dfd59deba..6a7dddce2 100644
--- a/internal/baseIsEqualDeep.js
+++ b/internal/baseIsEqualDeep.js
@@ -3,6 +3,7 @@ define(['./equalArrays', './equalByTag', './equalObjects', '../lang/isArray', '.
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
+ funcTag = '[object Function]',
objectTag = '[object Object]';
/** Used for native method references. */
@@ -12,9 +13,8 @@ define(['./equalArrays', './equalByTag', './equalObjects', '../lang/isArray', '.
var hasOwnProperty = objectProto.hasOwnProperty;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -28,12 +28,12 @@ define(['./equalArrays', './equalByTag', './equalObjects', '../lang/isArray', '.
* @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} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA=[]] Tracks traversed `value` objects.
* @param {Array} [stackB=[]] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
- function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
var objIsArr = isArray(object),
othIsArr = isArray(other),
objTag = arrayTag,
@@ -55,21 +55,27 @@ define(['./equalArrays', './equalByTag', './equalObjects', '../lang/isArray', '.
othIsArr = isTypedArray(other);
}
}
- var objIsObj = objTag == objectTag,
- othIsObj = othTag == objectTag,
+ var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)),
+ othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)),
isSameTag = objTag == othTag;
if (isSameTag && !(objIsArr || objIsObj)) {
return equalByTag(object, other, objTag);
}
- var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
- othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+ if (isLoose) {
+ if (!isSameTag && !(objIsObj && othIsObj)) {
+ return false;
+ }
+ } else {
+ var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
- if (valWrapped || othWrapped) {
- return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB);
- }
- if (!isSameTag) {
- return false;
+ if (valWrapped || othWrapped) {
+ return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
+ }
+ if (!isSameTag) {
+ return false;
+ }
}
// Assume cyclic values are equal.
// For more information on detecting circular references see https://es5.github.io/#JO.
@@ -86,7 +92,7 @@ define(['./equalArrays', './equalByTag', './equalObjects', '../lang/isArray', '.
stackA.push(object);
stackB.push(other);
- var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB);
+ var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
stackA.pop();
stackB.pop();
diff --git a/internal/baseIsMatch.js b/internal/baseIsMatch.js
index 14bdf77d6..a73230b81 100644
--- a/internal/baseIsMatch.js
+++ b/internal/baseIsMatch.js
@@ -3,15 +3,9 @@ define(['./baseIsEqual'], function(baseIsEqual) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
- /** Used for native method references. */
- var objectProto = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
-
/**
* The base implementation of `_.isMatch` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Object} object The object to inspect.
@@ -22,30 +16,27 @@ define(['./baseIsEqual'], function(baseIsEqual) {
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
- var length = props.length;
- if (object == null) {
- return !length;
- }
var index = -1,
+ length = props.length,
noCustomizer = !customizer;
while (++index < length) {
if ((noCustomizer && strictCompareFlags[index])
? values[index] !== object[props[index]]
- : !hasOwnProperty.call(object, props[index])
+ : !(props[index] in object)
) {
return false;
}
}
index = -1;
while (++index < length) {
- var key = props[index];
- if (noCustomizer && strictCompareFlags[index]) {
- var result = hasOwnProperty.call(object, key);
- } else {
- var objValue = object[key],
- srcValue = values[index];
+ var key = props[index],
+ objValue = object[key],
+ srcValue = values[index];
+ if (noCustomizer && strictCompareFlags[index]) {
+ var result = typeof objValue != 'undefined' || (key in object);
+ } else {
result = customizer ? customizer(objValue, srcValue, key) : undefined;
if (typeof result == 'undefined') {
result = baseIsEqual(srcValue, objValue, customizer, true);
diff --git a/internal/baseMap.js b/internal/baseMap.js
index a19f604b4..71ece467f 100644
--- a/internal/baseMap.js
+++ b/internal/baseMap.js
@@ -2,7 +2,7 @@ define(['./baseEach'], function(baseEach) {
/**
* The base implementation of `_.map` without support for callback shorthands
- * or `this` binding.
+ * and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
diff --git a/internal/baseMatches.js b/internal/baseMatches.js
index eb81a093f..257357230 100644
--- a/internal/baseMatches.js
+++ b/internal/baseMatches.js
@@ -1,10 +1,4 @@
-define(['./baseIsMatch', './isStrictComparable', '../object/keys'], function(baseIsMatch, isStrictComparable, keys) {
-
- /** Used for native method references. */
- var objectProto = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
+define(['./baseIsMatch', '../utility/constant', './isStrictComparable', '../object/keys', './toObject'], function(baseIsMatch, constant, isStrictComparable, keys, toObject) {
/**
* The base implementation of `_.matches` which does not clone `source`.
@@ -17,13 +11,17 @@ define(['./baseIsMatch', './isStrictComparable', '../object/keys'], function(bas
var props = keys(source),
length = props.length;
+ if (!length) {
+ return constant(true);
+ }
if (length == 1) {
var key = props[0],
value = source[key];
if (isStrictComparable(value)) {
return function(object) {
- return object != null && object[key] === value && hasOwnProperty.call(object, key);
+ return object != null && object[key] === value &&
+ (typeof value != 'undefined' || (key in toObject(object)));
};
}
}
@@ -36,7 +34,7 @@ define(['./baseIsMatch', './isStrictComparable', '../object/keys'], function(bas
strictCompareFlags[length] = isStrictComparable(value);
}
return function(object) {
- return baseIsMatch(object, props, values, strictCompareFlags);
+ return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);
};
}
diff --git a/internal/baseMatchesProperty.js b/internal/baseMatchesProperty.js
index 0d590f87d..930f56477 100644
--- a/internal/baseMatchesProperty.js
+++ b/internal/baseMatchesProperty.js
@@ -1,4 +1,4 @@
-define(['./baseIsEqual', './isStrictComparable'], function(baseIsEqual, isStrictComparable) {
+define(['./baseIsEqual', './isStrictComparable', './toObject'], function(baseIsEqual, isStrictComparable, toObject) {
/**
* The base implementation of `_.matchesProperty` which does not coerce `key`
@@ -12,7 +12,8 @@ define(['./baseIsEqual', './isStrictComparable'], function(baseIsEqual, isStrict
function baseMatchesProperty(key, value) {
if (isStrictComparable(value)) {
return function(object) {
- return object != null && object[key] === value;
+ return object != null && object[key] === value &&
+ (typeof value != 'undefined' || (key in toObject(object)));
};
}
return function(object) {
diff --git a/internal/baseMergeDeep.js b/internal/baseMergeDeep.js
index 64c2b26e8..787cfe343 100644
--- a/internal/baseMergeDeep.js
+++ b/internal/baseMergeDeep.js
@@ -37,7 +37,7 @@ define(['./arrayCopy', '../lang/isArguments', '../lang/isArray', './isLength', '
if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
result = isArray(value)
? value
- : (value ? arrayCopy(value) : []);
+ : ((value && value.length) ? arrayCopy(value) : []);
}
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
result = isArguments(value)
diff --git a/internal/basePullAt.js b/internal/basePullAt.js
deleted file mode 100644
index 9b97aed16..000000000
--- a/internal/basePullAt.js
+++ /dev/null
@@ -1,34 +0,0 @@
-define(['./baseAt', './baseCompareAscending', './isIndex'], function(baseAt, baseCompareAscending, isIndex) {
-
- /** Used for native method references. */
- var arrayProto = Array.prototype;
-
- /** Native method references. */
- var splice = arrayProto.splice;
-
- /**
- * The base implementation of `_.pullAt` without support for individual
- * index arguments.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {number[]} indexes The indexes of elements to remove.
- * @returns {Array} Returns the new array of removed elements.
- */
- function basePullAt(array, indexes) {
- var length = indexes.length,
- result = baseAt(array, indexes);
-
- indexes.sort(baseCompareAscending);
- while (length--) {
- var index = parseFloat(indexes[length]);
- if (index != previous && isIndex(index)) {
- var previous = index;
- splice.call(array, index, 1);
- }
- }
- return result;
- }
-
- return basePullAt;
-});
diff --git a/internal/baseReduce.js b/internal/baseReduce.js
index a93804be5..e832d6382 100644
--- a/internal/baseReduce.js
+++ b/internal/baseReduce.js
@@ -2,7 +2,7 @@ define([], function() {
/**
* The base implementation of `_.reduce` and `_.reduceRight` without support
- * for callback shorthands or `this` binding, which iterates over `collection`
+ * for callback shorthands and `this` binding, which iterates over `collection`
* using the provided `eachFunc`.
*
* @private
diff --git a/internal/baseSome.js b/internal/baseSome.js
index bde43fcfd..f73c3278e 100644
--- a/internal/baseSome.js
+++ b/internal/baseSome.js
@@ -2,7 +2,7 @@ define(['./baseEach'], function(baseEach) {
/**
* The base implementation of `_.some` without support for callback shorthands
- * or `this` binding.
+ * and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
diff --git a/internal/baseSum.js b/internal/baseSum.js
new file mode 100644
index 000000000..e269c4cd9
--- /dev/null
+++ b/internal/baseSum.js
@@ -0,0 +1,21 @@
+define(['./baseEach'], function(baseEach) {
+
+ /**
+ * The base implementation of `_.sum` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ function baseSum(collection, iteratee) {
+ var result = 0;
+ baseEach(collection, function(value, index, collection) {
+ result += +iteratee(value, index, collection) || 0;
+ });
+ return result;
+ }
+
+ return baseSum;
+});
diff --git a/internal/baseWhile.js b/internal/baseWhile.js
new file mode 100644
index 000000000..6d62ce2f2
--- /dev/null
+++ b/internal/baseWhile.js
@@ -0,0 +1,25 @@
+define(['./baseSlice'], function(baseSlice) {
+
+ /**
+ * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
+ * and `_.takeWhile` without support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseWhile(array, predicate, isDrop, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
+ return isDrop
+ ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
+ : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
+ }
+
+ return baseWhile;
+});
diff --git a/internal/baseWrapperValue.js b/internal/baseWrapperValue.js
index eb6076a2d..4937457f9 100644
--- a/internal/baseWrapperValue.js
+++ b/internal/baseWrapperValue.js
@@ -14,7 +14,7 @@ define(['./LazyWrapper'], function(LazyWrapper) {
* @private
* @param {*} value The unwrapped value.
* @param {Array} actions Actions to peform to resolve the unwrapped value.
- * @returns {*} Returns the resolved unwrapped value.
+ * @returns {*} Returns the resolved value.
*/
function baseWrapperValue(value, actions) {
var result = value;
diff --git a/internal/binaryIndex.js b/internal/binaryIndex.js
index e26340995..68ca3cc3d 100644
--- a/internal/binaryIndex.js
+++ b/internal/binaryIndex.js
@@ -11,8 +11,7 @@ define(['./binaryIndexBy', '../utility/identity'], function(binaryIndexBy, ident
* @private
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {boolean} [retHighest] Specify returning the highest, instead
- * of the lowest, index at which a value should be inserted into `array`.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
*/
diff --git a/internal/binaryIndexBy.js b/internal/binaryIndexBy.js
index 25fba62fc..eaa40d253 100644
--- a/internal/binaryIndexBy.js
+++ b/internal/binaryIndexBy.js
@@ -19,8 +19,7 @@ define([], function() {
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
* @param {Function} iteratee The function invoked per iteration.
- * @param {boolean} [retHighest] Specify returning the highest, instead
- * of the lowest, index at which a value should be inserted into `array`.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
*/
diff --git a/internal/createAggregator.js b/internal/createAggregator.js
index 5014fe1bf..401e110d7 100644
--- a/internal/createAggregator.js
+++ b/internal/createAggregator.js
@@ -5,6 +5,9 @@ define(['./baseCallback', './baseEach', '../lang/isArray'], function(baseCallbac
* object composed from the results of running each element in the collection
* through an iteratee.
*
+ * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,
+ * and `_.partition`.
+ *
* @private
* @param {Function} setter The function to set keys and values of the accumulator object.
* @param {Function} [initializer] The function to initialize the accumulator object.
diff --git a/internal/createAssigner.js b/internal/createAssigner.js
index 5978cb4ef..af13ef72e 100644
--- a/internal/createAssigner.js
+++ b/internal/createAssigner.js
@@ -4,6 +4,8 @@ define(['./bindCallback', './isIterateeCall'], function(bindCallback, isIteratee
* Creates a function that assigns properties of source object(s) to a given
* destination object.
*
+ * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.
+ *
* @private
* @param {Function} assigner The function to assign values.
* @returns {Function} Returns the new assigner function.
diff --git a/internal/createBaseEach.js b/internal/createBaseEach.js
new file mode 100644
index 000000000..90088e0b8
--- /dev/null
+++ b/internal/createBaseEach.js
@@ -0,0 +1,30 @@
+define(['./isLength', './toObject'], function(isLength, toObject) {
+
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee) {
+ var length = collection ? collection.length : 0;
+ if (!isLength(length)) {
+ return eachFunc(collection, iteratee);
+ }
+ var index = fromRight ? length : -1,
+ iterable = toObject(collection);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+ return collection;
+ };
+ }
+
+ return createBaseEach;
+});
diff --git a/internal/createBaseFor.js b/internal/createBaseFor.js
new file mode 100644
index 000000000..99f5f7076
--- /dev/null
+++ b/internal/createBaseFor.js
@@ -0,0 +1,28 @@
+define(['./toObject'], function(toObject) {
+
+ /**
+ * Creates a base function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseFor(fromRight) {
+ return function(object, iteratee, keysFunc) {
+ var iterable = toObject(object),
+ props = keysFunc(object),
+ length = props.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var key = props[index];
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+ return object;
+ };
+ }
+
+ return createBaseFor;
+});
diff --git a/internal/createComposer.js b/internal/createComposer.js
deleted file mode 100644
index 88371f1a8..000000000
--- a/internal/createComposer.js
+++ /dev/null
@@ -1,42 +0,0 @@
-define([], function() {
-
- /** Used as the `TypeError` message for "Functions" methods. */
- var FUNC_ERROR_TEXT = 'Expected a function';
-
- /**
- * Creates a function to compose other functions into a single function.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new composer function.
- */
- function createComposer(fromRight) {
- return function() {
- var length = arguments.length,
- index = length,
- fromIndex = fromRight ? (length - 1) : 0;
-
- if (!length) {
- return function() { return arguments[0]; };
- }
- var funcs = Array(length);
- while (index--) {
- funcs[index] = arguments[index];
- if (typeof funcs[index] != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- }
- return function() {
- var index = fromIndex,
- result = funcs[index].apply(this, arguments);
-
- while ((fromRight ? index-- : ++index < length)) {
- result = funcs[index].call(this, result);
- }
- return result;
- };
- };
- }
-
- return createComposer;
-});
diff --git a/internal/createCurry.js b/internal/createCurry.js
new file mode 100644
index 000000000..70d097e77
--- /dev/null
+++ b/internal/createCurry.js
@@ -0,0 +1,23 @@
+define(['./createWrapper', './isIterateeCall'], function(createWrapper, isIterateeCall) {
+
+ /**
+ * Creates a `_.curry` or `_.curryRight` function.
+ *
+ * @private
+ * @param {boolean} flag The curry bit flag.
+ * @returns {Function} Returns the new curry function.
+ */
+ function createCurry(flag) {
+ function curryFunc(func, arity, guard) {
+ if (guard && isIterateeCall(func, arity, guard)) {
+ arity = null;
+ }
+ var result = createWrapper(func, flag, null, null, null, null, null, arity);
+ result.placeholder = curryFunc.placeholder;
+ return result;
+ }
+ return curryFunc;
+ }
+
+ return createCurry;
+});
diff --git a/internal/createExtremum.js b/internal/createExtremum.js
index afbaced41..d391b94aa 100644
--- a/internal/createExtremum.js
+++ b/internal/createExtremum.js
@@ -1,7 +1,7 @@
define(['./baseCallback', './charAtCallback', './extremumBy', '../lang/isArray', './isIterateeCall', '../lang/isString', './toIterable'], function(baseCallback, charAtCallback, extremumBy, isArray, isIterateeCall, isString, toIterable) {
/**
- * Creates a function that gets the extremum value of a collection.
+ * Creates a `_.max` or `_.min` function.
*
* @private
* @param {Function} arrayFunc The function to get the extremum value from an array.
diff --git a/internal/createFind.js b/internal/createFind.js
new file mode 100644
index 000000000..770d4a3a1
--- /dev/null
+++ b/internal/createFind.js
@@ -0,0 +1,26 @@
+define(['./baseCallback', './baseFind', './baseFindIndex', '../lang/isArray'], function(baseCallback, baseFind, baseFindIndex, isArray) {
+
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+ var undefined;
+
+ /**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFind(eachFunc, fromRight) {
+ return function(collection, predicate, thisArg) {
+ predicate = baseCallback(predicate, thisArg, 3);
+ if (isArray(collection)) {
+ var index = baseFindIndex(collection, predicate, fromRight);
+ return index > -1 ? collection[index] : undefined;
+ }
+ return baseFind(collection, predicate, eachFunc);
+ }
+ }
+
+ return createFind;
+});
diff --git a/internal/createFindIndex.js b/internal/createFindIndex.js
new file mode 100644
index 000000000..d088bbfd2
--- /dev/null
+++ b/internal/createFindIndex.js
@@ -0,0 +1,21 @@
+define(['./baseCallback', './baseFindIndex'], function(baseCallback, baseFindIndex) {
+
+ /**
+ * Creates a `_.findIndex` or `_.findLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindIndex(fromRight) {
+ return function(array, predicate, thisArg) {
+ if (!(array && array.length)) {
+ return -1;
+ }
+ predicate = baseCallback(predicate, thisArg, 3);
+ return baseFindIndex(array, predicate, fromRight);
+ };
+ }
+
+ return createFindIndex;
+});
diff --git a/internal/createFindKey.js b/internal/createFindKey.js
new file mode 100644
index 000000000..27736a935
--- /dev/null
+++ b/internal/createFindKey.js
@@ -0,0 +1,18 @@
+define(['./baseCallback', './baseFind'], function(baseCallback, baseFind) {
+
+ /**
+ * Creates a `_.findKey` or `_.findLastKey` function.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindKey(objectFunc) {
+ return function(object, predicate, thisArg) {
+ predicate = baseCallback(predicate, thisArg, 3);
+ return baseFind(object, predicate, objectFunc, true);
+ };
+ }
+
+ return createFindKey;
+});
diff --git a/internal/createFlow.js b/internal/createFlow.js
new file mode 100644
index 000000000..70b2b46d1
--- /dev/null
+++ b/internal/createFlow.js
@@ -0,0 +1,61 @@
+define(['./LodashWrapper', './getData', './getFuncName', '../lang/isArray', './isLaziable'], function(LodashWrapper, getData, getFuncName, isArray, isLaziable) {
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */
+ function createFlow(fromRight) {
+ return function() {
+ var length = arguments.length;
+ if (!length) {
+ return function() { return arguments[0]; };
+ }
+ var wrapper,
+ index = fromRight ? length : -1,
+ leftIndex = 0,
+ funcs = Array(length);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var func = funcs[leftIndex++] = arguments[index];
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var funcName = wrapper ? '' : getFuncName(func);
+ wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;
+ }
+ index = wrapper ? -1 : length;
+ while (++index < length) {
+ func = funcs[index];
+ funcName = getFuncName(func);
+
+ var data = funcName == 'wrapper' ? getData(func) : null;
+ if (data && isLaziable(data[0])) {
+ wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
+ return function() {
+ var args = arguments;
+ if (wrapper && args.length == 1 && isArray(args[0])) {
+ return wrapper.plant(args[0]).value();
+ }
+ var index = 0,
+ result = funcs[index].apply(this, args);
+
+ while (++index < length) {
+ result = funcs[index].call(this, result);
+ }
+ return result;
+ };
+ };
+ }
+
+ return createFlow;
+});
diff --git a/internal/createForEach.js b/internal/createForEach.js
new file mode 100644
index 000000000..858c202f9
--- /dev/null
+++ b/internal/createForEach.js
@@ -0,0 +1,20 @@
+define(['./bindCallback', '../lang/isArray'], function(bindCallback, isArray) {
+
+ /**
+ * Creates a function for `_.forEach` or `_.forEachRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForEach(arrayFunc, eachFunc) {
+ return function(collection, iteratee, thisArg) {
+ return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
+ ? arrayFunc(collection, iteratee)
+ : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
+ };
+ }
+
+ return createForEach;
+});
diff --git a/internal/createForIn.js b/internal/createForIn.js
new file mode 100644
index 000000000..13e95471f
--- /dev/null
+++ b/internal/createForIn.js
@@ -0,0 +1,20 @@
+define(['./bindCallback', '../object/keysIn'], function(bindCallback, keysIn) {
+
+ /**
+ * Creates a function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForIn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee, keysIn);
+ };
+ }
+
+ return createForIn;
+});
diff --git a/internal/createForOwn.js b/internal/createForOwn.js
new file mode 100644
index 000000000..edbe3c9c4
--- /dev/null
+++ b/internal/createForOwn.js
@@ -0,0 +1,20 @@
+define(['./bindCallback'], function(bindCallback) {
+
+ /**
+ * Creates a function for `_.forOwn` or `_.forOwnRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForOwn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee);
+ };
+ }
+
+ return createForOwn;
+});
diff --git a/internal/createHybridWrapper.js b/internal/createHybridWrapper.js
index 0fd9d1b09..e9bcb437a 100644
--- a/internal/createHybridWrapper.js
+++ b/internal/createHybridWrapper.js
@@ -1,4 +1,7 @@
-define(['./arrayCopy', './composeArgs', './composeArgsRight', './createCtorWrapper', './reorder', './replaceHolders', './root'], function(arrayCopy, composeArgs, composeArgsRight, createCtorWrapper, reorder, replaceHolders, root) {
+define(['./arrayCopy', './composeArgs', './composeArgsRight', './createCtorWrapper', './isLaziable', './reorder', './replaceHolders', './root', './setData'], function(arrayCopy, composeArgs, composeArgsRight, createCtorWrapper, isLaziable, reorder, replaceHolders, root, setData) {
+
+ /** Used as a safe reference for `undefined` in pre-ES5 environments. */
+ var undefined;
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -8,7 +11,7 @@ define(['./arrayCopy', './composeArgs', './composeArgsRight', './createCtorWrapp
CURRY_RIGHT_FLAG = 16,
PARTIAL_FLAG = 32,
PARTIAL_RIGHT_FLAG = 64,
- ARY_FLAG = 256;
+ ARY_FLAG = 128;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
@@ -76,7 +79,12 @@ define(['./arrayCopy', './composeArgs', './composeArgsRight', './createCtorWrapp
if (!isCurryBound) {
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
}
- var result = createHybridWrapper(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity);
+ var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
+ result = createHybridWrapper.apply(undefined, newData);
+
+ if (isLaziable(func)) {
+ setData(result, newData);
+ }
result.placeholder = placeholder;
return result;
}
diff --git a/internal/createPadDir.js b/internal/createPadDir.js
new file mode 100644
index 000000000..2bcaecb2f
--- /dev/null
+++ b/internal/createPadDir.js
@@ -0,0 +1,18 @@
+define(['./baseToString', './createPadding'], function(baseToString, createPadding) {
+
+ /**
+ * Creates a function for `_.padLeft` or `_.padRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify padding from the right.
+ * @returns {Function} Returns the new pad function.
+ */
+ function createPadDir(fromRight) {
+ return function(string, length, chars) {
+ string = baseToString(string);
+ return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));
+ };
+ }
+
+ return createPadDir;
+});
diff --git a/internal/createPad.js b/internal/createPadding.js
similarity index 76%
rename from internal/createPad.js
rename to internal/createPadding.js
index 59299def4..4d0f12802 100644
--- a/internal/createPad.js
+++ b/internal/createPadding.js
@@ -7,9 +7,8 @@ define(['../string/repeat', './root'], function(repeat, root) {
var nativeIsFinite = root.isFinite;
/**
- * Creates the pad required for `string` based on the given padding length.
- * The `chars` string may be truncated if the number of padding characters
- * exceeds the padding length.
+ * Creates the padding required for `string` based on the given `length`.
+ * The `chars` string is truncated if the number of characters exceeds `length`.
*
* @private
* @param {string} string The string to create padding for.
@@ -17,7 +16,7 @@ define(['../string/repeat', './root'], function(repeat, root) {
* @param {string} [chars=' '] The string used as padding.
* @returns {string} Returns the pad for `string`.
*/
- function createPad(string, length, chars) {
+ function createPadding(string, length, chars) {
var strLength = string.length;
length = +length;
@@ -29,5 +28,5 @@ define(['../string/repeat', './root'], function(repeat, root) {
return repeat(chars, ceil(padLength / chars.length)).slice(0, padLength);
}
- return createPad;
+ return createPadding;
});
diff --git a/internal/createPartial.js b/internal/createPartial.js
new file mode 100644
index 000000000..05ee404e0
--- /dev/null
+++ b/internal/createPartial.js
@@ -0,0 +1,19 @@
+define(['./createWrapper', './replaceHolders', '../function/restParam'], function(createWrapper, replaceHolders, restParam) {
+
+ /**
+ * Creates a `_.partial` or `_.partialRight` function.
+ *
+ * @private
+ * @param {boolean} flag The partial bit flag.
+ * @returns {Function} Returns the new partial function.
+ */
+ function createPartial(flag) {
+ var partialFunc = restParam(function(func, partials) {
+ var holders = replaceHolders(partials, partialFunc.placeholder);
+ return createWrapper(func, flag, null, partials, holders);
+ });
+ return partialFunc;
+ }
+
+ return createPartial;
+});
diff --git a/internal/createReduce.js b/internal/createReduce.js
new file mode 100644
index 000000000..8dfab7024
--- /dev/null
+++ b/internal/createReduce.js
@@ -0,0 +1,21 @@
+define(['./baseCallback', './baseReduce', '../lang/isArray'], function(baseCallback, baseReduce, isArray) {
+
+ /**
+ * Creates a function for `_.reduce` or `_.reduceRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createReduce(arrayFunc, eachFunc) {
+ return function(collection, iteratee, accumulator, thisArg) {
+ var initFromArray = arguments.length < 3;
+ return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
+ ? arrayFunc(collection, iteratee, accumulator, initFromArray)
+ : baseReduce(collection, baseCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
+ };
+ }
+
+ return createReduce;
+});
diff --git a/internal/createSortedIndex.js b/internal/createSortedIndex.js
new file mode 100644
index 000000000..7c0f2035d
--- /dev/null
+++ b/internal/createSortedIndex.js
@@ -0,0 +1,19 @@
+define(['./baseCallback', './binaryIndex', './binaryIndexBy'], function(baseCallback, binaryIndex, binaryIndexBy) {
+
+ /**
+ * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {Function} Returns the new index function.
+ */
+ function createSortedIndex(retHighest) {
+ return function(array, value, iteratee, thisArg) {
+ return iteratee == null
+ ? binaryIndex(array, value, retHighest)
+ : binaryIndexBy(array, value, baseCallback(iteratee, thisArg, 1), retHighest);
+ };
+ }
+
+ return createSortedIndex;
+});
diff --git a/internal/createWrapper.js b/internal/createWrapper.js
index da485c3d9..4c2d0ea98 100644
--- a/internal/createWrapper.js
+++ b/internal/createWrapper.js
@@ -57,10 +57,10 @@ define(['./baseSetData', './createBindWrapper', './createHybridWrapper', './crea
partials = holders = null;
}
- var data = !isBindKey && getData(func),
+ var data = isBindKey ? null : getData(func),
newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
- if (data && data !== true) {
+ if (data) {
mergeData(newData, data);
bitmask = newData[1];
arity = newData[9];
diff --git a/internal/equalArrays.js b/internal/equalArrays.js
index a1a0d7c97..b963da61e 100644
--- a/internal/equalArrays.js
+++ b/internal/equalArrays.js
@@ -12,18 +12,18 @@ define([], function() {
* @param {Array} other The other array to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} [customizer] The function to customize comparing arrays.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
- function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
var index = -1,
arrLength = array.length,
othLength = other.length,
result = true;
- if (arrLength != othLength && !(isWhere && othLength > arrLength)) {
+ if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
return false;
}
// Deep compare the contents, ignoring non-numeric properties.
@@ -33,23 +33,23 @@ define([], function() {
result = undefined;
if (customizer) {
- result = isWhere
+ result = isLoose
? customizer(othValue, arrValue, index)
: customizer(arrValue, othValue, index);
}
if (typeof result == 'undefined') {
// Recursively compare arrays (susceptible to call stack limits).
- if (isWhere) {
+ if (isLoose) {
var othIndex = othLength;
while (othIndex--) {
othValue = other[othIndex];
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
if (result) {
break;
}
}
} else {
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
}
}
}
diff --git a/internal/equalObjects.js b/internal/equalObjects.js
index 2313e15a9..126dd4206 100644
--- a/internal/equalObjects.js
+++ b/internal/equalObjects.js
@@ -18,26 +18,26 @@ define(['../object/keys'], function(keys) {
* @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 values.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
- function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
var objProps = keys(object),
objLength = objProps.length,
othProps = keys(other),
othLength = othProps.length;
- if (objLength != othLength && !isWhere) {
+ if (objLength != othLength && !isLoose) {
return false;
}
- var hasCtor,
+ var skipCtor = isLoose,
index = -1;
while (++index < objLength) {
var key = objProps[index],
- result = hasOwnProperty.call(other, key);
+ result = isLoose ? key in other : hasOwnProperty.call(other, key);
if (result) {
var objValue = object[key],
@@ -45,21 +45,21 @@ define(['../object/keys'], function(keys) {
result = undefined;
if (customizer) {
- result = isWhere
+ result = isLoose
? customizer(othValue, objValue, key)
: customizer(objValue, othValue, key);
}
if (typeof result == 'undefined') {
// Recursively compare objects (susceptible to call stack limits).
- result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
}
}
if (!result) {
return false;
}
- hasCtor || (hasCtor = key == 'constructor');
+ skipCtor || (skipCtor = key == 'constructor');
}
- if (!hasCtor) {
+ if (!skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
diff --git a/internal/extremumBy.js b/internal/extremumBy.js
index a2034e264..983a2b8f0 100644
--- a/internal/extremumBy.js
+++ b/internal/extremumBy.js
@@ -7,7 +7,7 @@ define(['./baseEach'], function(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, collection).
+ * The `iteratee` is invoked with three arguments: (value, index, collection).
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
diff --git a/internal/getFuncName.js b/internal/getFuncName.js
new file mode 100644
index 000000000..d044a2dfa
--- /dev/null
+++ b/internal/getFuncName.js
@@ -0,0 +1,35 @@
+define(['./baseProperty', '../utility/constant', './realNames', '../support'], function(baseProperty, constant, realNames, support) {
+
+ /**
+ * Gets the name of `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {string} Returns the function name.
+ */
+ var getFuncName = (function() {
+ if (!support.funcNames) {
+ return constant('');
+ }
+ if (constant.name == 'constant') {
+ return baseProperty('name');
+ }
+ return function(func) {
+ var result = func.name,
+ array = realNames[result],
+ length = array ? array.length : 0;
+
+ while (length--) {
+ var data = array[length],
+ otherFunc = data.func;
+
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result;
+ };
+ }());
+
+ return getFuncName;
+});
diff --git a/internal/indexOfNaN.js b/internal/indexOfNaN.js
index 913d8801f..f328408ef 100644
--- a/internal/indexOfNaN.js
+++ b/internal/indexOfNaN.js
@@ -2,7 +2,6 @@ define([], function() {
/**
* Gets the index at which the first occurrence of `NaN` is found in `array`.
- * If `fromRight` is provided elements of `array` are iterated from right to left.
*
* @private
* @param {Array} array The array to search.
diff --git a/internal/isBindable.js b/internal/isBindable.js
deleted file mode 100644
index d5a51544b..000000000
--- a/internal/isBindable.js
+++ /dev/null
@@ -1,37 +0,0 @@
-define(['./baseSetData', '../lang/isNative', '../support'], function(baseSetData, isNative, support) {
-
- /** Used to detect named functions. */
- var reFuncName = /^\s*function[ \n\r\t]+\w/;
-
- /** Used to detect functions containing a `this` reference. */
- var reThis = /\bthis\b/;
-
- /** Used to resolve the decompiled source of functions. */
- var fnToString = Function.prototype.toString;
-
- /**
- * Checks if `func` is eligible for `this` binding.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is eligible, else `false`.
- */
- function isBindable(func) {
- var result = !(support.funcNames ? func.name : support.funcDecomp);
-
- if (!result) {
- var source = fnToString.call(func);
- if (!support.funcNames) {
- result = !reFuncName.test(source);
- }
- if (!result) {
- // Check if `func` references the `this` keyword and store the result.
- result = reThis.test(source) || isNative(func);
- baseSetData(func, result);
- }
- }
- return result;
- }
-
- return isBindable;
-});
diff --git a/internal/isIndex.js b/internal/isIndex.js
index 28f79eef4..8715429a6 100644
--- a/internal/isIndex.js
+++ b/internal/isIndex.js
@@ -1,9 +1,8 @@
define([], function() {
/**
- * Used as the maximum length of an array-like value.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
- * for more details.
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
*/
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
diff --git a/internal/isLaziable.js b/internal/isLaziable.js
new file mode 100644
index 000000000..988103226
--- /dev/null
+++ b/internal/isLaziable.js
@@ -0,0 +1,16 @@
+define(['./LazyWrapper', './getFuncName', '../chain/lodash'], function(LazyWrapper, getFuncName, lodash) {
+
+ /**
+ * Checks if `func` has a lazy counterpart.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
+ */
+ function isLaziable(func) {
+ var funcName = getFuncName(func);
+ return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;
+ }
+
+ return isLaziable;
+});
diff --git a/internal/isLength.js b/internal/isLength.js
index 165e7a0b7..49fb58d24 100644
--- a/internal/isLength.js
+++ b/internal/isLength.js
@@ -1,18 +1,15 @@
define([], function() {
/**
- * Used as the maximum length of an array-like value.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
- * for more details.
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
*/
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
/**
* Checks if `value` is a valid array-like length.
*
- * **Note:** This function is based on ES `ToLength`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)
- * for more details.
+ * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
*
* @private
* @param {*} value The value to check.
diff --git a/internal/isObjectLike.js b/internal/isObjectLike.js
index 4840be5fb..42fc5561a 100644
--- a/internal/isObjectLike.js
+++ b/internal/isObjectLike.js
@@ -8,7 +8,7 @@ define([], function() {
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
*/
function isObjectLike(value) {
- return (value && typeof value == 'object') || false;
+ return !!value && typeof value == 'object';
}
return isObjectLike;
diff --git a/internal/mergeData.js b/internal/mergeData.js
index fc6aef4d3..2c0a70857 100644
--- a/internal/mergeData.js
+++ b/internal/mergeData.js
@@ -2,11 +2,10 @@ define(['./arrayCopy', './composeArgs', './composeArgsRight', './replaceHolders'
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
- BIND_KEY_FLAG = 2,
CURRY_BOUND_FLAG = 4,
- CURRY_RIGHT_FLAG = 16,
- REARG_FLAG = 128,
- ARY_FLAG = 256;
+ CURRY_FLAG = 8,
+ ARY_FLAG = 128,
+ REARG_FLAG = 256;
/** Used as the internal argument placeholder. */
var PLACEHOLDER = '__lodash_placeholder__';
@@ -32,22 +31,13 @@ define(['./arrayCopy', './composeArgs', './composeArgsRight', './replaceHolders'
function mergeData(data, source) {
var bitmask = data[1],
srcBitmask = source[1],
- newBitmask = bitmask | srcBitmask;
+ newBitmask = bitmask | srcBitmask,
+ isCommon = newBitmask < ARY_FLAG;
- var arityFlags = ARY_FLAG | REARG_FLAG,
- bindFlags = BIND_FLAG | BIND_KEY_FLAG,
- comboFlags = arityFlags | bindFlags | CURRY_BOUND_FLAG | CURRY_RIGHT_FLAG;
-
- var isAry = bitmask & ARY_FLAG && !(srcBitmask & ARY_FLAG),
- isRearg = bitmask & REARG_FLAG && !(srcBitmask & REARG_FLAG),
- argPos = (isRearg ? data : source)[7],
- ary = (isAry ? data : source)[8];
-
- var isCommon = !(bitmask >= REARG_FLAG && srcBitmask > bindFlags) &&
- !(bitmask > bindFlags && srcBitmask >= REARG_FLAG);
-
- var isCombo = (newBitmask >= arityFlags && newBitmask <= comboFlags) &&
- (bitmask < REARG_FLAG || ((isRearg || isAry) && argPos.length <= ary));
+ var isCombo =
+ (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
+ (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
+ (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
// Exit early if metadata can't be merged.
if (!(isCommon || isCombo)) {
diff --git a/internal/realNames.js b/internal/realNames.js
new file mode 100644
index 000000000..ba295c41f
--- /dev/null
+++ b/internal/realNames.js
@@ -0,0 +1,7 @@
+define([], function() {
+
+ /** Used to lookup unminified function names. */
+ var realNames = {};
+
+ return realNames;
+});
diff --git a/internal/root.js b/internal/root.js
index ebbef2755..1bd60eb94 100644
--- a/internal/root.js
+++ b/internal/root.js
@@ -15,8 +15,11 @@ define([], function() {
/** Detect free variable `global` from Node.js. */
var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;
+ /** Detect free variable `self`. */
+ var freeSelf = objectTypes[typeof self] && self && self.Object && self;
+
/** Detect free variable `window`. */
- var freeWindow = objectTypes[typeof window] && window;
+ var freeWindow = objectTypes[typeof window] && window && window.Object && window;
/**
* Used as a reference to the global object.
@@ -24,7 +27,7 @@ define([], function() {
* The `this` value is used if it is the global object to avoid Greasemonkey's
* restricted `window` object, otherwise the `window` object is used.
*/
- var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || this;
+ var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
return root;
});
diff --git a/internal/shimIsPlainObject.js b/internal/shimIsPlainObject.js
index f2f25179d..083b1b115 100644
--- a/internal/shimIsPlainObject.js
+++ b/internal/shimIsPlainObject.js
@@ -10,9 +10,8 @@ define(['./baseForIn', './isObjectLike'], function(baseForIn, isObjectLike) {
var hasOwnProperty = objectProto.hasOwnProperty;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
diff --git a/lang/clone.js b/lang/clone.js
index 7285b18e2..049e98f04 100644
--- a/lang/clone.js
+++ b/lang/clone.js
@@ -7,12 +7,12 @@ define(['../internal/baseClone', '../internal/bindCallback', '../internal/isIter
* cloning is handled by the method instead. The `customizer` is bound to
* `thisArg` and invoked with two argument; (value [, index|key, object]).
*
- * **Note:** This method is loosely based on the structured clone algorithm.
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
* The enumerable properties of `arguments` objects and objects created by
* constructors other than `Object` are cloned to plain `Object` objects. An
* empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)
- * for more details.
+ * Maps, Sets, and WeakMaps.
*
* @static
* @memberOf _
diff --git a/lang/cloneDeep.js b/lang/cloneDeep.js
index c8906cf46..ba3745d1a 100644
--- a/lang/cloneDeep.js
+++ b/lang/cloneDeep.js
@@ -6,12 +6,12 @@ define(['../internal/baseClone', '../internal/bindCallback'], function(baseClone
* is handled by the method instead. The `customizer` is bound to `thisArg`
* and invoked with two argument; (value [, index|key, object]).
*
- * **Note:** This method is loosely based on the structured clone algorithm.
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
* The enumerable properties of `arguments` objects and objects created by
* constructors other than `Object` are cloned to plain `Object` objects. An
* empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)
- * for more details.
+ * Maps, Sets, and WeakMaps.
*
* @static
* @memberOf _
diff --git a/lang/isArguments.js b/lang/isArguments.js
index a63a94fd5..038190205 100644
--- a/lang/isArguments.js
+++ b/lang/isArguments.js
@@ -10,9 +10,8 @@ define(['../internal/isLength', '../internal/isObjectLike'], function(isLength,
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -34,7 +33,7 @@ define(['../internal/isLength', '../internal/isObjectLike'], function(isLength,
*/
function isArguments(value) {
var length = isObjectLike(value) ? value.length : undefined;
- return (isLength(length) && objToString.call(value) == argsTag) || false;
+ return isLength(length) && objToString.call(value) == argsTag;
}
return isArguments;
diff --git a/lang/isArray.js b/lang/isArray.js
index 0844a98ff..29149adbc 100644
--- a/lang/isArray.js
+++ b/lang/isArray.js
@@ -7,9 +7,8 @@ define(['../internal/isLength', './isNative', '../internal/isObjectLike'], funct
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -33,7 +32,7 @@ define(['../internal/isLength', './isNative', '../internal/isObjectLike'], funct
* // => false
*/
var isArray = nativeIsArray || function(value) {
- return (isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag) || false;
+ return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
};
return isArray;
diff --git a/lang/isBoolean.js b/lang/isBoolean.js
index 2fdf1887d..a40179c89 100644
--- a/lang/isBoolean.js
+++ b/lang/isBoolean.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -30,7 +29,7 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
* // => false
*/
function isBoolean(value) {
- return (value === true || value === false || isObjectLike(value) && objToString.call(value) == boolTag) || false;
+ return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
}
return isBoolean;
diff --git a/lang/isDate.js b/lang/isDate.js
index 174e28bf6..cffe36e17 100644
--- a/lang/isDate.js
+++ b/lang/isDate.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -30,7 +29,7 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
* // => false
*/
function isDate(value) {
- return (isObjectLike(value) && objToString.call(value) == dateTag) || false;
+ return isObjectLike(value) && objToString.call(value) == dateTag;
}
return isDate;
diff --git a/lang/isElement.js b/lang/isElement.js
index cce98e4cb..a0bf58349 100644
--- a/lang/isElement.js
+++ b/lang/isElement.js
@@ -4,9 +4,8 @@ define(['../internal/isObjectLike', './isPlainObject', '../support'], function(i
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -27,13 +26,13 @@ define(['../internal/isObjectLike', './isPlainObject', '../support'], function(i
* // => false
*/
function isElement(value) {
- return (value && value.nodeType === 1 && isObjectLike(value) &&
- (objToString.call(value).indexOf('Element') > -1)) || false;
+ return !!value && value.nodeType === 1 && isObjectLike(value) &&
+ (objToString.call(value).indexOf('Element') > -1);
}
// Fallback for environments without DOM support.
if (!support.dom) {
isElement = function(value) {
- return (value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value)) || false;
+ return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
};
}
diff --git a/lang/isEqual.js b/lang/isEqual.js
index fa9777b2d..583feb42a 100644
--- a/lang/isEqual.js
+++ b/lang/isEqual.js
@@ -8,7 +8,7 @@ define(['../internal/baseIsEqual', '../internal/bindCallback', '../internal/isSt
* equivalent. If `customizer` is provided it is invoked to compare values.
* If `customizer` returns `undefined` comparisons are handled by the method
* instead. The `customizer` is bound to `thisArg` and invoked with three
- * arguments; (value, other [, index|key]).
+ * arguments: (value, other [, index|key]).
*
* **Note:** This method supports comparing arrays, booleans, `Date` objects,
* numbers, `Object` objects, regexes, and strings. Objects are compared by
diff --git a/lang/isError.js b/lang/isError.js
index 6dac4ccb9..bfb28023e 100644
--- a/lang/isError.js
+++ b/lang/isError.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -31,7 +30,7 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
* // => false
*/
function isError(value) {
- return (isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag) || false;
+ return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
}
return isError;
diff --git a/lang/isFinite.js b/lang/isFinite.js
index 50f5f945c..fb3029bd4 100644
--- a/lang/isFinite.js
+++ b/lang/isFinite.js
@@ -7,9 +7,7 @@ define(['./isNative', '../internal/root'], function(isNative, root) {
/**
* Checks if `value` is a finite primitive number.
*
- * **Note:** This method is based on ES `Number.isFinite`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite)
- * for more details.
+ * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).
*
* @static
* @memberOf _
diff --git a/lang/isFunction.js b/lang/isFunction.js
index d1736aaf6..ead1c8f38 100644
--- a/lang/isFunction.js
+++ b/lang/isFunction.js
@@ -7,9 +7,8 @@ define(['../internal/baseIsFunction', './isNative', '../internal/root'], functio
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
diff --git a/lang/isMatch.js b/lang/isMatch.js
index 6db64580d..a22bcefe5 100644
--- a/lang/isMatch.js
+++ b/lang/isMatch.js
@@ -1,17 +1,11 @@
-define(['../internal/baseIsMatch', '../internal/bindCallback', '../internal/isStrictComparable', '../object/keys'], function(baseIsMatch, bindCallback, isStrictComparable, keys) {
-
- /** Used for native method references. */
- var objectProto = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
+define(['../internal/baseIsMatch', '../internal/bindCallback', '../internal/isStrictComparable', '../object/keys', '../internal/toObject'], function(baseIsMatch, bindCallback, isStrictComparable, keys, toObject) {
/**
* Performs a deep comparison between `object` and `source` to determine if
* `object` contains equivalent property values. If `customizer` is provided
* it is invoked to compare values. If `customizer` returns `undefined`
* comparisons are handled by the method instead. The `customizer` is bound
- * to `thisArg` and invoked with three arguments; (value, other, index|key).
+ * to `thisArg` and invoked with three arguments: (value, other, index|key).
*
* **Note:** This method supports comparing properties of arrays, booleans,
* `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
@@ -49,13 +43,19 @@ define(['../internal/baseIsMatch', '../internal/bindCallback', '../internal/isSt
var props = keys(source),
length = props.length;
+ if (!length) {
+ return true;
+ }
+ if (object == null) {
+ return false;
+ }
customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
if (!customizer && length == 1) {
var key = props[0],
value = source[key];
if (isStrictComparable(value)) {
- return object != null && value === object[key] && hasOwnProperty.call(object, key);
+ return value === object[key] && (typeof value != 'undefined' || (key in toObject(object)));
}
}
var values = Array(length),
@@ -65,7 +65,7 @@ define(['../internal/baseIsMatch', '../internal/bindCallback', '../internal/isSt
value = values[length] = source[props[length]];
strictCompareFlags[length] = isStrictComparable(value);
}
- return baseIsMatch(object, props, values, strictCompareFlags, customizer);
+ return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer);
}
return isMatch;
diff --git a/lang/isNaN.js b/lang/isNaN.js
index 68d4fc9d9..04a24465e 100644
--- a/lang/isNaN.js
+++ b/lang/isNaN.js
@@ -3,9 +3,8 @@ define(['./isNumber'], function(isNumber) {
/**
* Checks if `value` is `NaN`.
*
- * **Note:** This method is not the same as native `isNaN` which returns `true`
- * for `undefined` and other non-numeric values. See the [ES5 spec](https://es5.github.io/#x15.1.2.4)
- * for more details.
+ * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
+ * which returns `true` for `undefined` and other non-numeric values.
*
* @static
* @memberOf _
diff --git a/lang/isNative.js b/lang/isNative.js
index 446abba81..4a25d69cc 100644
--- a/lang/isNative.js
+++ b/lang/isNative.js
@@ -13,9 +13,8 @@ define(['../string/escapeRegExp', '../internal/isObjectLike'], function(escapeRe
var fnToString = Function.prototype.toString;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -48,7 +47,7 @@ define(['../string/escapeRegExp', '../internal/isObjectLike'], function(escapeRe
if (objToString.call(value) == funcTag) {
return reNative.test(fnToString.call(value));
}
- return (isObjectLike(value) && reHostCtor.test(value)) || false;
+ return isObjectLike(value) && reHostCtor.test(value);
}
return isNative;
diff --git a/lang/isNumber.js b/lang/isNumber.js
index 01c5b1c7f..68aed9b02 100644
--- a/lang/isNumber.js
+++ b/lang/isNumber.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -36,7 +35,7 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
* // => false
*/
function isNumber(value) {
- return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag) || false;
+ return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
}
return isNumber;
diff --git a/lang/isObject.js b/lang/isObject.js
index 4beb28e62..029158d95 100644
--- a/lang/isObject.js
+++ b/lang/isObject.js
@@ -1,11 +1,9 @@
define([], function() {
/**
- * Checks if `value` is the language type of `Object`.
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
- * **Note:** See the [ES5 spec](https://es5.github.io/#x8) for more details.
- *
* @static
* @memberOf _
* @category Lang
@@ -26,7 +24,7 @@ define([], function() {
// Avoid a V8 JIT bug in Chrome 19-20.
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
var type = typeof value;
- return type == 'function' || (value && type == 'object') || false;
+ return type == 'function' || (!!value && type == 'object');
}
return isObject;
diff --git a/lang/isPlainObject.js b/lang/isPlainObject.js
index d44eb811c..ec4dc8c3b 100644
--- a/lang/isPlainObject.js
+++ b/lang/isPlainObject.js
@@ -7,9 +7,8 @@ define(['./isNative', '../internal/shimIsPlainObject'], function(isNative, shimI
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
diff --git a/lang/isRegExp.js b/lang/isRegExp.js
index 2e925af79..bb515d749 100644
--- a/lang/isRegExp.js
+++ b/lang/isRegExp.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
diff --git a/lang/isString.js b/lang/isString.js
index b6275b27b..3538ad9f5 100644
--- a/lang/isString.js
+++ b/lang/isString.js
@@ -7,9 +7,8 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -30,7 +29,7 @@ define(['../internal/isObjectLike'], function(isObjectLike) {
* // => false
*/
function isString(value) {
- return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag) || false;
+ return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
}
return isString;
diff --git a/lang/isTypedArray.js b/lang/isTypedArray.js
index 7717b9d4c..91f177682 100644
--- a/lang/isTypedArray.js
+++ b/lang/isTypedArray.js
@@ -45,9 +45,8 @@ define(['../internal/isLength', '../internal/isObjectLike'], function(isLength,
var objectProto = Object.prototype;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -68,7 +67,7 @@ define(['../internal/isLength', '../internal/isObjectLike'], function(isLength,
* // => false
*/
function isTypedArray(value) {
- return (isObjectLike(value) && isLength(value.length) && typedArrayTags[objToString.call(value)]) || false;
+ return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
}
return isTypedArray;
diff --git a/main.js b/main.js
index 8f79a7d49..200685115 100644
--- a/main.js
+++ b/main.js
@@ -1,6 +1,6 @@
/**
* @license
- * lodash 3.5.0 (Custom Build)
+ * lodash 3.6.0 (Custom Build)
* Build: `lodash modern exports="amd" -d -o ./main.js`
* Copyright 2012-2015 The Dojo Foundation
* Based on Underscore.js 1.8.2
@@ -13,7 +13,7 @@
var undefined;
/** Used as the semantic version number. */
- var VERSION = '3.5.0';
+ var VERSION = '3.6.0';
/** Used to compose bitmasks for wrapper metadata. */
var BIND_FLAG = 1,
@@ -23,8 +23,8 @@
CURRY_RIGHT_FLAG = 16,
PARTIAL_FLAG = 32,
PARTIAL_RIGHT_FLAG = 64,
- REARG_FLAG = 128,
- ARY_FLAG = 256;
+ ARY_FLAG = 128,
+ REARG_FLAG = 256;
/** Used as default options for `_.trunc`. */
var DEFAULT_TRUNC_LENGTH = 30,
@@ -88,18 +88,18 @@
reInterpolate = /<%=([\s\S]+?)%>/g;
/**
- * Used to match ES template delimiters.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components)
- * for more details.
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ */
+ var reComboMarks = /[\u0300-\u036f\ufe20-\ufe23]/g;
+
+ /**
+ * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components).
*/
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
/** Used to match `RegExp` flags from their coerced string values. */
var reFlags = /\w*$/;
- /** Used to detect named functions. */
- var reFuncName = /^\s*function[ \n\r\t]+\w/;
-
/** Used to detect hexadecimal string values. */
var reHexPrefix = /^0[xX]/;
@@ -113,16 +113,13 @@
var reNoMatch = /($^)/;
/**
- * Used to match `RegExp` special characters.
- * See this [article on `RegExp` characters](http://www.regular-expressions.info/characters.html#special)
- * for more details.
+ * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).
+ * In addition to special characters the forward slash is escaped to allow for
+ * easier `eval` use and `Function` compilation.
*/
var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
reHasRegExpChars = RegExp(reRegExpChars.source);
- /** Used to detect functions containing a `this` reference. */
- var reThis = /\bthis\b/;
-
/** Used to match unescaped characters in compiled string literals. */
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
@@ -153,7 +150,7 @@
'Object', 'RegExp', 'Set', 'String', '_', 'clearTimeout', 'document',
'isFinite', 'parseInt', 'setTimeout', 'TypeError', 'Uint8Array',
'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
- 'window', 'WinRTError'
+ 'window'
];
/** Used to make template sourceURLs easier to identify. */
@@ -262,8 +259,11 @@
/** Detect free variable `global` from Node.js. */
var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;
+ /** Detect free variable `self`. */
+ var freeSelf = objectTypes[typeof self] && self && self.Object && self;
+
/** Detect free variable `window`. */
- var freeWindow = objectTypes[typeof window] && window;
+ var freeWindow = objectTypes[typeof window] && window && window.Object && window;
/**
* Used as a reference to the global object.
@@ -271,7 +271,7 @@
* The `this` value is used if it is the global object to avoid Greasemonkey's
* restricted `window` object, otherwise the `window` object is used.
*/
- var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || this;
+ var root = freeGlobal || ((freeWindow !== (this && this.window)) && freeWindow) || freeSelf || this;
/*--------------------------------------------------------------------------*/
@@ -299,6 +299,28 @@
return 0;
}
+ /**
+ * The base implementation of `_.findIndex` and `_.findLastIndex` without
+ * support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseFindIndex(array, predicate, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (predicate(array[index], index, array)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
/**
* The base implementation of `_.indexOf` without support for binary searches.
*
@@ -485,7 +507,6 @@
/**
* Gets the index at which the first occurrence of `NaN` is found in `array`.
- * If `fromRight` is provided elements of `array` are iterated from right to left.
*
* @private
* @param {Array} array The array to search.
@@ -514,7 +535,7 @@
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
*/
function isObjectLike(value) {
- return (value && typeof value == 'object') || false;
+ return !!value && typeof value == 'object';
}
/**
@@ -636,19 +657,19 @@
* @returns {Function} Returns a new `lodash` function.
* @example
*
- * _.mixin({ 'add': function(a, b) { return a + b; } });
+ * _.mixin({ 'foo': _.constant('foo') });
*
* var lodash = _.runInContext();
- * lodash.mixin({ 'sub': function(a, b) { return a - b; } });
+ * lodash.mixin({ 'bar': lodash.constant('bar') });
*
- * _.isFunction(_.add);
+ * _.isFunction(_.foo);
* // => true
- * _.isFunction(_.sub);
+ * _.isFunction(_.bar);
* // => false
*
- * lodash.isFunction(lodash.add);
+ * lodash.isFunction(lodash.foo);
* // => false
- * lodash.isFunction(lodash.sub);
+ * lodash.isFunction(lodash.bar);
* // => true
*
* // using `context` to mock `Date#getTime` use in `_.now`
@@ -701,9 +722,8 @@
var idCounter = 0;
/**
- * Used to resolve the `toStringTag` of values.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
- * for more details.
+ * Used to resolve the [`toStringTag`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.prototype.tostring)
+ * of values.
*/
var objToString = objectProto.toString;
@@ -768,15 +788,17 @@
var FLOAT64_BYTES_PER_ELEMENT = Float64Array ? Float64Array.BYTES_PER_ELEMENT : 0;
/**
- * Used as the maximum length of an array-like value.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
- * for more details.
+ * Used as the [maximum length](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.max_safe_integer)
+ * of an array-like value.
*/
var MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
/** Used to store function metadata. */
var metaMap = WeakMap && new WeakMap;
+ /** Used to lookup unminified function names. */
+ var realNames = {};
+
/*------------------------------------------------------------------------*/
/**
@@ -926,7 +948,7 @@
* @memberOf _.support
* @type boolean
*/
- support.funcDecomp = !isNative(context.WinRTError) && reThis.test(runInContext);
+ support.funcDecomp = /\bthis\b/.test(function() { return this; });
/**
* Detect if `Function#name` is supported (all but IE).
@@ -1302,7 +1324,7 @@
/**
* A specialized version of `_.forEach` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1323,7 +1345,7 @@
/**
* A specialized version of `_.forEachRight` for arrays without support for
- * callback shorthands or `this` binding.
+ * callback shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1343,7 +1365,7 @@
/**
* A specialized version of `_.every` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1365,7 +1387,7 @@
/**
* A specialized version of `_.filter` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1389,7 +1411,7 @@
/**
* A specialized version of `_.map` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1451,7 +1473,7 @@
/**
* A specialized version of `_.reduce` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1476,7 +1498,7 @@
/**
* A specialized version of `_.reduceRight` for arrays without support for
- * callback shorthands or `this` binding.
+ * callback shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1499,7 +1521,7 @@
/**
* A specialized version of `_.some` for arrays without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
@@ -1519,6 +1541,23 @@
return false;
}
+ /**
+ * A specialized version of `_.sum` for arrays without support for iteratees.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @returns {number} Returns the sum.
+ */
+ function arraySum(array) {
+ var length = array.length,
+ result = 0;
+
+ while (length--) {
+ result += +array[length] || 0;
+ }
+ return result;
+ }
+
/**
* Used by `_.defaults` to customize its `_.assign` use.
*
@@ -1633,26 +1672,6 @@
return object;
}
- /**
- * The base implementation of `_.bindAll` without support for individual
- * method name arguments.
- *
- * @private
- * @param {Object} object The object to bind and assign the bound methods to.
- * @param {string[]} methodNames The object method names to bind.
- * @returns {Object} Returns `object`.
- */
- function baseBindAll(object, methodNames) {
- var index = -1,
- length = methodNames.length;
-
- while (++index < length) {
- var key = methodNames[index];
- object[key] = createWrapper(object[key], BIND_FLAG, object);
- }
- return object;
- }
-
/**
* The base implementation of `_.callback` which supports specifying the
* number of arguments to provide to `func`.
@@ -1666,9 +1685,9 @@
function baseCallback(func, thisArg, argCount) {
var type = typeof func;
if (type == 'function') {
- return (typeof thisArg != 'undefined' && isBindable(func))
- ? bindCallback(func, thisArg, argCount)
- : func;
+ return typeof thisArg == 'undefined'
+ ? func
+ : bindCallback(func, thisArg, argCount);
}
if (func == null) {
return identity;
@@ -1775,14 +1794,14 @@
* @private
* @param {Function} func The function to delay.
* @param {number} wait The number of milliseconds to delay invocation.
- * @param {Object} args The `arguments` object to slice and provide to `func`.
+ * @param {Object} args The arguments provide to `func`.
* @returns {number} Returns the timer id.
*/
- function baseDelay(func, wait, args, fromIndex) {
+ function baseDelay(func, wait, args) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
- return setTimeout(function() { func.apply(undefined, baseSlice(args, fromIndex)); }, wait);
+ return setTimeout(function() { func.apply(undefined, args); }, wait);
}
/**
@@ -1841,21 +1860,7 @@
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object|string} Returns `collection`.
*/
- function baseEach(collection, iteratee) {
- var length = collection ? collection.length : 0;
- if (!isLength(length)) {
- return baseForOwn(collection, iteratee);
- }
- var index = -1,
- iterable = toObject(collection);
-
- while (++index < length) {
- if (iteratee(iterable[index], index, iterable) === false) {
- break;
- }
- }
- return collection;
- }
+ var baseEach = createBaseEach(baseForOwn);
/**
* The base implementation of `_.forEachRight` without support for callback
@@ -1866,23 +1871,11 @@
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array|Object|string} Returns `collection`.
*/
- function baseEachRight(collection, iteratee) {
- var length = collection ? collection.length : 0;
- if (!isLength(length)) {
- return baseForOwnRight(collection, iteratee);
- }
- var iterable = toObject(collection);
- while (length--) {
- if (iteratee(iterable[length], length, iterable) === false) {
- break;
- }
- }
- return collection;
- }
+ var baseEachRight = createBaseEach(baseForOwnRight, true);
/**
* The base implementation of `_.every` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
@@ -1931,7 +1924,7 @@
/**
* The base implementation of `_.filter` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
@@ -1980,11 +1973,10 @@
* @param {Array} array The array to flatten.
* @param {boolean} isDeep Specify a deep flatten.
* @param {boolean} isStrict Restrict flattening to arrays and `arguments` objects.
- * @param {number} fromIndex The index to start from.
* @returns {Array} Returns the new flattened array.
*/
- function baseFlatten(array, isDeep, isStrict, fromIndex) {
- var index = fromIndex - 1,
+ function baseFlatten(array, isDeep, isStrict) {
+ var index = -1,
length = array.length,
resIndex = -1,
result = [];
@@ -1995,7 +1987,7 @@
if (isObjectLike(value) && isLength(value.length) && (isArray(value) || isArguments(value))) {
if (isDeep) {
// Recursively flatten arrays (susceptible to call stack limits).
- value = baseFlatten(value, isDeep, isStrict, 0);
+ value = baseFlatten(value, isDeep, isStrict);
}
var valIndex = -1,
valLength = value.length;
@@ -2023,20 +2015,7 @@
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
- function baseFor(object, iteratee, keysFunc) {
- var index = -1,
- iterable = toObject(object),
- props = keysFunc(object),
- length = props.length;
-
- while (++index < length) {
- var key = props[index];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
- }
- }
- return object;
- }
+ var baseFor = createBaseFor();
/**
* This function is like `baseFor` except that it iterates over properties
@@ -2048,19 +2027,7 @@
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
- function baseForRight(object, iteratee, keysFunc) {
- var iterable = toObject(object),
- props = keysFunc(object),
- length = props.length;
-
- while (length--) {
- var key = props[length];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
- }
- }
- return object;
- }
+ var baseForRight = createBaseFor(true);
/**
* The base implementation of `_.forIn` without support for callback
@@ -2125,30 +2092,6 @@
return result;
}
- /**
- * The base implementation of `_.invoke` which requires additional arguments
- * to be provided as an array of arguments rather than individually.
- *
- * @private
- * @param {Array|Object|string} collection The collection to iterate over.
- * @param {Function|string} methodName The name of the method to invoke or
- * the function invoked per iteration.
- * @param {Array} [args] The arguments to invoke the method with.
- * @returns {Array} Returns the array of results.
- */
- function baseInvoke(collection, methodName, args) {
- var index = -1,
- isFunc = typeof methodName == 'function',
- length = collection ? collection.length : 0,
- result = isLength(length) ? Array(length) : [];
-
- baseEach(collection, function(value) {
- var func = isFunc ? methodName : (value != null && value[methodName]);
- result[++index] = func ? func.apply(value, args) : undefined;
- });
- return result;
- }
-
/**
* The base implementation of `_.isEqual` without support for `this` binding
* `customizer` functions.
@@ -2157,12 +2100,12 @@
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {Function} [customizer] The function to customize comparing values.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
- function baseIsEqual(value, other, customizer, isWhere, stackA, stackB) {
+ function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
// Exit early for identical values.
if (value === other) {
// Treat `+0` vs. `-0` as not equal.
@@ -2177,7 +2120,7 @@
// Return `false` unless both values are `NaN`.
return value !== value && other !== other;
}
- return baseIsEqualDeep(value, other, baseIsEqual, customizer, isWhere, stackA, stackB);
+ return baseIsEqualDeep(value, other, baseIsEqual, customizer, isLoose, stackA, stackB);
}
/**
@@ -2190,12 +2133,12 @@
* @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} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA=[]] Tracks traversed `value` objects.
* @param {Array} [stackB=[]] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
- function baseIsEqualDeep(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
var objIsArr = isArray(object),
othIsArr = isArray(other),
objTag = arrayTag,
@@ -2217,21 +2160,27 @@
othIsArr = isTypedArray(other);
}
}
- var objIsObj = objTag == objectTag,
- othIsObj = othTag == objectTag,
+ var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)),
+ othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)),
isSameTag = objTag == othTag;
if (isSameTag && !(objIsArr || objIsObj)) {
return equalByTag(object, other, objTag);
}
- var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
- othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
+ if (isLoose) {
+ if (!isSameTag && !(objIsObj && othIsObj)) {
+ return false;
+ }
+ } else {
+ var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
+ othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
- if (valWrapped || othWrapped) {
- return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isWhere, stackA, stackB);
- }
- if (!isSameTag) {
- return false;
+ if (valWrapped || othWrapped) {
+ return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
+ }
+ if (!isSameTag) {
+ return false;
+ }
}
// Assume cyclic values are equal.
// For more information on detecting circular references see https://es5.github.io/#JO.
@@ -2248,7 +2197,7 @@
stackA.push(object);
stackB.push(other);
- var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isWhere, stackA, stackB);
+ var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, customizer, isLoose, stackA, stackB);
stackA.pop();
stackB.pop();
@@ -2258,7 +2207,7 @@
/**
* The base implementation of `_.isMatch` without support for callback
- * shorthands or `this` binding.
+ * shorthands and `this` binding.
*
* @private
* @param {Object} object The object to inspect.
@@ -2269,30 +2218,27 @@
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, props, values, strictCompareFlags, customizer) {
- var length = props.length;
- if (object == null) {
- return !length;
- }
var index = -1,
+ length = props.length,
noCustomizer = !customizer;
while (++index < length) {
if ((noCustomizer && strictCompareFlags[index])
? values[index] !== object[props[index]]
- : !hasOwnProperty.call(object, props[index])
+ : !(props[index] in object)
) {
return false;
}
}
index = -1;
while (++index < length) {
- var key = props[index];
- if (noCustomizer && strictCompareFlags[index]) {
- var result = hasOwnProperty.call(object, key);
- } else {
- var objValue = object[key],
- srcValue = values[index];
+ var key = props[index],
+ objValue = object[key],
+ srcValue = values[index];
+ if (noCustomizer && strictCompareFlags[index]) {
+ var result = typeof objValue != 'undefined' || (key in object);
+ } else {
result = customizer ? customizer(objValue, srcValue, key) : undefined;
if (typeof result == 'undefined') {
result = baseIsEqual(srcValue, objValue, customizer, true);
@@ -2307,7 +2253,7 @@
/**
* The base implementation of `_.map` without support for callback shorthands
- * or `this` binding.
+ * and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
@@ -2333,13 +2279,17 @@
var props = keys(source),
length = props.length;
+ if (!length) {
+ return constant(true);
+ }
if (length == 1) {
var key = props[0],
value = source[key];
if (isStrictComparable(value)) {
return function(object) {
- return object != null && object[key] === value && hasOwnProperty.call(object, key);
+ return object != null && object[key] === value &&
+ (typeof value != 'undefined' || (key in toObject(object)));
};
}
}
@@ -2352,7 +2302,7 @@
strictCompareFlags[length] = isStrictComparable(value);
}
return function(object) {
- return baseIsMatch(object, props, values, strictCompareFlags);
+ return object != null && baseIsMatch(toObject(object), props, values, strictCompareFlags);
};
}
@@ -2368,7 +2318,8 @@
function baseMatchesProperty(key, value) {
if (isStrictComparable(value)) {
return function(object) {
- return object != null && object[key] === value;
+ return object != null && object[key] === value &&
+ (typeof value != 'undefined' || (key in toObject(object)));
};
}
return function(object) {
@@ -2448,7 +2399,7 @@
if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
result = isArray(value)
? value
- : (value ? arrayCopy(value) : []);
+ : ((value && value.length) ? arrayCopy(value) : []);
}
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
result = isArguments(value)
@@ -2485,30 +2436,6 @@
};
}
- /**
- * The base implementation of `_.pullAt` without support for individual
- * index arguments.
- *
- * @private
- * @param {Array} array The array to modify.
- * @param {number[]} indexes The indexes of elements to remove.
- * @returns {Array} Returns the new array of removed elements.
- */
- function basePullAt(array, indexes) {
- var length = indexes.length,
- result = baseAt(array, indexes);
-
- indexes.sort(baseCompareAscending);
- while (length--) {
- var index = parseFloat(indexes[length]);
- if (index != previous && isIndex(index)) {
- var previous = index;
- splice.call(array, index, 1);
- }
- }
- return result;
- }
-
/**
* The base implementation of `_.random` without support for argument juggling
* and returning floating-point numbers.
@@ -2524,7 +2451,7 @@
/**
* The base implementation of `_.reduce` and `_.reduceRight` without support
- * for callback shorthands or `this` binding, which iterates over `collection`
+ * for callback shorthands and `this` binding, which iterates over `collection`
* using the provided `eachFunc`.
*
* @private
@@ -2591,7 +2518,7 @@
/**
* The base implementation of `_.some` without support for callback shorthands
- * or `this` binding.
+ * and `this` binding.
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
@@ -2658,6 +2585,23 @@
});
}
+ /**
+ * The base implementation of `_.sum` without support for callback shorthands
+ * and `this` binding.
+ *
+ * @private
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {number} Returns the sum.
+ */
+ function baseSum(collection, iteratee) {
+ var result = 0;
+ baseEach(collection, function(value, index, collection) {
+ result += +iteratee(value, index, collection) || 0;
+ });
+ return result;
+ }
+
/**
* The base implementation of `_.uniq` without support for callback shorthands
* and `this` binding.
@@ -2731,6 +2675,27 @@
return result;
}
+ /**
+ * The base implementation of `_.dropRightWhile`, `_.dropWhile`, `_.takeRightWhile`,
+ * and `_.takeWhile` without support for callback shorthands and `this` binding.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {Function} predicate The function invoked per iteration.
+ * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseWhile(array, predicate, isDrop, fromRight) {
+ var length = array.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {}
+ return isDrop
+ ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
+ : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
+ }
+
/**
* The base implementation of `wrapperValue` which returns the result of
* performing a sequence of actions on the unwrapped `value`, where each
@@ -2739,7 +2704,7 @@
* @private
* @param {*} value The unwrapped value.
* @param {Array} actions Actions to peform to resolve the unwrapped value.
- * @returns {*} Returns the resolved unwrapped value.
+ * @returns {*} Returns the resolved value.
*/
function baseWrapperValue(value, actions) {
var result = value;
@@ -2766,8 +2731,7 @@
* @private
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
- * @param {boolean} [retHighest] Specify returning the highest, instead
- * of the lowest, index at which a value should be inserted into `array`.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
*/
@@ -2800,8 +2764,7 @@
* @param {Array} array The sorted array to inspect.
* @param {*} value The value to evaluate.
* @param {Function} iteratee The function invoked per iteration.
- * @param {boolean} [retHighest] Specify returning the highest, instead
- * of the lowest, index at which a value should be inserted into `array`.
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
* @returns {number} Returns the index at which `value` should be inserted
* into `array`.
*/
@@ -2967,6 +2930,9 @@
* object composed from the results of running each element in the collection
* through an iteratee.
*
+ * **Note:** This function is used to create `_.countBy`, `_.groupBy`, `_.indexBy`,
+ * and `_.partition`.
+ *
* @private
* @param {Function} setter The function to set keys and values of the accumulator object.
* @param {Function} [initializer] The function to initialize the accumulator object.
@@ -2998,6 +2964,8 @@
* Creates a function that assigns properties of source object(s) to a given
* destination object.
*
+ * **Note:** This function is used to create `_.assign`, `_.defaults`, and `_.merge`.
+ *
* @private
* @param {Function} assigner The function to assign values.
* @returns {Function} Returns the new assigner function.
@@ -3037,6 +3005,56 @@
};
}
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee) {
+ var length = collection ? collection.length : 0;
+ if (!isLength(length)) {
+ return eachFunc(collection, iteratee);
+ }
+ var index = fromRight ? length : -1,
+ iterable = toObject(collection);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
+ }
+ }
+ return collection;
+ };
+ }
+
+ /**
+ * Creates a base function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseFor(fromRight) {
+ return function(object, iteratee, keysFunc) {
+ var iterable = toObject(object),
+ props = keysFunc(object),
+ length = props.length,
+ index = fromRight ? length : -1;
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var key = props[index];
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
+ }
+ }
+ return object;
+ };
+ }
+
/**
* Creates a function that wraps `func` and invokes it with the `this`
* binding of `thisArg`.
@@ -3067,41 +3085,6 @@
return new SetCache(values);
};
- /**
- * Creates a function to compose other functions into a single function.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new composer function.
- */
- function createComposer(fromRight) {
- return function() {
- var length = arguments.length,
- index = length,
- fromIndex = fromRight ? (length - 1) : 0;
-
- if (!length) {
- return function() { return arguments[0]; };
- }
- var funcs = Array(length);
- while (index--) {
- funcs[index] = arguments[index];
- if (typeof funcs[index] != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- }
- return function() {
- var index = fromIndex,
- result = funcs[index].apply(this, arguments);
-
- while ((fromRight ? index-- : ++index < length)) {
- result = funcs[index].call(this, result);
- }
- return result;
- };
- };
- }
-
/**
* Creates a function that produces compound words out of the words in a
* given string.
@@ -3144,7 +3127,26 @@
}
/**
- * Creates a function that gets the extremum value of a collection.
+ * Creates a `_.curry` or `_.curryRight` function.
+ *
+ * @private
+ * @param {boolean} flag The curry bit flag.
+ * @returns {Function} Returns the new curry function.
+ */
+ function createCurry(flag) {
+ function curryFunc(func, arity, guard) {
+ if (guard && isIterateeCall(func, arity, guard)) {
+ arity = null;
+ }
+ var result = createWrapper(func, flag, null, null, null, null, null, arity);
+ result.placeholder = curryFunc.placeholder;
+ return result;
+ }
+ return curryFunc;
+ }
+
+ /**
+ * Creates a `_.max` or `_.min` function.
*
* @private
* @param {Function} arrayFunc The function to get the extremum value from an array.
@@ -3176,6 +3178,204 @@
};
}
+ /**
+ * Creates a `_.find` or `_.findLast` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFind(eachFunc, fromRight) {
+ return function(collection, predicate, thisArg) {
+ predicate = getCallback(predicate, thisArg, 3);
+ if (isArray(collection)) {
+ var index = baseFindIndex(collection, predicate, fromRight);
+ return index > -1 ? collection[index] : undefined;
+ }
+ return baseFind(collection, predicate, eachFunc);
+ }
+ }
+
+ /**
+ * Creates a `_.findIndex` or `_.findLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindIndex(fromRight) {
+ return function(array, predicate, thisArg) {
+ if (!(array && array.length)) {
+ return -1;
+ }
+ predicate = getCallback(predicate, thisArg, 3);
+ return baseFindIndex(array, predicate, fromRight);
+ };
+ }
+
+ /**
+ * Creates a `_.findKey` or `_.findLastKey` function.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new find function.
+ */
+ function createFindKey(objectFunc) {
+ return function(object, predicate, thisArg) {
+ predicate = getCallback(predicate, thisArg, 3);
+ return baseFind(object, predicate, objectFunc, true);
+ };
+ }
+
+ /**
+ * Creates a `_.flow` or `_.flowRight` function.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new flow function.
+ */
+ function createFlow(fromRight) {
+ return function() {
+ var length = arguments.length;
+ if (!length) {
+ return function() { return arguments[0]; };
+ }
+ var wrapper,
+ index = fromRight ? length : -1,
+ leftIndex = 0,
+ funcs = Array(length);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var func = funcs[leftIndex++] = arguments[index];
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ var funcName = wrapper ? '' : getFuncName(func);
+ wrapper = funcName == 'wrapper' ? new LodashWrapper([]) : wrapper;
+ }
+ index = wrapper ? -1 : length;
+ while (++index < length) {
+ func = funcs[index];
+ funcName = getFuncName(func);
+
+ var data = funcName == 'wrapper' ? getData(func) : null;
+ if (data && isLaziable(data[0])) {
+ wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
+ } else {
+ wrapper = (func.length == 1 && isLaziable(func)) ? wrapper[funcName]() : wrapper.thru(func);
+ }
+ }
+ return function() {
+ var args = arguments;
+ if (wrapper && args.length == 1 && isArray(args[0])) {
+ return wrapper.plant(args[0]).value();
+ }
+ var index = 0,
+ result = funcs[index].apply(this, args);
+
+ while (++index < length) {
+ result = funcs[index].call(this, result);
+ }
+ return result;
+ };
+ };
+ }
+
+ /**
+ * Creates a function for `_.forEach` or `_.forEachRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForEach(arrayFunc, eachFunc) {
+ return function(collection, iteratee, thisArg) {
+ return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
+ ? arrayFunc(collection, iteratee)
+ : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
+ };
+ }
+
+ /**
+ * Creates a function for `_.forIn` or `_.forInRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForIn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee, keysIn);
+ };
+ }
+
+ /**
+ * Creates a function for `_.forOwn` or `_.forOwnRight`.
+ *
+ * @private
+ * @param {Function} objectFunc The function to iterate over an object.
+ * @returns {Function} Returns the new each function.
+ */
+ function createForOwn(objectFunc) {
+ return function(object, iteratee, thisArg) {
+ if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
+ iteratee = bindCallback(iteratee, thisArg, 3);
+ }
+ return objectFunc(object, iteratee);
+ };
+ }
+
+ /**
+ * Creates a function for `_.padLeft` or `_.padRight`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify padding from the right.
+ * @returns {Function} Returns the new pad function.
+ */
+ function createPadDir(fromRight) {
+ return function(string, length, chars) {
+ string = baseToString(string);
+ return string && ((fromRight ? string : '') + createPadding(string, length, chars) + (fromRight ? '' : string));
+ };
+ }
+
+ /**
+ * Creates a `_.partial` or `_.partialRight` function.
+ *
+ * @private
+ * @param {boolean} flag The partial bit flag.
+ * @returns {Function} Returns the new partial function.
+ */
+ function createPartial(flag) {
+ var partialFunc = restParam(function(func, partials) {
+ var holders = replaceHolders(partials, partialFunc.placeholder);
+ return createWrapper(func, flag, null, partials, holders);
+ });
+ return partialFunc;
+ }
+
+ /**
+ * Creates a function for `_.reduce` or `_.reduceRight`.
+ *
+ * @private
+ * @param {Function} arrayFunc The function to iterate over an array.
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @returns {Function} Returns the new each function.
+ */
+ function createReduce(arrayFunc, eachFunc) {
+ return function(collection, iteratee, accumulator, thisArg) {
+ var initFromArray = arguments.length < 3;
+ return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
+ ? arrayFunc(collection, iteratee, accumulator, initFromArray)
+ : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
+ };
+ }
+
/**
* Creates a function that wraps `func` and invokes it with optional `this`
* binding of, partial application, and currying.
@@ -3239,7 +3439,12 @@
if (!isCurryBound) {
bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);
}
- var result = createHybridWrapper(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity);
+ var newData = [func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, newArity],
+ result = createHybridWrapper.apply(undefined, newData);
+
+ if (isLaziable(func)) {
+ setData(result, newData);
+ }
result.placeholder = placeholder;
return result;
}
@@ -3261,9 +3466,8 @@
}
/**
- * Creates the pad required for `string` based on the given padding length.
- * The `chars` string may be truncated if the number of padding characters
- * exceeds the padding length.
+ * Creates the padding required for `string` based on the given `length`.
+ * The `chars` string is truncated if the number of characters exceeds `length`.
*
* @private
* @param {string} string The string to create padding for.
@@ -3271,7 +3475,7 @@
* @param {string} [chars=' '] The string used as padding.
* @returns {string} Returns the pad for `string`.
*/
- function createPad(string, length, chars) {
+ function createPadding(string, length, chars) {
var strLength = string.length;
length = +length;
@@ -3320,6 +3524,22 @@
return wrapper;
}
+ /**
+ * Creates a `_.sortedIndex` or `_.sortedLastIndex` function.
+ *
+ * @private
+ * @param {boolean} [retHighest] Specify returning the highest qualified index.
+ * @returns {Function} Returns the new index function.
+ */
+ function createSortedIndex(retHighest) {
+ return function(array, value, iteratee, thisArg) {
+ var func = getCallback(iteratee);
+ return (func === baseCallback && iteratee == null)
+ ? binaryIndex(array, value, retHighest)
+ : binaryIndexBy(array, value, func(iteratee, thisArg, 1), retHighest);
+ };
+ }
+
/**
* Creates a function that either curries or invokes `func` with optional
* `this` binding and partially applied arguments.
@@ -3362,10 +3582,10 @@
partials = holders = null;
}
- var data = !isBindKey && getData(func),
+ var data = isBindKey ? null : getData(func),
newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];
- if (data && data !== true) {
+ if (data) {
mergeData(newData, data);
bitmask = newData[1];
arity = newData[9];
@@ -3394,18 +3614,18 @@
* @param {Array} other The other array to compare.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Function} [customizer] The function to customize comparing arrays.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
- function equalArrays(array, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function equalArrays(array, other, equalFunc, customizer, isLoose, stackA, stackB) {
var index = -1,
arrLength = array.length,
othLength = other.length,
result = true;
- if (arrLength != othLength && !(isWhere && othLength > arrLength)) {
+ if (arrLength != othLength && !(isLoose && othLength > arrLength)) {
return false;
}
// Deep compare the contents, ignoring non-numeric properties.
@@ -3415,23 +3635,23 @@
result = undefined;
if (customizer) {
- result = isWhere
+ result = isLoose
? customizer(othValue, arrValue, index)
: customizer(arrValue, othValue, index);
}
if (typeof result == 'undefined') {
// Recursively compare arrays (susceptible to call stack limits).
- if (isWhere) {
+ if (isLoose) {
var othIndex = othLength;
while (othIndex--) {
othValue = other[othIndex];
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
if (result) {
break;
}
}
} else {
- result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (arrValue && arrValue === othValue) || equalFunc(arrValue, othValue, customizer, isLoose, stackA, stackB);
}
}
}
@@ -3487,26 +3707,26 @@
* @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 values.
- * @param {boolean} [isWhere] Specify performing partial comparisons.
+ * @param {boolean} [isLoose] Specify performing partial comparisons.
* @param {Array} [stackA] Tracks traversed `value` objects.
* @param {Array} [stackB] Tracks traversed `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
- function equalObjects(object, other, equalFunc, customizer, isWhere, stackA, stackB) {
+ function equalObjects(object, other, equalFunc, customizer, isLoose, stackA, stackB) {
var objProps = keys(object),
objLength = objProps.length,
othProps = keys(other),
othLength = othProps.length;
- if (objLength != othLength && !isWhere) {
+ if (objLength != othLength && !isLoose) {
return false;
}
- var hasCtor,
+ var skipCtor = isLoose,
index = -1;
while (++index < objLength) {
var key = objProps[index],
- result = hasOwnProperty.call(other, key);
+ result = isLoose ? key in other : hasOwnProperty.call(other, key);
if (result) {
var objValue = object[key],
@@ -3514,21 +3734,21 @@
result = undefined;
if (customizer) {
- result = isWhere
+ result = isLoose
? customizer(othValue, objValue, key)
: customizer(objValue, othValue, key);
}
if (typeof result == 'undefined') {
// Recursively compare objects (susceptible to call stack limits).
- result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isWhere, stackA, stackB);
+ result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
}
}
if (!result) {
return false;
}
- hasCtor || (hasCtor = key == 'constructor');
+ skipCtor || (skipCtor = key == 'constructor');
}
- if (!hasCtor) {
+ if (!skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
@@ -3546,7 +3766,7 @@
/**
* 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, collection).
+ * The `iteratee` is invoked with three arguments: (value, index, collection).
*
* @private
* @param {Array|Object|string} collection The collection to iterate over.
@@ -3597,6 +3817,37 @@
return metaMap.get(func);
};
+ /**
+ * Gets the name of `func`.
+ *
+ * @private
+ * @param {Function} func The function to query.
+ * @returns {string} Returns the function name.
+ */
+ var getFuncName = (function() {
+ if (!support.funcNames) {
+ return constant('');
+ }
+ if (constant.name == 'constant') {
+ return baseProperty('name');
+ }
+ return function(func) {
+ var result = func.name,
+ array = realNames[result],
+ length = array ? array.length : 0;
+
+ while (length--) {
+ var data = array[length],
+ otherFunc = data.func;
+
+ if (otherFunc == null || otherFunc == func) {
+ return data.name;
+ }
+ }
+ return result;
+ };
+ }());
+
/**
* Gets the appropriate "indexOf" function. If the `_.indexOf` method is
* customized this function returns the custom method, otherwise it returns
@@ -3714,31 +3965,6 @@
return result;
}
- /**
- * Checks if `func` is eligible for `this` binding.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is eligible, else `false`.
- */
- function isBindable(func) {
- var support = lodash.support,
- result = !(support.funcNames ? func.name : support.funcDecomp);
-
- if (!result) {
- var source = fnToString.call(func);
- if (!support.funcNames) {
- result = !reFuncName.test(source);
- }
- if (!result) {
- // Check if `func` references the `this` keyword and store the result.
- result = reThis.test(source) || isNative(func);
- baseSetData(func, result);
- }
- }
- return result;
- }
-
/**
* Checks if `value` is a valid array-like index.
*
@@ -3780,12 +4006,22 @@
return false;
}
+ /**
+ * Checks if `func` has a lazy counterpart.
+ *
+ * @private
+ * @param {Function} func The function to check.
+ * @returns {boolean} Returns `true` if `func` has a lazy counterpart, else `false`.
+ */
+ function isLaziable(func) {
+ var funcName = getFuncName(func);
+ return !!funcName && func === lodash[funcName] && funcName in LazyWrapper.prototype;
+ }
+
/**
* Checks if `value` is a valid array-like length.
*
- * **Note:** This function is based on ES `ToLength`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength)
- * for more details.
+ * **Note:** This function is based on [`ToLength`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength).
*
* @private
* @param {*} value The value to check.
@@ -3825,22 +4061,13 @@
function mergeData(data, source) {
var bitmask = data[1],
srcBitmask = source[1],
- newBitmask = bitmask | srcBitmask;
+ newBitmask = bitmask | srcBitmask,
+ isCommon = newBitmask < ARY_FLAG;
- var arityFlags = ARY_FLAG | REARG_FLAG,
- bindFlags = BIND_FLAG | BIND_KEY_FLAG,
- comboFlags = arityFlags | bindFlags | CURRY_BOUND_FLAG | CURRY_RIGHT_FLAG;
-
- var isAry = bitmask & ARY_FLAG && !(srcBitmask & ARY_FLAG),
- isRearg = bitmask & REARG_FLAG && !(srcBitmask & REARG_FLAG),
- argPos = (isRearg ? data : source)[7],
- ary = (isAry ? data : source)[8];
-
- var isCommon = !(bitmask >= REARG_FLAG && srcBitmask > bindFlags) &&
- !(bitmask > bindFlags && srcBitmask >= REARG_FLAG);
-
- var isCombo = (newBitmask >= arityFlags && newBitmask <= comboFlags) &&
- (bitmask < REARG_FLAG || ((isRearg || isAry) && argPos.length <= ary));
+ var isCombo =
+ (srcBitmask == ARY_FLAG && bitmask == CURRY_FLAG) ||
+ (srcBitmask == ARY_FLAG && bitmask == REARG_FLAG && data[7].length <= source[8]) ||
+ (srcBitmask == (ARY_FLAG | REARG_FLAG) && bitmask == CURRY_FLAG);
// Exit early if metadata can't be merged.
if (!(isCommon || isCombo)) {
@@ -4159,10 +4386,9 @@
* Creates an array excluding all values of the provided arrays using
* `SameValueZero` for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -4175,19 +4401,11 @@
* _.difference([1, 2, 3], [4, 2]);
* // => [1, 3]
*/
- function difference() {
- var args = arguments,
- index = -1,
- length = args.length;
-
- while (++index < length) {
- var value = args[index];
- if (isArray(value) || isArguments(value)) {
- break;
- }
- }
- return baseDifference(value, baseFlatten(args, false, true, ++index));
- }
+ var difference = restParam(function(array, values) {
+ return (isArray(array) || isArguments(array))
+ ? baseDifference(array, baseFlatten(values, false, true))
+ : [];
+ });
/**
* Creates a slice of `array` with `n` elements dropped from the beginning.
@@ -4263,7 +4481,7 @@
/**
* Creates a slice of `array` excluding elements dropped from the end.
* Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, index, array).
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -4310,19 +4528,15 @@
* // => ['barney', 'fred', 'pebbles']
*/
function dropRightWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- predicate = getCallback(predicate, thisArg, 3);
- while (length-- && predicate(array[length], length, array)) {}
- return baseSlice(array, 0, length + 1);
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), true, true)
+ : [];
}
/**
* Creates a slice of `array` excluding elements dropped from the beginning.
* Elements are dropped until `predicate` returns falsey. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, index, array).
+ * bound to `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -4369,14 +4583,9 @@
* // => ['barney', 'fred', 'pebbles']
*/
function dropWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- var index = -1;
- predicate = getCallback(predicate, thisArg, 3);
- while (++index < length && predicate(array[index], index, array)) {}
- return baseSlice(array, index);
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), true)
+ : [];
}
/**
@@ -4393,6 +4602,19 @@
* @param {number} [start=0] The start position.
* @param {number} [end=array.length] The end position.
* @returns {Array} Returns `array`.
+ * @example
+ *
+ * var array = [1, 2, 3];
+ *
+ * _.fill(array, 'a');
+ * console.log(array);
+ * // => ['a', 'a', 'a']
+ *
+ * _.fill(Array(3), 2);
+ * // => [2, 2, 2]
+ *
+ * _.fill([4, 6, 8], '*', 1, 2);
+ * // => [4, '*', 8]
*/
function fill(array, value, start, end) {
var length = array ? array.length : 0;
@@ -4408,7 +4630,7 @@
/**
* This method is like `_.find` except that it returns the index of the first
- * element `predicate` returns truthy for, instead of the element itself.
+ * element `predicate` returns truthy for instead of the element itself.
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -4454,18 +4676,7 @@
* _.findIndex(users, 'active');
* // => 2
*/
- function findIndex(array, predicate, thisArg) {
- var index = -1,
- length = array ? array.length : 0;
-
- predicate = getCallback(predicate, thisArg, 3);
- while (++index < length) {
- if (predicate(array[index], index, array)) {
- return index;
- }
- }
- return -1;
- }
+ var findIndex = createFindIndex();
/**
* This method is like `_.findIndex` except that it iterates over elements
@@ -4515,16 +4726,7 @@
* _.findLastIndex(users, 'active');
* // => 0
*/
- function findLastIndex(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- predicate = getCallback(predicate, thisArg, 3);
- while (length--) {
- if (predicate(array[length], length, array)) {
- return length;
- }
- }
- return -1;
- }
+ var findLastIndex = createFindIndex(true);
/**
* Gets the first element of `array`.
@@ -4561,18 +4763,18 @@
* @example
*
* _.flatten([1, [2, 3, [4]]]);
- * // => [1, 2, 3, [4]];
+ * // => [1, 2, 3, [4]]
*
* // using `isDeep`
* _.flatten([1, [2, 3, [4]]], true);
- * // => [1, 2, 3, 4];
+ * // => [1, 2, 3, 4]
*/
function flatten(array, isDeep, guard) {
var length = array ? array.length : 0;
if (guard && isIterateeCall(array, isDeep, guard)) {
isDeep = false;
}
- return length ? baseFlatten(array, isDeep, false, 0) : [];
+ return length ? baseFlatten(array, isDeep) : [];
}
/**
@@ -4586,11 +4788,11 @@
* @example
*
* _.flattenDeep([1, [2, 3, [4]]]);
- * // => [1, 2, 3, 4];
+ * // => [1, 2, 3, 4]
*/
function flattenDeep(array) {
var length = array ? array.length : 0;
- return length ? baseFlatten(array, true, false, 0) : [];
+ return length ? baseFlatten(array, true) : [];
}
/**
@@ -4599,10 +4801,9 @@
* it is used as the offset from the end of `array`. If `array` is sorted
* providing `true` for `fromIndex` performs a faster binary search.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -4665,10 +4866,9 @@
* Creates an array of unique values in all provided arrays using `SameValueZero`
* for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -4796,10 +4996,10 @@
* comparisons.
*
* **Notes:**
- * - Unlike `_.without`, this method mutates `array`.
- * - `SameValueZero` comparisons are like strict equality comparisons, e.g. `===`,
- * except that `NaN` matches `NaN`. See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * - Unlike `_.without`, this method mutates `array`
+ * - [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except
+ * that `NaN` matches `NaN`
*
* @static
* @memberOf _
@@ -4862,14 +5062,28 @@
* console.log(evens);
* // => [10, 20]
*/
- function pullAt(array) {
- return basePullAt(array || [], baseFlatten(arguments, false, false, 1));
- }
+ var pullAt = restParam(function(array, indexes) {
+ array || (array = []);
+ indexes = baseFlatten(indexes);
+
+ var length = indexes.length,
+ result = baseAt(array, indexes);
+
+ indexes.sort(baseCompareAscending);
+ while (length--) {
+ var index = parseFloat(indexes[length]);
+ if (index != previous && isIndex(index)) {
+ var previous = index;
+ splice.call(array, index, 1);
+ }
+ }
+ return result;
+ });
/**
* Removes all elements from `array` that `predicate` returns truthy for
* and returns an array of the removed elements. The predicate is bound to
- * `thisArg` and invoked with three arguments; (value, index, array).
+ * `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -4973,14 +5187,14 @@
* to compute their sort ranking. The iteratee is bound to `thisArg` and
* invoked with one argument; (value).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -5014,12 +5228,7 @@
* _.sortedIndex([{ 'x': 30 }, { 'x': 50 }], { 'x': 40 }, 'x');
* // => 1
*/
- function sortedIndex(array, value, iteratee, thisArg) {
- var func = getCallback(iteratee);
- return (func === baseCallback && iteratee == null)
- ? binaryIndex(array, value)
- : binaryIndexBy(array, value, func(iteratee, thisArg, 1));
- }
+ var sortedIndex = createSortedIndex();
/**
* This method is like `_.sortedIndex` except that it returns the highest
@@ -5041,12 +5250,7 @@
* _.sortedLastIndex([4, 4, 5, 5], 5);
* // => 4
*/
- function sortedLastIndex(array, value, iteratee, thisArg) {
- var func = getCallback(iteratee);
- return (func === baseCallback && iteratee == null)
- ? binaryIndex(array, value, true)
- : binaryIndexBy(array, value, func(iteratee, thisArg, 1), true);
- }
+ var sortedLastIndex = createSortedIndex(true);
/**
* Creates a slice of `array` with `n` elements taken from the beginning.
@@ -5122,7 +5326,7 @@
/**
* Creates a slice of `array` with elements taken from the end. Elements are
* taken until `predicate` returns falsey. The predicate is bound to `thisArg`
- * and invoked with three arguments; (value, index, array).
+ * and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -5169,19 +5373,15 @@
* // => []
*/
function takeRightWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- predicate = getCallback(predicate, thisArg, 3);
- while (length-- && predicate(array[length], length, array)) {}
- return baseSlice(array, length + 1);
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3), false, true)
+ : [];
}
/**
* Creates a slice of `array` with elements taken from the beginning. Elements
* are taken until `predicate` returns falsey. The predicate is bound to
- * `thisArg` and invoked with three arguments; (value, index, array).
+ * `thisArg` and invoked with three arguments: (value, index, array).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -5228,24 +5428,18 @@
* // => []
*/
function takeWhile(array, predicate, thisArg) {
- var length = array ? array.length : 0;
- if (!length) {
- return [];
- }
- var index = -1;
- predicate = getCallback(predicate, thisArg, 3);
- while (++index < length && predicate(array[index], index, array)) {}
- return baseSlice(array, 0, index);
+ return (array && array.length)
+ ? baseWhile(array, getCallback(predicate, thisArg, 3))
+ : [];
}
/**
* Creates an array of unique values, in order, of the provided arrays using
* `SameValueZero` for equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -5257,9 +5451,9 @@
* _.union([1, 2], [4, 2], [2, 1]);
* // => [1, 2, 4]
*/
- function union() {
- return baseUniq(baseFlatten(arguments, false, true, 0));
- }
+ var union = restParam(function(arrays) {
+ return baseUniq(baseFlatten(arrays, false, true));
+ });
/**
* Creates a duplicate-value-free version of an array using `SameValueZero`
@@ -5267,23 +5461,22 @@
* search algorithm for sorted arrays. If an iteratee function is provided it
* is invoked for each value in the array to generate the criterion by which
* uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked
- * with three arguments; (value, index, array).
+ * with three arguments: (value, index, array).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -5365,10 +5558,9 @@
* Creates an array excluding all provided values using `SameValueZero` for
* equality comparisons.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -5381,14 +5573,15 @@
* _.without([1, 2, 1, 3], 1, 2);
* // => [3]
*/
- function without(array) {
- return baseDifference(array, baseSlice(arguments, 1));
- }
+ var without = restParam(function(array, values) {
+ return (isArray(array) || isArguments(array))
+ ? baseDifference(array, values)
+ : [];
+ });
/**
- * Creates an array that is the symmetric difference of the provided arrays.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Symmetric_difference) for
- * more details.
+ * Creates an array that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
+ * of the provided arrays.
*
* @static
* @memberOf _
@@ -5430,20 +5623,13 @@
* _.zip(['fred', 'barney'], [30, 40], [true, false]);
* // => [['fred', 30, true], ['barney', 40, false]]
*/
- function zip() {
- var length = arguments.length,
- array = Array(length);
-
- while (length--) {
- array[length] = arguments[length];
- }
- return unzip(array);
- }
+ var zip = restParam(unzip);
/**
- * Creates an object composed from arrays of property names and values. Provide
- * either a single two dimensional array, e.g. `[[key1, value1], [key2, value2]]`
- * or two arrays, one of property names and one of corresponding values.
+ * The inverse of `_.pairs`; this method returns an object composed from arrays
+ * of property names and values. Provide either a single two dimensional array,
+ * e.g. `[[key1, value1], [key2, value2]]` or two arrays, one of property names
+ * and one of corresponding values.
*
* @static
* @memberOf _
@@ -5454,6 +5640,9 @@
* @returns {Object} Returns the new object.
* @example
*
+ * _.zipObject([['fred', 30], ['barney', 40]]);
+ * // => { 'fred': 30, 'barney': 40 }
+ *
* _.zipObject(['fred', 'barney'], [30, 40]);
* // => { 'fred': 30, 'barney': 40 }
*/
@@ -5550,13 +5739,14 @@
* @returns {*} Returns the result of `interceptor`.
* @example
*
- * _([1, 2, 3])
- * .last()
+ * _(' abc ')
+ * .chain()
+ * .trim()
* .thru(function(value) {
* return [value];
* })
* .value();
- * // => [3]
+ * // => ['abc']
*/
function thru(value, interceptor, thisArg) {
return interceptor.call(thisArg, value);
@@ -5746,32 +5936,32 @@
* _.at(['a', 'b', 'c'], [0, 2]);
* // => ['a', 'c']
*
- * _.at(['fred', 'barney', 'pebbles'], 0, 2);
- * // => ['fred', 'pebbles']
+ * _.at(['barney', 'fred', 'pebbles'], 0, 2);
+ * // => ['barney', 'pebbles']
*/
- function at(collection) {
+ var at = restParam(function(collection, props) {
var length = collection ? collection.length : 0;
if (isLength(length)) {
collection = toIterable(collection);
}
- return baseAt(collection, baseFlatten(arguments, false, false, 1));
- }
+ return baseAt(collection, baseFlatten(props));
+ });
/**
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is the number of times the key was returned by `iteratee`.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -5804,7 +5994,7 @@
/**
* Checks if `predicate` returns truthy for **all** elements of `collection`.
- * The predicate is bound to `thisArg` and invoked with three arguments;
+ * The predicate is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
@@ -5852,6 +6042,9 @@
*/
function every(collection, predicate, thisArg) {
var func = isArray(collection) ? arrayEvery : baseEvery;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = null;
+ }
if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
predicate = getCallback(predicate, thisArg, 3);
}
@@ -5861,7 +6054,7 @@
/**
* Iterates over elements of `collection`, returning an array of all elements
* `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
+ * invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -5916,7 +6109,7 @@
/**
* Iterates over elements of `collection`, returning the first element
* `predicate` returns truthy for. The predicate is bound to `thisArg` and
- * invoked with three arguments; (value, index|key, collection).
+ * invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -5963,14 +6156,7 @@
* _.result(_.find(users, 'active'), 'user');
* // => 'barney'
*/
- function find(collection, predicate, thisArg) {
- if (isArray(collection)) {
- var index = findIndex(collection, predicate, thisArg);
- return index > -1 ? collection[index] : undefined;
- }
- predicate = getCallback(predicate, thisArg, 3);
- return baseFind(collection, predicate, baseEach);
- }
+ var find = createFind(baseEach);
/**
* This method is like `_.find` except that it iterates over elements of
@@ -5991,10 +6177,7 @@
* });
* // => 3
*/
- function findLast(collection, predicate, thisArg) {
- predicate = getCallback(predicate, thisArg, 3);
- return baseFind(collection, predicate, baseEachRight);
- }
+ var findLast = createFind(baseEachRight, true);
/**
* Performs a deep comparison between each element in `collection` and the
@@ -6031,7 +6214,7 @@
/**
* Iterates over elements of `collection` invoking `iteratee` for each element.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection). Iterator functions may exit iteration early
* by explicitly returning `false`.
*
@@ -6059,11 +6242,7 @@
* });
* // => logs each value-key pair and returns the object (iteration order is not guaranteed)
*/
- function forEach(collection, iteratee, thisArg) {
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
- ? arrayEach(collection, iteratee)
- : baseEach(collection, bindCallback(iteratee, thisArg, 3));
- }
+ var forEach = createForEach(arrayEach, baseEach);
/**
* This method is like `_.forEach` except that it iterates over elements of
@@ -6081,30 +6260,26 @@
*
* _([1, 2]).forEachRight(function(n) {
* console.log(n);
- * }).join(',');
+ * }).value();
* // => logs each value from right to left and returns the array
*/
- function forEachRight(collection, iteratee, thisArg) {
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
- ? arrayEachRight(collection, iteratee)
- : baseEachRight(collection, bindCallback(iteratee, thisArg, 3));
- }
+ var forEachRight = createForEach(arrayEachRight, baseEachRight);
/**
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is an array of the elements responsible for generating the key.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -6145,10 +6320,9 @@
* comparisons. If `fromIndex` is negative, it is used as the offset from
* the end of `collection`.
*
- * **Note:** `SameValueZero` comparisons are like strict equality comparisons,
- * e.g. `===`, except that `NaN` matches `NaN`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
- * for more details.
+ * **Note:** [`SameValueZero`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero)
+ * comparisons are like strict equality comparisons, e.g. `===`, except that
+ * `NaN` matches `NaN`.
*
* @static
* @memberOf _
@@ -6157,6 +6331,7 @@
* @param {Array|Object|string} collection The collection to search.
* @param {*} target The value to search for.
* @param {number} [fromIndex=0] The index to search from.
+ * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
* @returns {boolean} Returns `true` if a matching element is found, else `false`.
* @example
*
@@ -6172,7 +6347,7 @@
* _.includes('pebbles', 'eb');
* // => true
*/
- function includes(collection, target, fromIndex) {
+ function includes(collection, target, fromIndex, guard) {
var length = collection ? collection.length : 0;
if (!isLength(length)) {
collection = values(collection);
@@ -6181,10 +6356,10 @@
if (!length) {
return false;
}
- if (typeof fromIndex == 'number') {
- fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
- } else {
+ if (typeof fromIndex != 'number' || (guard && isIterateeCall(target, fromIndex, guard))) {
fromIndex = 0;
+ } else {
+ fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : (fromIndex || 0);
}
return (typeof collection == 'string' || !isArray(collection) && isString(collection))
? (fromIndex < length && collection.indexOf(target, fromIndex) > -1)
@@ -6195,17 +6370,17 @@
* Creates an object composed of keys generated from the results of running
* each element of `collection` through `iteratee`. The corresponding value
* of each key is the last element responsible for generating the key. The
- * iteratee function is bound to `thisArg` and invoked with three arguments;
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -6263,23 +6438,32 @@
* _.invoke([123, 456], String.prototype.split, '');
* // => [['1', '2', '3'], ['4', '5', '6']]
*/
- function invoke(collection, methodName) {
- return baseInvoke(collection, methodName, baseSlice(arguments, 2));
- }
+ var invoke = restParam(function(collection, methodName, args) {
+ var index = -1,
+ isFunc = typeof methodName == 'function',
+ length = collection ? collection.length : 0,
+ result = isLength(length) ? Array(length) : [];
+
+ baseEach(collection, function(value) {
+ var func = isFunc ? methodName : (value != null && value[methodName]);
+ result[++index] = func ? func.apply(value, args) : undefined;
+ });
+ return result;
+ });
/**
* Creates an array of values by running each element in `collection` through
* `iteratee`. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index|key, collection).
+ * arguments: (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -6288,9 +6472,9 @@
*
* The guarded methods are:
* `ary`, `callback`, `chunk`, `clone`, `create`, `curry`, `curryRight`, `drop`,
- * `dropRight`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`, `slice`,
- * `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`, `trimRight`,
- * `trunc`, `random`, `range`, `sample`, `uniq`, and `words`
+ * `dropRight`, `every`, `fill`, `flatten`, `invert`, `max`, `min`, `parseInt`,
+ * `slice`, `sortBy`, `take`, `takeRight`, `template`, `trim`, `trimLeft`,
+ * `trimRight`, `trunc`, `random`, `range`, `sample`, `some`, `uniq`, and `words`
*
* @static
* @memberOf _
@@ -6333,7 +6517,7 @@
* Creates an array of elements split into two groups, the first of which
* contains elements `predicate` returns truthy for, while the second of which
* contains elements `predicate` returns falsey for. The predicate is bound
- * to `thisArg` and invoked with three arguments; (value, index|key, collection).
+ * to `thisArg` and invoked with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -6424,14 +6608,14 @@
* each element in `collection` through `iteratee`, where each successive
* invocation is supplied the return value of the previous. If `accumulator`
* is not provided the first element of `collection` is used as the initial
- * value. The `iteratee` is bound to `thisArg`and invoked with four arguments;
+ * value. The `iteratee` is bound to `thisArg` and invoked with four arguments:
* (accumulator, value, index|key, collection).
*
* Many lodash methods are guarded to work as interatees for methods like
* `_.reduce`, `_.reduceRight`, and `_.transform`.
*
* The guarded methods are:
- * `assign`, `defaults`, `merge`, and `sortAllBy`
+ * `assign`, `defaults`, `includes`, `merge`, `sortByAll`, and `sortByOrder`
*
* @static
* @memberOf _
@@ -6455,10 +6639,7 @@
* }, {});
* // => { 'a': 3, 'b': 6 } (iteration order is not guaranteed)
*/
- function reduce(collection, iteratee, accumulator, thisArg) {
- var func = isArray(collection) ? arrayReduce : baseReduce;
- return func(collection, getCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEach);
- }
+ var reduce = createReduce(arrayReduce, baseEach);
/**
* This method is like `_.reduce` except that it iterates over elements of
@@ -6482,10 +6663,7 @@
* }, []);
* // => [4, 5, 2, 3, 0, 1]
*/
- function reduceRight(collection, iteratee, accumulator, thisArg) {
- var func = isArray(collection) ? arrayReduceRight : baseReduce;
- return func(collection, getCallback(iteratee, thisArg, 4), accumulator, arguments.length < 3, baseEachRight);
- }
+ var reduceRight = createReduce(arrayReduceRight, baseEachRight);
/**
* The opposite of `_.filter`; this method returns the elements of `collection`
@@ -6572,9 +6750,8 @@
}
/**
- * Creates an array of shuffled values, using a version of the Fisher-Yates
- * shuffle. See [Wikipedia](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle)
- * for more details.
+ * Creates an array of shuffled values, using a version of the
+ * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
*
* @static
* @memberOf _
@@ -6632,7 +6809,7 @@
* Checks if `predicate` returns truthy for **any** element of `collection`.
* The function returns as soon as it finds a passing value and does not iterate
* over the entire collection. The predicate is bound to `thisArg` and invoked
- * with three arguments; (value, index|key, collection).
+ * with three arguments: (value, index|key, collection).
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -6679,6 +6856,9 @@
*/
function some(collection, predicate, thisArg) {
var func = isArray(collection) ? arraySome : baseSome;
+ if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
+ predicate = null;
+ }
if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
predicate = getCallback(predicate, thisArg, 3);
}
@@ -6689,17 +6869,17 @@
* Creates an array of elements, sorted in ascending order by the results of
* running each element in a collection through `iteratee`. This method performs
* a stable sort, that is, it preserves the original sort order of equal elements.
- * The `iteratee` is bound to `thisArg` and invoked with three arguments;
+ * The `iteratee` is bound to `thisArg` and invoked with three arguments:
* (value, index|key, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -6775,17 +6955,24 @@
* _.map(_.sortByAll(users, ['user', 'age']), _.values);
* // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
*/
- function sortByAll(collection) {
+ function sortByAll() {
+ var args = arguments,
+ collection = args[0],
+ guard = args[3],
+ index = 0,
+ length = args.length - 1;
+
if (collection == null) {
return [];
}
- var args = arguments,
- guard = args[3];
-
- if (guard && isIterateeCall(args[1], args[2], guard)) {
- args = [collection, args[1]];
+ var props = Array(length);
+ while (index < length) {
+ props[index] = args[++index];
}
- return baseSortByOrder(collection, baseFlatten(args, false, false, 1), []);
+ if (guard && isIterateeCall(args[1], args[2], guard)) {
+ props = args[1];
+ }
+ return baseSortByOrder(collection, baseFlatten(props), []);
}
/**
@@ -7004,7 +7191,7 @@
* @category Function
* @param {Function} func The function to bind.
* @param {*} thisArg The `this` binding of `func`.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
@@ -7023,16 +7210,14 @@
* bound('hi');
* // => 'hi fred!'
*/
- function bind(func, thisArg) {
+ var bind = restParam(function(func, thisArg, partials) {
var bitmask = BIND_FLAG;
- if (arguments.length > 2) {
- var partials = baseSlice(arguments, 2),
- holders = replaceHolders(partials, bind.placeholder);
-
+ if (partials.length) {
+ var holders = replaceHolders(partials, bind.placeholder);
bitmask |= PARTIAL_FLAG;
}
return createWrapper(func, bitmask, thisArg, partials, holders);
- }
+ });
/**
* Binds methods of an object to the object itself, overwriting the existing
@@ -7062,13 +7247,18 @@
* jQuery('#docs').on('click', view.onClick);
* // => logs 'clicked docs' when the element is clicked
*/
- function bindAll(object) {
- return baseBindAll(object,
- arguments.length > 1
- ? baseFlatten(arguments, false, false, 1)
- : functions(object)
- );
- }
+ var bindAll = restParam(function(object, methodNames) {
+ methodNames = methodNames.length ? baseFlatten(methodNames) : functions(object);
+
+ var index = -1,
+ length = methodNames.length;
+
+ while (++index < length) {
+ var key = methodNames[index];
+ object[key] = createWrapper(object[key], BIND_FLAG, object);
+ }
+ return object;
+ });
/**
* Creates a function that invokes the method at `object[key]` and prepends
@@ -7087,7 +7277,7 @@
* @category Function
* @param {Object} object The object the method belongs to.
* @param {string} key The key of the method.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new bound function.
* @example
*
@@ -7114,16 +7304,14 @@
* bound('hi');
* // => 'hiya fred!'
*/
- function bindKey(object, key) {
+ var bindKey = restParam(function(object, key, partials) {
var bitmask = BIND_FLAG | BIND_KEY_FLAG;
- if (arguments.length > 2) {
- var partials = baseSlice(arguments, 2),
- holders = replaceHolders(partials, bindKey.placeholder);
-
+ if (partials.length) {
+ var holders = replaceHolders(partials, bindKey.placeholder);
bitmask |= PARTIAL_FLAG;
}
return createWrapper(key, bitmask, object, partials, holders);
- }
+ });
/**
* Creates a function that accepts one or more arguments of `func` that when
@@ -7165,14 +7353,7 @@
* curried(1)(_, 3)(2);
* // => [1, 2, 3]
*/
- function curry(func, arity, guard) {
- if (guard && isIterateeCall(func, arity, guard)) {
- arity = null;
- }
- var result = createWrapper(func, CURRY_FLAG, null, null, null, null, null, arity);
- result.placeholder = curry.placeholder;
- return result;
- }
+ var curry = createCurry(CURRY_FLAG);
/**
* This method is like `_.curry` except that arguments are applied to `func`
@@ -7211,14 +7392,7 @@
* curried(3)(1, _)(2);
* // => [1, 2, 3]
*/
- function curryRight(func, arity, guard) {
- if (guard && isIterateeCall(func, arity, guard)) {
- arity = null;
- }
- var result = createWrapper(func, CURRY_RIGHT_FLAG, null, null, null, null, null, arity);
- result.placeholder = curryRight.placeholder;
- return result;
- }
+ var curryRight = createCurry(CURRY_RIGHT_FLAG);
/**
* Creates a function that delays invoking `func` until after `wait` milliseconds
@@ -7413,9 +7587,9 @@
* }, 'deferred');
* // logs 'deferred' after one or more milliseconds
*/
- function defer(func) {
- return baseDelay(func, 1, arguments, 1);
- }
+ var defer = restParam(function(func, args) {
+ return baseDelay(func, 1, args);
+ });
/**
* Invokes `func` after `wait` milliseconds. Any additional arguments are
@@ -7435,9 +7609,9 @@
* }, 1000, 'later');
* // => logs 'later' after one second
*/
- function delay(func, wait) {
- return baseDelay(func, wait, arguments, 2);
- }
+ var delay = restParam(function(func, wait, args) {
+ return baseDelay(func, wait, args);
+ });
/**
* Creates a function that returns the result of invoking the provided
@@ -7459,7 +7633,7 @@
* addSquare(1, 2);
* // => 9
*/
- var flow = createComposer();
+ var flow = createFlow();
/**
* This method is like `_.flow` except that it creates a function that
@@ -7481,7 +7655,7 @@
* addSquare(1, 2);
* // => 9
*/
- var flowRight = createComposer(true);
+ var flowRight = createFlow(true);
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
@@ -7493,10 +7667,8 @@
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the ES `Map` method interface
- * of `get`, `has`, and `set`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)
- * for more details.
+ * constructor with one whose instances implement the [`Map`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-properties-of-the-map-prototype-object)
+ * method interface of `get`, `has`, and `set`.
*
* @static
* @memberOf _
@@ -7587,7 +7759,7 @@
/**
* Creates a function that is restricted to invoking `func` once. Repeat calls
* to the function return the value of the first call. The `func` is invoked
- * with the `this` binding of the created function.
+ * with the `this` binding and arguments of the created function.
*
* @static
* @memberOf _
@@ -7620,7 +7792,7 @@
* @memberOf _
* @category Function
* @param {Function} func The function to partially apply arguments to.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
@@ -7637,12 +7809,7 @@
* greetFred('hi');
* // => 'hi fred'
*/
- function partial(func) {
- var partials = baseSlice(arguments, 1),
- holders = replaceHolders(partials, partial.placeholder);
-
- return createWrapper(func, PARTIAL_FLAG, null, partials, holders);
- }
+ var partial = createPartial(PARTIAL_FLAG);
/**
* This method is like `_.partial` except that partially applied arguments
@@ -7658,7 +7825,7 @@
* @memberOf _
* @category Function
* @param {Function} func The function to partially apply arguments to.
- * @param {...*} [args] The arguments to be partially applied.
+ * @param {...*} [partials] The arguments to be partially applied.
* @returns {Function} Returns the new partially applied function.
* @example
*
@@ -7675,12 +7842,7 @@
* sayHelloTo('fred');
* // => 'hello fred'
*/
- function partialRight(func) {
- var partials = baseSlice(arguments, 1),
- holders = replaceHolders(partials, partialRight.placeholder);
-
- return createWrapper(func, PARTIAL_RIGHT_FLAG, null, partials, holders);
- }
+ var partialRight = createPartial(PARTIAL_RIGHT_FLAG);
/**
* Creates a function that invokes `func` with arguments arranged according
@@ -7710,29 +7872,80 @@
* }, [1, 2, 3]);
* // => [3, 6, 9]
*/
- function rearg(func) {
- var indexes = baseFlatten(arguments, false, false, 1);
- return createWrapper(func, REARG_FLAG, null, null, null, indexes);
- }
+ var rearg = restParam(function(func, indexes) {
+ return createWrapper(func, REARG_FLAG, null, null, null, baseFlatten(indexes));
+ });
/**
* Creates a function that invokes `func` with the `this` binding of the
- * created function and the array of arguments provided to the created
- * function much like [Function#apply](http://es5.github.io/#x15.3.4.3).
+ * created function and arguments from `start` and beyond provided as an array.
+ *
+ * **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.restParam(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
+ function restParam(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
+ }
+ start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ rest = Array(length);
+
+ while (++index < length) {
+ rest[index] = args[start + index];
+ }
+ switch (start) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, args[0], rest);
+ case 2: return func.call(this, args[0], args[1], rest);
+ }
+ var otherArgs = Array(start + 1);
+ index = -1;
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = rest;
+ return func.apply(this, otherArgs);
+ };
+ }
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the created
+ * function and an array of arguments much like [`Function#apply`](https://es5.github.io/#x15.3.4.3).
+ *
+ * **Note:** This method is based on the [spread operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator).
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to spread arguments over.
- * @returns {*} Returns the new function.
+ * @returns {Function} Returns the new function.
* @example
*
- * var spread = _.spread(function(who, what) {
+ * var say = _.spread(function(who, what) {
* return who + ' says ' + what;
* });
*
- * spread(['Fred', 'hello']);
- * // => 'Fred says hello'
+ * say(['fred', 'hello']);
+ * // => 'fred says hello'
*
* // with a Promise
* var numbers = Promise.all([
@@ -7847,12 +8060,12 @@
* cloning is handled by the method instead. The `customizer` is bound to
* `thisArg` and invoked with two argument; (value [, index|key, object]).
*
- * **Note:** This method is loosely based on the structured clone algorithm.
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
* The enumerable properties of `arguments` objects and objects created by
* constructors other than `Object` are cloned to plain `Object` objects. An
* empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)
- * for more details.
+ * Maps, Sets, and WeakMaps.
*
* @static
* @memberOf _
@@ -7910,12 +8123,12 @@
* is handled by the method instead. The `customizer` is bound to `thisArg`
* and invoked with two argument; (value [, index|key, object]).
*
- * **Note:** This method is loosely based on the structured clone algorithm.
+ * **Note:** This method is loosely based on the
+ * [structured clone algorithm](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm).
* The enumerable properties of `arguments` objects and objects created by
* constructors other than `Object` are cloned to plain `Object` objects. An
* empty object is returned for uncloneable values such as functions, DOM nodes,
- * Maps, Sets, and WeakMaps. See the [HTML5 specification](http://www.w3.org/TR/html5/infrastructure.html#internal-structured-cloning-algorithm)
- * for more details.
+ * Maps, Sets, and WeakMaps.
*
* @static
* @memberOf _
@@ -7972,7 +8185,7 @@
*/
function isArguments(value) {
var length = isObjectLike(value) ? value.length : undefined;
- return (isLength(length) && objToString.call(value) == argsTag) || false;
+ return isLength(length) && objToString.call(value) == argsTag;
}
/**
@@ -7992,7 +8205,7 @@
* // => false
*/
var isArray = nativeIsArray || function(value) {
- return (isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag) || false;
+ return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
};
/**
@@ -8012,7 +8225,7 @@
* // => false
*/
function isBoolean(value) {
- return (value === true || value === false || isObjectLike(value) && objToString.call(value) == boolTag) || false;
+ return value === true || value === false || (isObjectLike(value) && objToString.call(value) == boolTag);
}
/**
@@ -8032,7 +8245,7 @@
* // => false
*/
function isDate(value) {
- return (isObjectLike(value) && objToString.call(value) == dateTag) || false;
+ return isObjectLike(value) && objToString.call(value) == dateTag;
}
/**
@@ -8052,13 +8265,13 @@
* // => false
*/
function isElement(value) {
- return (value && value.nodeType === 1 && isObjectLike(value) &&
- (objToString.call(value).indexOf('Element') > -1)) || false;
+ return !!value && value.nodeType === 1 && isObjectLike(value) &&
+ (objToString.call(value).indexOf('Element') > -1);
}
// Fallback for environments without DOM support.
if (!support.dom) {
isElement = function(value) {
- return (value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value)) || false;
+ return !!value && value.nodeType === 1 && isObjectLike(value) && !isPlainObject(value);
};
}
@@ -8106,7 +8319,7 @@
* equivalent. If `customizer` is provided it is invoked to compare values.
* If `customizer` returns `undefined` comparisons are handled by the method
* instead. The `customizer` is bound to `thisArg` and invoked with three
- * arguments; (value, other [, index|key]).
+ * arguments: (value, other [, index|key]).
*
* **Note:** This method supports comparing arrays, booleans, `Date` objects,
* numbers, `Object` objects, regexes, and strings. Objects are compared by
@@ -8171,15 +8384,13 @@
* // => false
*/
function isError(value) {
- return (isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag) || false;
+ return isObjectLike(value) && typeof value.message == 'string' && objToString.call(value) == errorTag;
}
/**
* Checks if `value` is a finite primitive number.
*
- * **Note:** This method is based on ES `Number.isFinite`. See the
- * [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite)
- * for more details.
+ * **Note:** This method is based on [`Number.isFinite`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-number.isfinite).
*
* @static
* @memberOf _
@@ -8231,11 +8442,9 @@
};
/**
- * Checks if `value` is the language type of `Object`.
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
- * **Note:** See the [ES5 spec](https://es5.github.io/#x8) for more details.
- *
* @static
* @memberOf _
* @category Lang
@@ -8256,7 +8465,7 @@
// Avoid a V8 JIT bug in Chrome 19-20.
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
var type = typeof value;
- return type == 'function' || (value && type == 'object') || false;
+ return type == 'function' || (!!value && type == 'object');
}
/**
@@ -8264,7 +8473,7 @@
* `object` contains equivalent property values. If `customizer` is provided
* it is invoked to compare values. If `customizer` returns `undefined`
* comparisons are handled by the method instead. The `customizer` is bound
- * to `thisArg` and invoked with three arguments; (value, other, index|key).
+ * to `thisArg` and invoked with three arguments: (value, other, index|key).
*
* **Note:** This method supports comparing properties of arrays, booleans,
* `Date` objects, numbers, `Object` objects, regexes, and strings. Functions
@@ -8302,13 +8511,19 @@
var props = keys(source),
length = props.length;
+ if (!length) {
+ return true;
+ }
+ if (object == null) {
+ return false;
+ }
customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
if (!customizer && length == 1) {
var key = props[0],
value = source[key];
if (isStrictComparable(value)) {
- return object != null && value === object[key] && hasOwnProperty.call(object, key);
+ return value === object[key] && (typeof value != 'undefined' || (key in toObject(object)));
}
}
var values = Array(length),
@@ -8318,15 +8533,14 @@
value = values[length] = source[props[length]];
strictCompareFlags[length] = isStrictComparable(value);
}
- return baseIsMatch(object, props, values, strictCompareFlags, customizer);
+ return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer);
}
/**
* Checks if `value` is `NaN`.
*
- * **Note:** This method is not the same as native `isNaN` which returns `true`
- * for `undefined` and other non-numeric values. See the [ES5 spec](https://es5.github.io/#x15.1.2.4)
- * for more details.
+ * **Note:** This method is not the same as [`isNaN`](https://es5.github.io/#x15.1.2.4)
+ * which returns `true` for `undefined` and other non-numeric values.
*
* @static
* @memberOf _
@@ -8376,7 +8590,7 @@
if (objToString.call(value) == funcTag) {
return reNative.test(fnToString.call(value));
}
- return (isObjectLike(value) && reHostCtor.test(value)) || false;
+ return isObjectLike(value) && reHostCtor.test(value);
}
/**
@@ -8422,7 +8636,7 @@
* // => false
*/
function isNumber(value) {
- return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag) || false;
+ return typeof value == 'number' || (isObjectLike(value) && objToString.call(value) == numberTag);
}
/**
@@ -8504,7 +8718,7 @@
* // => false
*/
function isString(value) {
- return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag) || false;
+ return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
}
/**
@@ -8524,7 +8738,7 @@
* // => false
*/
function isTypedArray(value) {
- return (isObjectLike(value) && isLength(value.length) && typedArrayTags[objToString.call(value)]) || false;
+ return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
}
/**
@@ -8606,7 +8820,7 @@
* Assigns own enumerable properties of source object(s) to the destination
* object. Subsequent sources overwrite property assignments of previous sources.
* If `customizer` is provided it is invoked to produce the assigned values.
- * The `customizer` is bound to `thisArg` and invoked with five arguments;
+ * The `customizer` is bound to `thisArg` and invoked with five arguments:
* (objectValue, sourceValue, key, object, source).
*
* @static
@@ -8691,18 +8905,18 @@
* _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
* // => { 'user': 'barney', 'age': 36 }
*/
- function defaults(object) {
+ var defaults = restParam(function(args) {
+ var object = args[0];
if (object == null) {
return object;
}
- var args = arrayCopy(arguments);
args.push(assignDefaults);
return assign.apply(undefined, args);
- }
+ });
/**
- * This method is like `_.findIndex` except that it returns the key of the
- * first element `predicate` returns truthy for, instead of the element itself.
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -8748,10 +8962,7 @@
* _.findKey(users, 'active');
* // => 'barney'
*/
- function findKey(object, predicate, thisArg) {
- predicate = getCallback(predicate, thisArg, 3);
- return baseFind(object, predicate, baseForOwn, true);
- }
+ var findKey = createFindKey(baseForOwn);
/**
* This method is like `_.findKey` except that it iterates over elements of
@@ -8801,15 +9012,12 @@
* _.findLastKey(users, 'active');
* // => 'pebbles'
*/
- function findLastKey(object, predicate, thisArg) {
- predicate = getCallback(predicate, thisArg, 3);
- return baseFind(object, predicate, baseForOwnRight, true);
- }
+ var findLastKey = createFindKey(baseForOwnRight);
/**
* Iterates over own and inherited enumerable properties of an object invoking
* `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
- * with three arguments; (value, key, object). Iterator functions may exit
+ * with three arguments: (value, key, object). Iterator functions may exit
* iteration early by explicitly returning `false`.
*
* @static
@@ -8833,12 +9041,7 @@
* });
* // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
*/
- function forIn(object, iteratee, thisArg) {
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
- iteratee = bindCallback(iteratee, thisArg, 3);
- }
- return baseFor(object, iteratee, keysIn);
- }
+ var forIn = createForIn(baseFor);
/**
* This method is like `_.forIn` except that it iterates over properties of
@@ -8865,15 +9068,12 @@
* });
* // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
*/
- function forInRight(object, iteratee, thisArg) {
- iteratee = bindCallback(iteratee, thisArg, 3);
- return baseForRight(object, iteratee, keysIn);
- }
+ var forInRight = createForIn(baseForRight);
/**
* Iterates over own enumerable properties of an object invoking `iteratee`
* for each property. The `iteratee` is bound to `thisArg` and invoked with
- * three arguments; (value, key, object). Iterator functions may exit iteration
+ * three arguments: (value, key, object). Iterator functions may exit iteration
* early by explicitly returning `false`.
*
* @static
@@ -8897,12 +9097,7 @@
* });
* // => logs 'a' and 'b' (iteration order is not guaranteed)
*/
- function forOwn(object, iteratee, thisArg) {
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
- iteratee = bindCallback(iteratee, thisArg, 3);
- }
- return baseForOwn(object, iteratee);
- }
+ var forOwn = createForOwn(baseForOwn);
/**
* This method is like `_.forOwn` except that it iterates over properties of
@@ -8929,10 +9124,7 @@
* });
* // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
*/
- function forOwnRight(object, iteratee, thisArg) {
- iteratee = bindCallback(iteratee, thisArg, 3);
- return baseForRight(object, iteratee, keys);
- }
+ var forOwnRight = createForOwn(baseForOwnRight);
/**
* Creates an array of function property names from all enumerable properties,
@@ -9117,7 +9309,7 @@
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through `iteratee`. The
- * iteratee function is bound to `thisArg` and invoked with three arguments;
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
* (value, key, object).
*
* If a property name is provided for `iteratee` the created `_.property`
@@ -9172,7 +9364,7 @@
* provided it is invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked
- * with five arguments; (objectValue, sourceValue, key, object, source).
+ * with five arguments: (objectValue, sourceValue, key, object, source).
*
* @static
* @memberOf _
@@ -9221,7 +9413,7 @@
* Property names may be specified as individual arguments or as arrays of
* property names. If `predicate` is provided it is invoked for each property
* of `object` omitting the properties `predicate` returns truthy for. The
- * predicate is bound to `thisArg` and invoked with three arguments;
+ * predicate is bound to `thisArg` and invoked with three arguments:
* (value, key, object).
*
* @static
@@ -9243,19 +9435,19 @@
* _.omit(object, _.isNumber);
* // => { 'user': 'fred' }
*/
- function omit(object, predicate, thisArg) {
+ var omit = restParam(function(object, props) {
if (object == null) {
return {};
}
- if (typeof predicate != 'function') {
- var props = arrayMap(baseFlatten(arguments, false, false, 1), String);
+ if (typeof props[0] != 'function') {
+ var props = arrayMap(baseFlatten(props), String);
return pickByArray(object, baseDifference(keysIn(object), props));
}
- predicate = bindCallback(predicate, thisArg, 3);
+ var predicate = bindCallback(props[0], props[1], 3);
return pickByCallback(object, function(value, key, object) {
return !predicate(value, key, object);
});
- }
+ });
/**
* Creates a two dimensional array of the key-value pairs for `object`,
@@ -9289,7 +9481,7 @@
* names may be specified as individual arguments or as arrays of property
* names. If `predicate` is provided it is invoked for each property of `object`
* picking the properties `predicate` returns truthy for. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, key, object).
+ * bound to `thisArg` and invoked with three arguments: (value, key, object).
*
* @static
* @memberOf _
@@ -9310,14 +9502,14 @@
* _.pick(object, _.isString);
* // => { 'user': 'fred' }
*/
- function pick(object, predicate, thisArg) {
+ var pick = restParam(function(object, props) {
if (object == null) {
return {};
}
- return typeof predicate == 'function'
- ? pickByCallback(object, bindCallback(predicate, thisArg, 3))
- : pickByArray(object, baseFlatten(arguments, false, false, 1));
- }
+ return typeof props[0] == 'function'
+ ? pickByCallback(object, bindCallback(props[0], props[1], 3))
+ : pickByArray(object, baseFlatten(props));
+ });
/**
* Resolves the value of property `key` on `object`. If the value of `key` is
@@ -9362,7 +9554,7 @@
* `accumulator` object which is the result of running each of its own enumerable
* properties through `iteratee`, with each invocation potentially mutating
* the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
- * with four arguments; (accumulator, value, key, object). Iterator functions
+ * with four arguments: (accumulator, value, key, object). Iterator functions
* may exit iteration early by explicitly returning `false`.
*
* @static
@@ -9573,8 +9765,7 @@
/*------------------------------------------------------------------------*/
/**
- * Converts `string` to camel case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/CamelCase) for more details.
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
*
* @static
* @memberOf _
@@ -9616,9 +9807,8 @@
}
/**
- * Deburrs `string` by converting latin-1 supplementary letters to basic latin letters.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
- * for more details.
+ * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
*
* @static
* @memberOf _
@@ -9632,7 +9822,7 @@
*/
function deburr(string) {
string = baseToString(string);
- return string && string.replace(reLatin1, deburrLetter);
+ return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, '');
}
/**
@@ -9687,9 +9877,8 @@
* [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of
* the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.
*
- * When working with HTML you should always quote attribute values to reduce
- * XSS vectors. See [Ryan Grove's article](http://wonko.com/post/html-escaping)
- * for more details.
+ * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
+ * to reduce XSS vectors.
*
* @static
* @memberOf _
@@ -9710,8 +9899,8 @@
}
/**
- * Escapes the `RegExp` special characters "\", "^", "$", ".", "|", "?", "*",
- * "+", "(", ")", "[", "]", "{" and "}" in `string`.
+ * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
+ * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
*
* @static
* @memberOf _
@@ -9721,7 +9910,7 @@
* @example
*
* _.escapeRegExp('[lodash](https://lodash.com/)');
- * // => '\[lodash\]\(https://lodash\.com/\)'
+ * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
*/
function escapeRegExp(string) {
string = baseToString(string);
@@ -9731,9 +9920,7 @@
}
/**
- * Converts `string` to kebab case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles) for
- * more details.
+ * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
*
* @static
* @memberOf _
@@ -9756,9 +9943,8 @@
});
/**
- * Pads `string` on the left and right sides if it is shorter then the given
- * padding length. The `chars` string may be truncated if the number of padding
- * characters can't be evenly divided by the padding length.
+ * Pads `string` on the left and right sides if it is shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
*
* @static
* @memberOf _
@@ -9790,14 +9976,13 @@
leftLength = floor(mid),
rightLength = ceil(mid);
- chars = createPad('', rightLength, chars);
+ chars = createPadding('', rightLength, chars);
return chars.slice(0, leftLength) + string + chars;
}
/**
- * Pads `string` on the left side if it is shorter then the given padding
- * length. The `chars` string may be truncated if the number of padding
- * characters exceeds the padding length.
+ * Pads `string` on the left side if it is shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
*
* @static
* @memberOf _
@@ -9817,15 +10002,11 @@
* _.padLeft('abc', 3);
* // => 'abc'
*/
- function padLeft(string, length, chars) {
- string = baseToString(string);
- return string && (createPad(string, length, chars) + string);
- }
+ var padLeft = createPadDir();
/**
- * Pads `string` on the right side if it is shorter then the given padding
- * length. The `chars` string may be truncated if the number of padding
- * characters exceeds the padding length.
+ * Pads `string` on the right side if it is shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
*
* @static
* @memberOf _
@@ -9845,18 +10026,15 @@
* _.padRight('abc', 3);
* // => 'abc'
*/
- function padRight(string, length, chars) {
- string = baseToString(string);
- return string && (string + createPad(string, length, chars));
- }
+ var padRight = createPadDir(true);
/**
* Converts `string` to an integer of the specified radix. If `radix` is
* `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
* in which case a `radix` of `16` is used.
*
- * **Note:** This method aligns with the ES5 implementation of `parseInt`.
- * See the [ES5 spec](https://es5.github.io/#E) for more details.
+ * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
+ * of `parseInt`.
*
* @static
* @memberOf _
@@ -9936,8 +10114,7 @@
}
/**
- * Converts `string` to snake case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Snake_case) for more details.
+ * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
*
* @static
* @memberOf _
@@ -9960,9 +10137,7 @@
});
/**
- * Converts `string` to start case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage)
- * for more details.
+ * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
*
* @static
* @memberOf _
@@ -10021,9 +10196,9 @@
* properties may be accessed as free variables in the template. If a setting
* object is provided it takes precedence over `_.templateSettings` values.
*
- * **Note:** In the development build `_.template` utilizes sourceURLs for easier debugging.
- * See the [HTML5 Rocks article on sourcemaps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
- * for more details.
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
*
* For more information on precompiling templates see
* [lodash's custom builds documentation](https://lodash.com/custom-builds).
@@ -10235,7 +10410,7 @@
* // => 'abc'
*
* _.map([' foo ', ' bar '], _.trim);
- * // => ['foo', 'bar]
+ * // => ['foo', 'bar']
*/
function trim(string, chars, guard) {
var value = string;
@@ -10343,7 +10518,7 @@
* 'length': 24,
* 'separator': /,? +/
* });
- * //=> 'hi-diddly-ho there...'
+ * // => 'hi-diddly-ho there...'
*
* _.trunc('hi-diddly-ho there, neighborino', {
* 'omission': ' [...]'
@@ -10462,7 +10637,7 @@
* @static
* @memberOf _
* @category Utility
- * @param {*} func The function to attempt.
+ * @param {Function} func The function to attempt.
* @returns {*} Returns the `func` result or error object.
* @example
*
@@ -10475,20 +10650,13 @@
* elements = [];
* }
*/
- function attempt() {
- var func = arguments[0],
- length = arguments.length,
- args = Array(length ? (length - 1) : 0);
-
- while (--length > 0) {
- args[length - 1] = arguments[length];
- }
+ var attempt = restParam(function(func, args) {
try {
return func.apply(undefined, args);
} catch(e) {
return isError(e) ? e : new Error(e);
}
- }
+ });
/**
* Creates a function that invokes `func` with the `this` binding of `thisArg`
@@ -10625,12 +10793,11 @@
*
* var users = [
* { 'user': 'barney' },
- * { 'user': 'fred' },
- * { 'user': 'pebbles' }
+ * { 'user': 'fred' }
* ];
*
* _.find(users, _.matchesProperty('user', 'fred'));
- * // => { 'user': 'fred', 'age': 40 }
+ * // => { 'user': 'fred' }
*/
function matchesProperty(key, value) {
return baseMatchesProperty(key + '', baseClone(value, true));
@@ -10641,6 +10808,9 @@
* destination object. If `object` is a function then methods are added to
* its prototype as well.
*
+ * **Note:** Use `_.runInContext` to create a pristine `lodash` function
+ * for mixins to avoid conflicts caused by modifying the original.
+ *
* @static
* @memberOf _
* @category Utility
@@ -10658,7 +10828,7 @@
* });
* }
*
- * // use `_.runInContext` to avoid potential conflicts (esp. in Node.js)
+ * // use `_.runInContext` to avoid conflicts (esp. in Node.js)
* var _ = require('lodash').runInContext();
*
* _.mixin({ 'vowels': vowels });
@@ -10708,12 +10878,10 @@
return function() {
var chainAll = this.__chain__;
if (chain || chainAll) {
- var result = object(this.__wrapped__);
- (result.__actions__ = arrayCopy(this.__actions__)).push({
- 'func': func,
- 'args': arguments,
- 'thisArg': object
- });
+ var result = object(this.__wrapped__),
+ actions = result.__actions__ = arrayCopy(this.__actions__);
+
+ actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
result.__chain__ = chainAll;
return result;
}
@@ -10780,7 +10948,7 @@
* var getName = _.property('user');
*
* _.map(users, getName);
- * // => ['fred', barney']
+ * // => ['fred', 'barney']
*
* _.pluck(_.sortBy(users, getName), 'user');
* // => ['barney', 'fred']
@@ -10790,7 +10958,7 @@
}
/**
- * The inverse of `_.property`; this method creates a function which returns
+ * The opposite of `_.property`; this method creates a function which returns
* the property value of a given key on `object`.
*
* @static
@@ -10968,16 +11136,16 @@
* `-Infinity` is returned. If an iteratee function is provided it is invoked
* for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
+ * arguments: (value, index, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -11004,11 +11172,11 @@
* _.max(users, function(chr) {
* return chr.age;
* });
- * // => { 'user': 'fred', 'age': 40 };
+ * // => { 'user': 'fred', 'age': 40 }
*
* // using the `_.property` callback shorthand
* _.max(users, 'age');
- * // => { 'user': 'fred', 'age': 40 };
+ * // => { 'user': 'fred', 'age': 40 }
*/
var max = createExtremum(arrayMax);
@@ -11017,16 +11185,16 @@
* `Infinity` is returned. If an iteratee function is provided it is invoked
* for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
+ * arguments: (value, index, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -11053,11 +11221,11 @@
* _.min(users, function(chr) {
* return chr.age;
* });
- * // => { 'user': 'barney', 'age': 36 };
+ * // => { 'user': 'barney', 'age': 36 }
*
* // using the `_.property` callback shorthand
* _.min(users, 'age');
- * // => { 'user': 'barney', 'age': 36 };
+ * // => { 'user': 'barney', 'age': 36 }
*/
var min = createExtremum(arrayMin, true);
@@ -11068,26 +11236,45 @@
* @memberOf _
* @category Math
* @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
* @returns {number} Returns the sum.
* @example
*
- * _.sum([4, 6, 2]);
- * // => 12
+ * _.sum([4, 6]);
+ * // => 10
*
- * _.sum({ 'a': 4, 'b': 6, 'c': 2 });
- * // => 12
+ * _.sum({ 'a': 4, 'b': 6 });
+ * // => 10
+ *
+ * var objects = [
+ * { 'n': 4 },
+ * { 'n': 6 }
+ * ];
+ *
+ * _.sum(objects, function(object) {
+ * return object.n;
+ * });
+ * // => 10
+ *
+ * // using the `_.property` callback shorthand
+ * _.sum(objects, 'n');
+ * // => 10
*/
- function sum(collection) {
- if (!isArray(collection)) {
- collection = toIterable(collection);
+ function sum(collection, iteratee, thisArg) {
+ if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
+ iteratee = null;
}
- var length = collection.length,
- result = 0;
+ var func = getCallback(),
+ noIteratee = iteratee == null;
- while (length--) {
- result += +collection[length] || 0;
+ if (!(func === baseCallback && noIteratee)) {
+ noIteratee = false;
+ iteratee = func(iteratee, thisArg, 3);
}
- return result;
+ return noIteratee
+ ? arraySum(isArray(collection) ? collection : toIterable(collection))
+ : baseSum(collection, iteratee);
}
/*------------------------------------------------------------------------*/
@@ -11186,6 +11373,7 @@
lodash.reject = reject;
lodash.remove = remove;
lodash.rest = rest;
+ lodash.restParam = restParam;
lodash.shuffle = shuffle;
lodash.slice = slice;
lodash.sortBy = sortBy;
@@ -11477,8 +11665,11 @@
// Add `LazyWrapper` methods to `lodash.prototype`.
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
- var lodashFunc = lodash[methodName],
- checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
+ var lodashFunc = lodash[methodName];
+ if (!lodashFunc) {
+ return;
+ }
+ var checkIteratee = /^(?:filter|map|reject)|While$/.test(methodName),
retUnwrapped = /^(?:first|last)$/.test(methodName);
lodash.prototype[methodName] = function() {
@@ -11537,6 +11728,19 @@
};
});
+ // Map minified function names to their real names.
+ baseForOwn(LazyWrapper.prototype, function(func, methodName) {
+ var lodashFunc = lodash[methodName];
+ if (lodashFunc) {
+ var key = lodashFunc.name,
+ names = realNames[key] || (realNames[key] = []);
+
+ names.push({ 'name': methodName, 'func': lodashFunc });
+ }
+ });
+
+ realNames[createHybridWrapper(null, BIND_KEY_FLAG).name] = [{ 'name': 'wrapper', 'func': null }];
+
// Add functions to the lazy wrapper.
LazyWrapper.prototype.clone = lazyClone;
LazyWrapper.prototype.reverse = lazyReverse;
diff --git a/math/max.js b/math/max.js
index 0b691c9b4..4e728e736 100644
--- a/math/max.js
+++ b/math/max.js
@@ -5,16 +5,16 @@ define(['../internal/arrayMax', '../internal/createExtremum'], function(arrayMax
* `-Infinity` is returned. If an iteratee function is provided it is invoked
* for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
+ * arguments: (value, index, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -41,11 +41,11 @@ define(['../internal/arrayMax', '../internal/createExtremum'], function(arrayMax
* _.max(users, function(chr) {
* return chr.age;
* });
- * // => { 'user': 'fred', 'age': 40 };
+ * // => { 'user': 'fred', 'age': 40 }
*
* // using the `_.property` callback shorthand
* _.max(users, 'age');
- * // => { 'user': 'fred', 'age': 40 };
+ * // => { 'user': 'fred', 'age': 40 }
*/
var max = createExtremum(arrayMax);
diff --git a/math/min.js b/math/min.js
index 9652a8a39..04400c401 100644
--- a/math/min.js
+++ b/math/min.js
@@ -5,16 +5,16 @@ define(['../internal/arrayMin', '../internal/createExtremum'], function(arrayMin
* `Infinity` is returned. If an iteratee function is provided it is invoked
* for each value in `collection` to generate the criterion by which the value
* is ranked. The `iteratee` is bound to `thisArg` and invoked with three
- * arguments; (value, index, collection).
+ * arguments: (value, index, collection).
*
- * If a property name is provided for `predicate` the created `_.property`
+ * If a property name is provided for `iteratee` the created `_.property`
* style callback returns the property value of the given element.
*
* If a value is also provided for `thisArg` the created `_.matchesProperty`
* style callback returns `true` for elements that have a matching property
* value, else `false`.
*
- * If an object is provided for `predicate` the created `_.matches` style
+ * If an object is provided for `iteratee` the created `_.matches` style
* callback returns `true` for elements that have the properties of the given
* object, else `false`.
*
@@ -41,11 +41,11 @@ define(['../internal/arrayMin', '../internal/createExtremum'], function(arrayMin
* _.min(users, function(chr) {
* return chr.age;
* });
- * // => { 'user': 'barney', 'age': 36 };
+ * // => { 'user': 'barney', 'age': 36 }
*
* // using the `_.property` callback shorthand
* _.min(users, 'age');
- * // => { 'user': 'barney', 'age': 36 };
+ * // => { 'user': 'barney', 'age': 36 }
*/
var min = createExtremum(arrayMin, true);
diff --git a/math/sum.js b/math/sum.js
index 4f60c925d..919c5258c 100644
--- a/math/sum.js
+++ b/math/sum.js
@@ -1,4 +1,4 @@
-define(['../lang/isArray', '../internal/toIterable'], function(isArray, toIterable) {
+define(['../internal/arraySum', '../internal/baseCallback', '../internal/baseSum', '../lang/isArray', '../internal/isIterateeCall', '../internal/toIterable'], function(arraySum, baseCallback, baseSum, isArray, isIterateeCall, toIterable) {
/**
* Gets the sum of the values in `collection`.
@@ -7,26 +7,41 @@ define(['../lang/isArray', '../internal/toIterable'], function(isArray, toIterab
* @memberOf _
* @category Math
* @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function|Object|string} [iteratee] The function invoked per iteration.
+ * @param {*} [thisArg] The `this` binding of `iteratee`.
* @returns {number} Returns the sum.
* @example
*
- * _.sum([4, 6, 2]);
- * // => 12
+ * _.sum([4, 6]);
+ * // => 10
*
- * _.sum({ 'a': 4, 'b': 6, 'c': 2 });
- * // => 12
+ * _.sum({ 'a': 4, 'b': 6 });
+ * // => 10
+ *
+ * var objects = [
+ * { 'n': 4 },
+ * { 'n': 6 }
+ * ];
+ *
+ * _.sum(objects, function(object) {
+ * return object.n;
+ * });
+ * // => 10
+ *
+ * // using the `_.property` callback shorthand
+ * _.sum(objects, 'n');
+ * // => 10
*/
- function sum(collection) {
- if (!isArray(collection)) {
- collection = toIterable(collection);
+ function sum(collection, iteratee, thisArg) {
+ if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
+ iteratee = null;
}
- var length = collection.length,
- result = 0;
+ var noIteratee = iteratee == null;
- while (length--) {
- result += +collection[length] || 0;
- }
- return result;
+ iteratee = noIteratee ? iteratee : baseCallback(iteratee, thisArg, 3);
+ return noIteratee
+ ? arraySum(isArray(collection) ? collection : toIterable(collection))
+ : baseSum(collection, iteratee);
}
return sum;
diff --git a/object/assign.js b/object/assign.js
index 0b6bccbfb..c218d7bd6 100644
--- a/object/assign.js
+++ b/object/assign.js
@@ -4,7 +4,7 @@ define(['../internal/baseAssign', '../internal/createAssigner'], function(baseAs
* Assigns own enumerable properties of source object(s) to the destination
* object. Subsequent sources overwrite property assignments of previous sources.
* If `customizer` is provided it is invoked to produce the assigned values.
- * The `customizer` is bound to `thisArg` and invoked with five arguments;
+ * The `customizer` is bound to `thisArg` and invoked with five arguments:
* (objectValue, sourceValue, key, object, source).
*
* @static
diff --git a/object/defaults.js b/object/defaults.js
index c6a03a60d..87d4abc9d 100644
--- a/object/defaults.js
+++ b/object/defaults.js
@@ -1,4 +1,4 @@
-define(['../internal/arrayCopy', './assign', '../internal/assignDefaults'], function(arrayCopy, assign, assignDefaults) {
+define(['./assign', '../internal/assignDefaults', '../function/restParam'], function(assign, assignDefaults, restParam) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -19,14 +19,14 @@ define(['../internal/arrayCopy', './assign', '../internal/assignDefaults'], func
* _.defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
* // => { 'user': 'barney', 'age': 36 }
*/
- function defaults(object) {
+ var defaults = restParam(function(args) {
+ var object = args[0];
if (object == null) {
return object;
}
- var args = arrayCopy(arguments);
args.push(assignDefaults);
return assign.apply(undefined, args);
- }
+ });
return defaults;
});
diff --git a/object/findKey.js b/object/findKey.js
index 8a948159f..ffdfaa66f 100644
--- a/object/findKey.js
+++ b/object/findKey.js
@@ -1,8 +1,8 @@
-define(['../internal/baseCallback', '../internal/baseFind', '../internal/baseForOwn'], function(baseCallback, baseFind, baseForOwn) {
+define(['../internal/baseForOwn', '../internal/createFindKey'], function(baseForOwn, createFindKey) {
/**
- * This method is like `_.findIndex` except that it returns the key of the
- * first element `predicate` returns truthy for, instead of the element itself.
+ * This method is like `_.find` except that it returns the key of the first
+ * element `predicate` returns truthy for instead of the element itself.
*
* If a property name is provided for `predicate` the created `_.property`
* style callback returns the property value of the given element.
@@ -48,10 +48,7 @@ define(['../internal/baseCallback', '../internal/baseFind', '../internal/baseFor
* _.findKey(users, 'active');
* // => 'barney'
*/
- function findKey(object, predicate, thisArg) {
- predicate = baseCallback(predicate, thisArg, 3);
- return baseFind(object, predicate, baseForOwn, true);
- }
+ var findKey = createFindKey(baseForOwn);
return findKey;
});
diff --git a/object/findLastKey.js b/object/findLastKey.js
index 3f262c1b6..f42c0f4af 100644
--- a/object/findLastKey.js
+++ b/object/findLastKey.js
@@ -1,4 +1,4 @@
-define(['../internal/baseCallback', '../internal/baseFind', '../internal/baseForOwnRight'], function(baseCallback, baseFind, baseForOwnRight) {
+define(['../internal/baseForOwnRight', '../internal/createFindKey'], function(baseForOwnRight, createFindKey) {
/**
* This method is like `_.findKey` except that it iterates over elements of
@@ -48,10 +48,7 @@ define(['../internal/baseCallback', '../internal/baseFind', '../internal/baseFor
* _.findLastKey(users, 'active');
* // => 'pebbles'
*/
- function findLastKey(object, predicate, thisArg) {
- predicate = baseCallback(predicate, thisArg, 3);
- return baseFind(object, predicate, baseForOwnRight, true);
- }
+ var findLastKey = createFindKey(baseForOwnRight);
return findLastKey;
});
diff --git a/object/forIn.js b/object/forIn.js
index 97936267d..1843392b5 100644
--- a/object/forIn.js
+++ b/object/forIn.js
@@ -1,9 +1,9 @@
-define(['../internal/baseFor', '../internal/bindCallback', './keysIn'], function(baseFor, bindCallback, keysIn) {
+define(['../internal/baseFor', '../internal/createForIn'], function(baseFor, createForIn) {
/**
* Iterates over own and inherited enumerable properties of an object invoking
* `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
- * with three arguments; (value, key, object). Iterator functions may exit
+ * with three arguments: (value, key, object). Iterator functions may exit
* iteration early by explicitly returning `false`.
*
* @static
@@ -27,12 +27,7 @@ define(['../internal/baseFor', '../internal/bindCallback', './keysIn'], function
* });
* // => logs 'a', 'b', and 'c' (iteration order is not guaranteed)
*/
- function forIn(object, iteratee, thisArg) {
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
- iteratee = bindCallback(iteratee, thisArg, 3);
- }
- return baseFor(object, iteratee, keysIn);
- }
+ var forIn = createForIn(baseFor);
return forIn;
});
diff --git a/object/forInRight.js b/object/forInRight.js
index 3c96ff7e5..ce2dfc203 100644
--- a/object/forInRight.js
+++ b/object/forInRight.js
@@ -1,4 +1,4 @@
-define(['../internal/baseForRight', '../internal/bindCallback', './keysIn'], function(baseForRight, bindCallback, keysIn) {
+define(['../internal/baseForRight', '../internal/createForIn'], function(baseForRight, createForIn) {
/**
* This method is like `_.forIn` except that it iterates over properties of
@@ -25,10 +25,7 @@ define(['../internal/baseForRight', '../internal/bindCallback', './keysIn'], fun
* });
* // => logs 'c', 'b', and 'a' assuming `_.forIn ` logs 'a', 'b', and 'c'
*/
- function forInRight(object, iteratee, thisArg) {
- iteratee = bindCallback(iteratee, thisArg, 3);
- return baseForRight(object, iteratee, keysIn);
- }
+ var forInRight = createForIn(baseForRight);
return forInRight;
});
diff --git a/object/forOwn.js b/object/forOwn.js
index 99e2de096..71a7c1364 100644
--- a/object/forOwn.js
+++ b/object/forOwn.js
@@ -1,9 +1,9 @@
-define(['../internal/baseForOwn', '../internal/bindCallback'], function(baseForOwn, bindCallback) {
+define(['../internal/baseForOwn', '../internal/createForOwn'], function(baseForOwn, createForOwn) {
/**
* Iterates over own enumerable properties of an object invoking `iteratee`
* for each property. The `iteratee` is bound to `thisArg` and invoked with
- * three arguments; (value, key, object). Iterator functions may exit iteration
+ * three arguments: (value, key, object). Iterator functions may exit iteration
* early by explicitly returning `false`.
*
* @static
@@ -27,12 +27,7 @@ define(['../internal/baseForOwn', '../internal/bindCallback'], function(baseForO
* });
* // => logs 'a' and 'b' (iteration order is not guaranteed)
*/
- function forOwn(object, iteratee, thisArg) {
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
- iteratee = bindCallback(iteratee, thisArg, 3);
- }
- return baseForOwn(object, iteratee);
- }
+ var forOwn = createForOwn(baseForOwn);
return forOwn;
});
diff --git a/object/forOwnRight.js b/object/forOwnRight.js
index 09811e51e..c38b792d3 100644
--- a/object/forOwnRight.js
+++ b/object/forOwnRight.js
@@ -1,4 +1,4 @@
-define(['../internal/baseForRight', '../internal/bindCallback', './keys'], function(baseForRight, bindCallback, keys) {
+define(['../internal/baseForOwnRight', '../internal/createForOwn'], function(baseForOwnRight, createForOwn) {
/**
* This method is like `_.forOwn` except that it iterates over properties of
@@ -25,10 +25,7 @@ define(['../internal/baseForRight', '../internal/bindCallback', './keys'], funct
* });
* // => logs 'b' and 'a' assuming `_.forOwn` logs 'a' and 'b'
*/
- function forOwnRight(object, iteratee, thisArg) {
- iteratee = bindCallback(iteratee, thisArg, 3);
- return baseForRight(object, iteratee, keys);
- }
+ var forOwnRight = createForOwn(baseForOwnRight);
return forOwnRight;
});
diff --git a/object/mapValues.js b/object/mapValues.js
index 2eb702712..941b27f14 100644
--- a/object/mapValues.js
+++ b/object/mapValues.js
@@ -3,7 +3,7 @@ define(['../internal/baseCallback', '../internal/baseForOwn'], function(baseCall
/**
* Creates an object with the same keys as `object` and values generated by
* running each own enumerable property of `object` through `iteratee`. The
- * iteratee function is bound to `thisArg` and invoked with three arguments;
+ * iteratee function is bound to `thisArg` and invoked with three arguments:
* (value, key, object).
*
* If a property name is provided for `iteratee` the created `_.property`
diff --git a/object/merge.js b/object/merge.js
index d331ea9c5..0b89bd35e 100644
--- a/object/merge.js
+++ b/object/merge.js
@@ -7,7 +7,7 @@ define(['../internal/baseMerge', '../internal/createAssigner'], function(baseMer
* provided it is invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked
- * with five arguments; (objectValue, sourceValue, key, object, source).
+ * with five arguments: (objectValue, sourceValue, key, object, source).
*
* @static
* @memberOf _
diff --git a/object/omit.js b/object/omit.js
index 949077960..8fa33ed36 100644
--- a/object/omit.js
+++ b/object/omit.js
@@ -1,4 +1,4 @@
-define(['../internal/arrayMap', '../internal/baseDifference', '../internal/baseFlatten', '../internal/bindCallback', './keysIn', '../internal/pickByArray', '../internal/pickByCallback'], function(arrayMap, baseDifference, baseFlatten, bindCallback, keysIn, pickByArray, pickByCallback) {
+define(['../internal/arrayMap', '../internal/baseDifference', '../internal/baseFlatten', '../internal/bindCallback', './keysIn', '../internal/pickByArray', '../internal/pickByCallback', '../function/restParam'], function(arrayMap, baseDifference, baseFlatten, bindCallback, keysIn, pickByArray, pickByCallback, restParam) {
/**
* The opposite of `_.pick`; this method creates an object composed of the
@@ -6,7 +6,7 @@ define(['../internal/arrayMap', '../internal/baseDifference', '../internal/baseF
* Property names may be specified as individual arguments or as arrays of
* property names. If `predicate` is provided it is invoked for each property
* of `object` omitting the properties `predicate` returns truthy for. The
- * predicate is bound to `thisArg` and invoked with three arguments;
+ * predicate is bound to `thisArg` and invoked with three arguments:
* (value, key, object).
*
* @static
@@ -28,19 +28,19 @@ define(['../internal/arrayMap', '../internal/baseDifference', '../internal/baseF
* _.omit(object, _.isNumber);
* // => { 'user': 'fred' }
*/
- function omit(object, predicate, thisArg) {
+ var omit = restParam(function(object, props) {
if (object == null) {
return {};
}
- if (typeof predicate != 'function') {
- var props = arrayMap(baseFlatten(arguments, false, false, 1), String);
+ if (typeof props[0] != 'function') {
+ var props = arrayMap(baseFlatten(props), String);
return pickByArray(object, baseDifference(keysIn(object), props));
}
- predicate = bindCallback(predicate, thisArg, 3);
+ var predicate = bindCallback(props[0], props[1], 3);
return pickByCallback(object, function(value, key, object) {
return !predicate(value, key, object);
});
- }
+ });
return omit;
});
diff --git a/object/pick.js b/object/pick.js
index 01268bb28..826be74a4 100644
--- a/object/pick.js
+++ b/object/pick.js
@@ -1,11 +1,11 @@
-define(['../internal/baseFlatten', '../internal/bindCallback', '../internal/pickByArray', '../internal/pickByCallback'], function(baseFlatten, bindCallback, pickByArray, pickByCallback) {
+define(['../internal/baseFlatten', '../internal/bindCallback', '../internal/pickByArray', '../internal/pickByCallback', '../function/restParam'], function(baseFlatten, bindCallback, pickByArray, pickByCallback, restParam) {
/**
* Creates an object composed of the picked `object` properties. Property
* names may be specified as individual arguments or as arrays of property
* names. If `predicate` is provided it is invoked for each property of `object`
* picking the properties `predicate` returns truthy for. The predicate is
- * bound to `thisArg` and invoked with three arguments; (value, key, object).
+ * bound to `thisArg` and invoked with three arguments: (value, key, object).
*
* @static
* @memberOf _
@@ -26,14 +26,14 @@ define(['../internal/baseFlatten', '../internal/bindCallback', '../internal/pick
* _.pick(object, _.isString);
* // => { 'user': 'fred' }
*/
- function pick(object, predicate, thisArg) {
+ var pick = restParam(function(object, props) {
if (object == null) {
return {};
}
- return typeof predicate == 'function'
- ? pickByCallback(object, bindCallback(predicate, thisArg, 3))
- : pickByArray(object, baseFlatten(arguments, false, false, 1));
- }
+ return typeof props[0] == 'function'
+ ? pickByCallback(object, bindCallback(props[0], props[1], 3))
+ : pickByArray(object, baseFlatten(props));
+ });
return pick;
});
diff --git a/object/transform.js b/object/transform.js
index ec9ca5d1c..4f9f1d61a 100644
--- a/object/transform.js
+++ b/object/transform.js
@@ -5,7 +5,7 @@ define(['../internal/arrayEach', '../internal/baseCallback', '../internal/baseCr
* `accumulator` object which is the result of running each of its own enumerable
* properties through `iteratee`, with each invocation potentially mutating
* the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
- * with four arguments; (accumulator, value, key, object). Iterator functions
+ * with four arguments: (accumulator, value, key, object). Iterator functions
* may exit iteration early by explicitly returning `false`.
*
* @static
diff --git a/package.json b/package.json
index 7fa97722c..7666ddef3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "lodash",
- "version": "3.5.0",
+ "version": "3.6.0",
"main": "main.js",
"private": true,
"volo": {
diff --git a/string/camelCase.js b/string/camelCase.js
index 88f374b53..f3f332ba3 100644
--- a/string/camelCase.js
+++ b/string/camelCase.js
@@ -1,8 +1,7 @@
define(['../internal/createCompounder'], function(createCompounder) {
/**
- * Converts `string` to camel case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/CamelCase) for more details.
+ * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
*
* @static
* @memberOf _
diff --git a/string/deburr.js b/string/deburr.js
index 14260d9b6..89886b12f 100644
--- a/string/deburr.js
+++ b/string/deburr.js
@@ -1,12 +1,16 @@
define(['../internal/baseToString', '../internal/deburrLetter'], function(baseToString, deburrLetter) {
+ /**
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
+ */
+ var reComboMarks = /[\u0300-\u036f\ufe20-\ufe23]/g;
+
/** Used to match latin-1 supplementary letters (excluding mathematical operators). */
var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
/**
- * Deburrs `string` by converting latin-1 supplementary letters to basic latin letters.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
- * for more details.
+ * Deburrs `string` by converting [latin-1 supplementary letters](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
+ * to basic latin letters and removing [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
*
* @static
* @memberOf _
@@ -20,7 +24,7 @@ define(['../internal/baseToString', '../internal/deburrLetter'], function(baseTo
*/
function deburr(string) {
string = baseToString(string);
- return string && string.replace(reLatin1, deburrLetter);
+ return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, '');
}
return deburr;
diff --git a/string/escape.js b/string/escape.js
index 8df24b198..35ca75970 100644
--- a/string/escape.js
+++ b/string/escape.js
@@ -22,9 +22,8 @@ define(['../internal/baseToString', '../internal/escapeHtmlChar'], function(base
* [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of
* the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.
*
- * When working with HTML you should always quote attribute values to reduce
- * XSS vectors. See [Ryan Grove's article](http://wonko.com/post/html-escaping)
- * for more details.
+ * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
+ * to reduce XSS vectors.
*
* @static
* @memberOf _
diff --git a/string/escapeRegExp.js b/string/escapeRegExp.js
index 8915739a7..c2f20ed86 100644
--- a/string/escapeRegExp.js
+++ b/string/escapeRegExp.js
@@ -1,16 +1,16 @@
define(['../internal/baseToString'], function(baseToString) {
/**
- * Used to match `RegExp` special characters.
- * See this [article on `RegExp` characters](http://www.regular-expressions.info/characters.html#special)
- * for more details.
+ * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).
+ * In addition to special characters the forward slash is escaped to allow for
+ * easier `eval` use and `Function` compilation.
*/
var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
reHasRegExpChars = RegExp(reRegExpChars.source);
/**
- * Escapes the `RegExp` special characters "\", "^", "$", ".", "|", "?", "*",
- * "+", "(", ")", "[", "]", "{" and "}" in `string`.
+ * Escapes the `RegExp` special characters "\", "/", "^", "$", ".", "|", "?",
+ * "*", "+", "(", ")", "[", "]", "{" and "}" in `string`.
*
* @static
* @memberOf _
@@ -20,7 +20,7 @@ define(['../internal/baseToString'], function(baseToString) {
* @example
*
* _.escapeRegExp('[lodash](https://lodash.com/)');
- * // => '\[lodash\]\(https://lodash\.com/\)'
+ * // => '\[lodash\]\(https:\/\/lodash\.com\/\)'
*/
function escapeRegExp(string) {
string = baseToString(string);
diff --git a/string/kebabCase.js b/string/kebabCase.js
index 3ac2d5e17..4bbea5bc6 100644
--- a/string/kebabCase.js
+++ b/string/kebabCase.js
@@ -1,9 +1,7 @@
define(['../internal/createCompounder'], function(createCompounder) {
/**
- * Converts `string` to kebab case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles) for
- * more details.
+ * Converts `string` to [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
*
* @static
* @memberOf _
diff --git a/string/pad.js b/string/pad.js
index 4c263782b..a5132c447 100644
--- a/string/pad.js
+++ b/string/pad.js
@@ -1,4 +1,4 @@
-define(['../internal/baseToString', '../internal/createPad', '../internal/root'], function(baseToString, createPad, root) {
+define(['../internal/baseToString', '../internal/createPadding', '../internal/root'], function(baseToString, createPadding, root) {
/** Native method references. */
var ceil = Math.ceil,
@@ -8,9 +8,8 @@ define(['../internal/baseToString', '../internal/createPad', '../internal/root']
var nativeIsFinite = root.isFinite;
/**
- * Pads `string` on the left and right sides if it is shorter then the given
- * padding length. The `chars` string may be truncated if the number of padding
- * characters can't be evenly divided by the padding length.
+ * Pads `string` on the left and right sides if it is shorter than `length`.
+ * Padding characters are truncated if they can't be evenly divided by `length`.
*
* @static
* @memberOf _
@@ -42,7 +41,7 @@ define(['../internal/baseToString', '../internal/createPad', '../internal/root']
leftLength = floor(mid),
rightLength = ceil(mid);
- chars = createPad('', rightLength, chars);
+ chars = createPadding('', rightLength, chars);
return chars.slice(0, leftLength) + string + chars;
}
diff --git a/string/padLeft.js b/string/padLeft.js
index 1f0a939ab..8308143a7 100644
--- a/string/padLeft.js
+++ b/string/padLeft.js
@@ -1,9 +1,8 @@
-define(['../internal/baseToString', '../internal/createPad'], function(baseToString, createPad) {
+define(['../internal/createPadDir'], function(createPadDir) {
/**
- * Pads `string` on the left side if it is shorter then the given padding
- * length. The `chars` string may be truncated if the number of padding
- * characters exceeds the padding length.
+ * Pads `string` on the left side if it is shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
*
* @static
* @memberOf _
@@ -23,10 +22,7 @@ define(['../internal/baseToString', '../internal/createPad'], function(baseToStr
* _.padLeft('abc', 3);
* // => 'abc'
*/
- function padLeft(string, length, chars) {
- string = baseToString(string);
- return string && (createPad(string, length, chars) + string);
- }
+ var padLeft = createPadDir();
return padLeft;
});
diff --git a/string/padRight.js b/string/padRight.js
index f158e1363..774efd2cd 100644
--- a/string/padRight.js
+++ b/string/padRight.js
@@ -1,9 +1,8 @@
-define(['../internal/baseToString', '../internal/createPad'], function(baseToString, createPad) {
+define(['../internal/createPadDir'], function(createPadDir) {
/**
- * Pads `string` on the right side if it is shorter then the given padding
- * length. The `chars` string may be truncated if the number of padding
- * characters exceeds the padding length.
+ * Pads `string` on the right side if it is shorter than `length`. Padding
+ * characters are truncated if they exceed `length`.
*
* @static
* @memberOf _
@@ -23,10 +22,7 @@ define(['../internal/baseToString', '../internal/createPad'], function(baseToStr
* _.padRight('abc', 3);
* // => 'abc'
*/
- function padRight(string, length, chars) {
- string = baseToString(string);
- return string && (string + createPad(string, length, chars));
- }
+ var padRight = createPadDir(true);
return padRight;
});
diff --git a/string/parseInt.js b/string/parseInt.js
index 3dea7c8a5..9aab52701 100644
--- a/string/parseInt.js
+++ b/string/parseInt.js
@@ -23,8 +23,8 @@ define(['../internal/isIterateeCall', '../internal/root', './trim'], function(is
* `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
* in which case a `radix` of `16` is used.
*
- * **Note:** This method aligns with the ES5 implementation of `parseInt`.
- * See the [ES5 spec](https://es5.github.io/#E) for more details.
+ * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
+ * of `parseInt`.
*
* @static
* @memberOf _
diff --git a/string/snakeCase.js b/string/snakeCase.js
index 607f6b852..9a6cdbe58 100644
--- a/string/snakeCase.js
+++ b/string/snakeCase.js
@@ -1,8 +1,7 @@
define(['../internal/createCompounder'], function(createCompounder) {
/**
- * Converts `string` to snake case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Snake_case) for more details.
+ * Converts `string` to [snake case](https://en.wikipedia.org/wiki/Snake_case).
*
* @static
* @memberOf _
diff --git a/string/startCase.js b/string/startCase.js
index 6a0d4b156..dc44d28c2 100644
--- a/string/startCase.js
+++ b/string/startCase.js
@@ -1,9 +1,7 @@
define(['../internal/createCompounder'], function(createCompounder) {
/**
- * Converts `string` to start case.
- * See [Wikipedia](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage)
- * for more details.
+ * Converts `string` to [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
*
* @static
* @memberOf _
diff --git a/string/template.js b/string/template.js
index 9e4a9dac8..73c9a3f07 100644
--- a/string/template.js
+++ b/string/template.js
@@ -9,9 +9,7 @@ define(['../internal/assignOwnDefaults', '../utility/attempt', '../internal/base
reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
/**
- * Used to match ES template delimiters.
- * See the [ES spec](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components)
- * for more details.
+ * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components).
*/
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
@@ -28,9 +26,9 @@ define(['../internal/assignOwnDefaults', '../utility/attempt', '../internal/base
* properties may be accessed as free variables in the template. If a setting
* object is provided it takes precedence over `_.templateSettings` values.
*
- * **Note:** In the development build `_.template` utilizes sourceURLs for easier debugging.
- * See the [HTML5 Rocks article on sourcemaps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
- * for more details.
+ * **Note:** In the development build `_.template` utilizes
+ * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
+ * for easier debugging.
*
* For more information on precompiling templates see
* [lodash's custom builds documentation](https://lodash.com/custom-builds).
diff --git a/string/trim.js b/string/trim.js
index ea2b6f6ee..56b863cf1 100644
--- a/string/trim.js
+++ b/string/trim.js
@@ -19,7 +19,7 @@ define(['../internal/baseToString', '../internal/charsLeftIndex', '../internal/c
* // => 'abc'
*
* _.map([' foo ', ' bar '], _.trim);
- * // => ['foo', 'bar]
+ * // => ['foo', 'bar']
*/
function trim(string, chars, guard) {
var value = string;
diff --git a/string/trunc.js b/string/trunc.js
index 3d99a5e27..8e0447174 100644
--- a/string/trunc.js
+++ b/string/trunc.js
@@ -40,7 +40,7 @@ define(['../internal/baseToString', '../internal/isIterateeCall', '../lang/isObj
* 'length': 24,
* 'separator': /,? +/
* });
- * //=> 'hi-diddly-ho there...'
+ * // => 'hi-diddly-ho there...'
*
* _.trunc('hi-diddly-ho there, neighborino', {
* 'omission': ' [...]'
diff --git a/support.js b/support.js
index b2578cfe4..1e0f2cc93 100644
--- a/support.js
+++ b/support.js
@@ -1,7 +1,4 @@
-define(['./lang/isNative', './internal/root'], function(isNative, root) {
-
- /** Used to detect functions containing a `this` reference. */
- var reThis = /\bthis\b/;
+define(['./internal/root'], function(root) {
/** Used for native method references. */
var objectProto = Object.prototype;
@@ -31,7 +28,7 @@ define(['./lang/isNative', './internal/root'], function(isNative, root) {
* @memberOf _.support
* @type boolean
*/
- support.funcDecomp = !isNative(root.WinRTError) && reThis.test(function() { return this; });
+ support.funcDecomp = /\bthis\b/.test(function() { return this; });
/**
* Detect if `Function#name` is supported (all but IE).
diff --git a/utility/attempt.js b/utility/attempt.js
index 286f2f8d1..62b0f7d25 100644
--- a/utility/attempt.js
+++ b/utility/attempt.js
@@ -1,4 +1,4 @@
-define(['../lang/isError'], function(isError) {
+define(['../lang/isError', '../function/restParam'], function(isError, restParam) {
/** Used as a safe reference for `undefined` in pre-ES5 environments. */
var undefined;
@@ -10,7 +10,7 @@ define(['../lang/isError'], function(isError) {
* @static
* @memberOf _
* @category Utility
- * @param {*} func The function to attempt.
+ * @param {Function} func The function to attempt.
* @returns {*} Returns the `func` result or error object.
* @example
*
@@ -23,20 +23,13 @@ define(['../lang/isError'], function(isError) {
* elements = [];
* }
*/
- function attempt() {
- var func = arguments[0],
- length = arguments.length,
- args = Array(length ? (length - 1) : 0);
-
- while (--length > 0) {
- args[length - 1] = arguments[length];
- }
+ var attempt = restParam(function(func, args) {
try {
return func.apply(undefined, args);
} catch(e) {
return isError(e) ? e : new Error(e);
}
- }
+ });
return attempt;
});
diff --git a/utility/matchesProperty.js b/utility/matchesProperty.js
index f15d07f89..4c9a9722b 100644
--- a/utility/matchesProperty.js
+++ b/utility/matchesProperty.js
@@ -18,12 +18,11 @@ define(['../internal/baseClone', '../internal/baseMatchesProperty'], function(ba
*
* var users = [
* { 'user': 'barney' },
- * { 'user': 'fred' },
- * { 'user': 'pebbles' }
+ * { 'user': 'fred' }
* ];
*
* _.find(users, _.matchesProperty('user', 'fred'));
- * // => { 'user': 'fred', 'age': 40 }
+ * // => { 'user': 'fred' }
*/
function matchesProperty(key, value) {
return baseMatchesProperty(key + '', baseClone(value, true));
diff --git a/utility/mixin.js b/utility/mixin.js
index 462caac80..28cdaa2fb 100644
--- a/utility/mixin.js
+++ b/utility/mixin.js
@@ -11,6 +11,9 @@ define(['../internal/arrayCopy', '../internal/baseFunctions', '../lang/isFunctio
* destination object. If `object` is a function then methods are added to
* its prototype as well.
*
+ * **Note:** Use `_.runInContext` to create a pristine `lodash` function
+ * for mixins to avoid conflicts caused by modifying the original.
+ *
* @static
* @memberOf _
* @category Utility
@@ -28,7 +31,7 @@ define(['../internal/arrayCopy', '../internal/baseFunctions', '../lang/isFunctio
* });
* }
*
- * // use `_.runInContext` to avoid potential conflicts (esp. in Node.js)
+ * // use `_.runInContext` to avoid conflicts (esp. in Node.js)
* var _ = require('lodash').runInContext();
*
* _.mixin({ 'vowels': vowels });
@@ -65,12 +68,10 @@ define(['../internal/arrayCopy', '../internal/baseFunctions', '../lang/isFunctio
return function() {
var chainAll = this.__chain__;
if (chain || chainAll) {
- var result = object(this.__wrapped__);
- (result.__actions__ = arrayCopy(this.__actions__)).push({
- 'func': func,
- 'args': arguments,
- 'thisArg': object
- });
+ var result = object(this.__wrapped__),
+ actions = result.__actions__ = arrayCopy(this.__actions__);
+
+ actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
result.__chain__ = chainAll;
return result;
}
diff --git a/utility/property.js b/utility/property.js
index cd8024ba6..d6cb72fb1 100644
--- a/utility/property.js
+++ b/utility/property.js
@@ -18,7 +18,7 @@ define(['../internal/baseProperty'], function(baseProperty) {
* var getName = _.property('user');
*
* _.map(users, getName);
- * // => ['fred', barney']
+ * // => ['fred', 'barney']
*
* _.pluck(_.sortBy(users, getName), 'user');
* // => ['barney', 'fred']
diff --git a/utility/propertyOf.js b/utility/propertyOf.js
index a69ed064d..d506237df 100644
--- a/utility/propertyOf.js
+++ b/utility/propertyOf.js
@@ -4,7 +4,7 @@ define([], function() {
var undefined;
/**
- * The inverse of `_.property`; this method creates a function which returns
+ * The opposite of `_.property`; this method creates a function which returns
* the property value of a given key on `object`.
*
* @static