lodash-rails 3.6.0 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 369716b2bb1fae0f2112697dd79b425bbfee483f
4
- data.tar.gz: 4901ab398ff33011c875760f03a3b9d7267378a1
3
+ metadata.gz: acbbe1f3b24a2ea334617126bb2d94a6e7d3bb05
4
+ data.tar.gz: 8a613b8d22d1384e9e22669773e7684af4579e86
5
5
  SHA512:
6
- metadata.gz: 7ba51e2184c6dbfc56d7e97e3ac4af1f50b8bfeda62d848c82f1650fb52e03db5bb68c8b43d153c54bcec3866c4ff8d9e4236ef819cd8b816b3d6dfe7ab0b5ab
7
- data.tar.gz: bbaf1d78b8a5881f48eeb6c9748ed6be68da48d7b90913baf2c64f7c95adf0b528dcc5181f462f611c3442a817d28a883476012bdef9fbc05893682c69e55162
6
+ metadata.gz: e57eca4fd02abf4bd954a2f38eea63db6fd9a7f83f197160feb7548418fb06ab236655128a4b64aa2546748398445f7e215dfa08fb4b5b2e507ce4f55b91c713
7
+ data.tar.gz: 213b0f0b9492e9aa9baad0b9f1b2647a081a2ceecfc8e048f5440cf6a862988959b94b2c6f4952a12a13697e1a6acdd502bac3de6ead52edfa02fb6e0fce0881
data/README.md CHANGED
@@ -18,7 +18,7 @@ Add the necessary library to `app/assets/javascripts/application.js`:
18
18
 
19
19
  ## What's included?
20
20
 
21
- lodash 3.6.0:
21
+ lodash 3.7.0:
22
22
 
23
23
  * lodash.js
24
24
  * lodash.min.js
@@ -1,5 +1,5 @@
1
1
  module LoDash
2
2
  module Rails
3
- VERSION = "3.6.0"
3
+ VERSION = "3.7.0"
4
4
  end
5
5
  end
@@ -1,9 +1,9 @@
1
1
  /**
2
2
  * @license
3
- * lodash 3.6.0 (Custom Build) <https://lodash.com/>
3
+ * lodash 3.7.0 (Custom Build) <https://lodash.com/>
4
4
  * Build: `lodash compat -o ./lodash.js`
5
5
  * Copyright 2012-2015 The Dojo Foundation <http://dojofoundation.org/>
6
- * Based on Underscore.js 1.8.2 <http://underscorejs.org/LICENSE>
6
+ * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
7
7
  * Copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
8
8
  * Available under MIT license <https://lodash.com/license>
9
9
  */
@@ -13,7 +13,7 @@
13
13
  var undefined;
14
14
 
15
15
  /** Used as the semantic version number. */
16
- var VERSION = '3.6.0';
16
+ var VERSION = '3.7.0';
17
17
 
18
18
  /** Used to compose bitmasks for wrapper metadata. */
19
19
  var BIND_FLAG = 1,
@@ -87,24 +87,36 @@
87
87
  reEvaluate = /<%([\s\S]+?)%>/g,
88
88
  reInterpolate = /<%=([\s\S]+?)%>/g;
89
89
 
90
- /**
91
- * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
92
- */
93
- var reComboMarks = /[\u0300-\u036f\ufe20-\ufe23]/g;
90
+ /** Used to match property names within property paths. */
91
+ var reIsDeepProp = /\.|\[(?:[^[\]]+|(["'])(?:(?!\1)[^\n\\]|\\.)*?)\1\]/,
92
+ reIsPlainProp = /^\w*$/,
93
+ rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\n\\]|\\.)*?)\2)\]/g;
94
94
 
95
95
  /**
96
- * Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components).
96
+ * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).
97
+ * In addition to special characters the forward slash is escaped to allow for
98
+ * easier `eval` use and `Function` compilation.
97
99
  */
100
+ var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
101
+ reHasRegExpChars = RegExp(reRegExpChars.source);
102
+
103
+ /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
104
+ var reComboMark = /[\u0300-\u036f\ufe20-\ufe23]/g;
105
+
106
+ /** Used to match backslashes in property paths. */
107
+ var reEscapeChar = /\\(\\)?/g;
108
+
109
+ /** Used to match [ES template delimiters](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-template-literal-lexical-components). */
98
110
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
99
111
 
100
112
  /** Used to match `RegExp` flags from their coerced string values. */
101
113
  var reFlags = /\w*$/;
102
114
 
103
115
  /** Used to detect hexadecimal string values. */
104
- var reHexPrefix = /^0[xX]/;
116
+ var reHasHexPrefix = /^0[xX]/;
105
117
 
106
118
  /** Used to detect host constructors (Safari > 5). */
107
- var reHostCtor = /^\[object .+?Constructor\]$/;
119
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
108
120
 
109
121
  /** Used to match latin-1 supplementary letters (excluding mathematical operators). */
110
122
  var reLatin1 = /[\xc0-\xd6\xd8-\xde\xdf-\xf6\xf8-\xff]/g;
@@ -112,14 +124,6 @@
112
124
  /** Used to ensure capturing order of template delimiters. */
113
125
  var reNoMatch = /($^)/;
114
126
 
115
- /**
116
- * Used to match `RegExp` [special characters](http://www.regular-expressions.info/characters.html#special).
117
- * In addition to special characters the forward slash is escaped to allow for
118
- * easier `eval` use and `Function` compilation.
119
- */
120
- var reRegExpChars = /[.*+?^${}()|[\]\/\\]/g,
121
- reHasRegExpChars = RegExp(reRegExpChars.source);
122
-
123
127
  /** Used to match unescaped characters in compiled string literals. */
124
128
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
125
129
 
@@ -263,7 +267,7 @@
263
267
  var freeModule = objectTypes[typeof module] && module && !module.nodeType && module;
264
268
 
265
269
  /** Detect free variable `global` from Node.js. */
266
- var freeGlobal = freeExports && freeModule && typeof global == 'object' && global;
270
+ var freeGlobal = freeExports && freeModule && typeof global == 'object' && global && global.Object && global;
267
271
 
268
272
  /** Detect free variable `self`. */
269
273
  var freeSelf = objectTypes[typeof self] && self && self.Object && self;
@@ -298,10 +302,10 @@
298
302
  var valIsReflexive = value === value,
299
303
  othIsReflexive = other === other;
300
304
 
301
- if (value > other || !valIsReflexive || (typeof value == 'undefined' && othIsReflexive)) {
305
+ if (value > other || !valIsReflexive || (value === undefined && othIsReflexive)) {
302
306
  return 1;
303
307
  }
304
- if (value < other || !othIsReflexive || (typeof other == 'undefined' && valIsReflexive)) {
308
+ if (value < other || !othIsReflexive || (other === undefined && valIsReflexive)) {
305
309
  return -1;
306
310
  }
307
311
  }
@@ -444,7 +448,7 @@
444
448
  * Used by `_.sortByOrder` to compare multiple properties of each element
445
449
  * in a collection and stable sort them in the following order:
446
450
  *
447
- * If orders is unspecified, sort in ascending order for all properties.
451
+ * If `orders` is unspecified, sort in ascending order for all properties.
448
452
  * Otherwise, for each property, sort in ascending order if its corresponding value in
449
453
  * orders is true, and descending order if false.
450
454
  *
@@ -742,9 +746,6 @@
742
746
  /** Used to resolve the decompiled source of functions. */
743
747
  var fnToString = Function.prototype.toString;
744
748
 
745
- /** Used to the length of n-tuples for `_.unzip`. */
746
- var getLength = baseProperty('length');
747
-
748
749
  /** Used to check objects for own properties. */
749
750
  var hasOwnProperty = objectProto.hasOwnProperty;
750
751
 
@@ -761,7 +762,7 @@
761
762
  var oldDash = context._;
762
763
 
763
764
  /** Used to detect if a method is native. */
764
- var reNative = RegExp('^' +
765
+ var reIsNative = RegExp('^' +
765
766
  escapeRegExp(objToString)
766
767
  .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
767
768
  );
@@ -772,8 +773,10 @@
772
773
  ceil = Math.ceil,
773
774
  clearTimeout = context.clearTimeout,
774
775
  floor = Math.floor,
776
+ getOwnPropertySymbols = isNative(getOwnPropertySymbols = Object.getOwnPropertySymbols) && getOwnPropertySymbols,
775
777
  getPrototypeOf = isNative(getPrototypeOf = Object.getPrototypeOf) && getPrototypeOf,
776
778
  push = arrayProto.push,
779
+ preventExtensions = isNative(Object.preventExtensions = Object.preventExtensions) && preventExtensions,
777
780
  propertyIsEnumerable = objectProto.propertyIsEnumerable,
778
781
  Set = isNative(Set = context.Set) && Set,
779
782
  setTimeout = context.setTimeout,
@@ -793,6 +796,22 @@
793
796
  return result;
794
797
  }());
795
798
 
799
+ /** Used as `baseAssign`. */
800
+ var nativeAssign = (function() {
801
+ // Avoid `Object.assign` in Firefox 34-37 which have an early implementation
802
+ // with a now defunct try/catch behavior. See https://bugzilla.mozilla.org/show_bug.cgi?id=1103344
803
+ // for more details.
804
+ //
805
+ // Use `Object.preventExtensions` on a plain object instead of simply using
806
+ // `Object('x')` because Chrome and IE fail to throw an error when attempting
807
+ // to assign values to readonly indexes of strings in strict mode.
808
+ var object = { '1': 0 },
809
+ func = preventExtensions && isNative(func = Object.assign) && func;
810
+
811
+ try { func(preventExtensions(object), 'xo'); } catch(e) {}
812
+ return !object[1] && func;
813
+ }());
814
+
796
815
  /* Native method references for those with the same name as other `lodash` methods. */
797
816
  var nativeIsArray = isNative(nativeIsArray = Array.isArray) && nativeIsArray,
798
817
  nativeCreate = isNative(nativeCreate = Object.create) && nativeCreate,
@@ -898,8 +917,8 @@
898
917
  * `filter`, `flatten`, `flattenDeep`, `flow`, `flowRight`, `forEach`,
899
918
  * `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `functions`,
900
919
  * `groupBy`, `indexBy`, `initial`, `intersection`, `invert`, `invoke`, `keys`,
901
- * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`, `merge`,
902
- * `mixin`, `negate`, `noop`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
920
+ * `keysIn`, `map`, `mapValues`, `matches`, `matchesProperty`, `memoize`,
921
+ * `merge`, `mixin`, `negate`, `omit`, `once`, `pairs`, `partial`, `partialRight`,
903
922
  * `partition`, `pick`, `plant`, `pluck`, `property`, `propertyOf`, `pull`,
904
923
  * `pullAt`, `push`, `range`, `rearg`, `reject`, `remove`, `rest`, `reverse`,
905
924
  * `shuffle`, `slice`, `sort`, `sortBy`, `sortByAll`, `sortByOrder`, `splice`,
@@ -913,15 +932,15 @@
913
932
  * `endsWith`, `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
914
933
  * `findLast`, `findLastIndex`, `findLastKey`, `findWhere`, `first`, `has`,
915
934
  * `identity`, `includes`, `indexOf`, `inRange`, `isArguments`, `isArray`,
916
- * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`,
917
- * `isFinite`,`isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`,
918
- * `isObject`, `isPlainObject`, `isRegExp`, `isString`, `isUndefined`,
919
- * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`,
920
- * `noConflict`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`,
921
- * `random`, `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`,
922
- * `shift`, `size`, `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`,
923
- * `startCase`, `startsWith`, `sum`, `template`, `trim`, `trimLeft`,
924
- * `trimRight`, `trunc`, `unescape`, `uniqueId`, `value`, and `words`
935
+ * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isError`, `isFinite`
936
+ * `isFunction`, `isMatch`, `isNative`, `isNaN`, `isNull`, `isNumber`, `isObject`,
937
+ * `isPlainObject`, `isRegExp`, `isString`, `isUndefined`, `isTypedArray`,
938
+ * `join`, `kebabCase`, `last`, `lastIndexOf`, `max`, `min`, `noConflict`,
939
+ * `noop`, `now`, `pad`, `padLeft`, `padRight`, `parseInt`, `pop`, `random`,
940
+ * `reduce`, `reduceRight`, `repeat`, `result`, `runInContext`, `shift`, `size`,
941
+ * `snakeCase`, `some`, `sortedIndex`, `sortedLastIndex`, `startCase`, `startsWith`,
942
+ * `sum`, `template`, `trim`, `trimLeft`, `trimRight`, `trunc`, `unescape`,
943
+ * `uniqueId`, `value`, and `words`
925
944
  *
926
945
  * The wrapper method `sample` will return a wrapped value when `n` is provided,
927
946
  * otherwise an unwrapped value is returned.
@@ -936,8 +955,8 @@
936
955
  * var wrapped = _([1, 2, 3]);
937
956
  *
938
957
  * // returns an unwrapped value
939
- * wrapped.reduce(function(sum, n) {
940
- * return sum + n;
958
+ * wrapped.reduce(function(total, n) {
959
+ * return total + n;
941
960
  * });
942
961
  * // => 6
943
962
  *
@@ -997,11 +1016,11 @@
997
1016
  var support = lodash.support = {};
998
1017
 
999
1018
  (function(x) {
1000
- var Ctor = function() { this.x = 1; },
1001
- object = { '0': 1, 'length': 1 },
1019
+ var Ctor = function() { this.x = x; },
1020
+ object = { '0': x, 'length': x },
1002
1021
  props = [];
1003
1022
 
1004
- Ctor.prototype = { 'valueOf': 1, 'y': 1 };
1023
+ Ctor.prototype = { 'valueOf': x, 'y': x };
1005
1024
  for (var key in new Ctor) { props.push(key); }
1006
1025
 
1007
1026
  /**
@@ -1063,8 +1082,7 @@
1063
1082
  support.nodeTag = objToString.call(document) != objectTag;
1064
1083
 
1065
1084
  /**
1066
- * Detect if string indexes are non-enumerable
1067
- * (IE < 9, RingoJS, Rhino, Narwhal).
1085
+ * Detect if string indexes are non-enumerable (IE < 9, RingoJS, Rhino, Narwhal).
1068
1086
  *
1069
1087
  * @memberOf _.support
1070
1088
  * @type boolean
@@ -1072,8 +1090,7 @@
1072
1090
  support.nonEnumStrings = !propertyIsEnumerable.call('x', 0);
1073
1091
 
1074
1092
  /**
1075
- * Detect if properties shadowing those on `Object.prototype` are
1076
- * non-enumerable.
1093
+ * Detect if properties shadowing those on `Object.prototype` are non-enumerable.
1077
1094
  *
1078
1095
  * In IE < 9 an object's own properties, shadowing non-enumerable ones,
1079
1096
  * are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).
@@ -1095,11 +1112,11 @@
1095
1112
  * Detect if `Array#shift` and `Array#splice` augment array-like objects
1096
1113
  * correctly.
1097
1114
  *
1098
- * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array `shift()`
1099
- * and `splice()` functions that fail to remove the last element, `value[0]`,
1100
- * of array-like objects even though the `length` property is set to `0`.
1101
- * The `shift()` method is buggy in compatibility modes of IE 8, while `splice()`
1102
- * is buggy regardless of mode in IE < 9.
1115
+ * Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array
1116
+ * `shift()` and `splice()` functions that fail to remove the last element,
1117
+ * `value[0]`, of array-like objects even though the "length" property is
1118
+ * set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,
1119
+ * while `splice()` is buggy regardless of mode in IE < 9.
1103
1120
  *
1104
1121
  * @memberOf _.support
1105
1122
  * @type boolean
@@ -1135,8 +1152,8 @@
1135
1152
  * In Firefox < 4, IE < 9, PhantomJS, and Safari < 5.1 `arguments` object
1136
1153
  * indexes are non-enumerable. Chrome < 25 and Node.js < 0.11.0 treat
1137
1154
  * `arguments` object indexes as non-enumerable and fail `hasOwnProperty`
1138
- * checks for indexes that exceed their function's formal parameters with
1139
- * associated values of `0`.
1155
+ * checks for indexes that exceed the number of function parameters and
1156
+ * whose associated argument values are `0`.
1140
1157
  *
1141
1158
  * @memberOf _.support
1142
1159
  * @type boolean
@@ -1146,7 +1163,7 @@
1146
1163
  } catch(e) {
1147
1164
  support.nonEnumArgs = true;
1148
1165
  }
1149
- }(0, 0));
1166
+ }(1, 0));
1150
1167
 
1151
1168
  /**
1152
1169
  * By default, the template delimiters used by lodash are like those in
@@ -1393,7 +1410,7 @@
1393
1410
  }
1394
1411
 
1395
1412
  /**
1396
- * Adds `value` to `key` of the cache.
1413
+ * Sets `value` to `key` of the cache.
1397
1414
  *
1398
1415
  * @private
1399
1416
  * @name set
@@ -1726,13 +1743,13 @@
1726
1743
  * @returns {*} Returns the value to assign to the destination object.
1727
1744
  */
1728
1745
  function assignDefaults(objectValue, sourceValue) {
1729
- return typeof objectValue == 'undefined' ? sourceValue : objectValue;
1746
+ return objectValue === undefined ? sourceValue : objectValue;
1730
1747
  }
1731
1748
 
1732
1749
  /**
1733
1750
  * Used by `_.template` to customize its `_.assign` use.
1734
1751
  *
1735
- * **Note:** This method is like `assignDefaults` except that it ignores
1752
+ * **Note:** This function is like `assignDefaults` except that it ignores
1736
1753
  * inherited property values when checking if a property is `undefined`.
1737
1754
  *
1738
1755
  * @private
@@ -1743,26 +1760,26 @@
1743
1760
  * @returns {*} Returns the value to assign to the destination object.
1744
1761
  */
1745
1762
  function assignOwnDefaults(objectValue, sourceValue, key, object) {
1746
- return (typeof objectValue == 'undefined' || !hasOwnProperty.call(object, key))
1763
+ return (objectValue === undefined || !hasOwnProperty.call(object, key))
1747
1764
  ? sourceValue
1748
1765
  : objectValue;
1749
1766
  }
1750
1767
 
1751
1768
  /**
1752
- * The base implementation of `_.assign` without support for argument juggling,
1753
- * multiple sources, and `this` binding `customizer` functions.
1769
+ * A specialized version of `_.assign` for customizing assigned values without
1770
+ * support for argument juggling, multiple sources, and `this` binding `customizer`
1771
+ * functions.
1754
1772
  *
1755
1773
  * @private
1756
1774
  * @param {Object} object The destination object.
1757
1775
  * @param {Object} source The source object.
1758
- * @param {Function} [customizer] The function to customize assigning values.
1759
- * @returns {Object} Returns the destination object.
1776
+ * @param {Function} customizer The function to customize assigned values.
1777
+ * @returns {Object} Returns `object`.
1760
1778
  */
1761
- function baseAssign(object, source, customizer) {
1779
+ function assignWith(object, source, customizer) {
1762
1780
  var props = keys(source);
1763
- if (!customizer) {
1764
- return baseCopy(source, object, props);
1765
- }
1781
+ push.apply(props, getSymbols(source));
1782
+
1766
1783
  var index = -1,
1767
1784
  length = props.length;
1768
1785
 
@@ -1772,7 +1789,7 @@
1772
1789
  result = customizer(value, source[key], key, object, source);
1773
1790
 
1774
1791
  if ((result === result ? (result !== value) : (value === value)) ||
1775
- (typeof value == 'undefined' && !(key in object))) {
1792
+ (value === undefined && !(key in object))) {
1776
1793
  object[key] = result;
1777
1794
  }
1778
1795
  }
@@ -1780,12 +1797,27 @@
1780
1797
  }
1781
1798
 
1782
1799
  /**
1783
- * The base implementation of `_.at` without support for strings and individual
1784
- * key arguments.
1800
+ * The base implementation of `_.assign` without support for argument juggling,
1801
+ * multiple sources, and `customizer` functions.
1802
+ *
1803
+ * @private
1804
+ * @param {Object} object The destination object.
1805
+ * @param {Object} source The source object.
1806
+ * @returns {Object} Returns `object`.
1807
+ */
1808
+ var baseAssign = nativeAssign || function(object, source) {
1809
+ return source == null
1810
+ ? object
1811
+ : baseCopy(source, getSymbols(source), baseCopy(source, keys(source), object));
1812
+ };
1813
+
1814
+ /**
1815
+ * The base implementation of `_.at` without support for string collections
1816
+ * and individual key arguments.
1785
1817
  *
1786
1818
  * @private
1787
1819
  * @param {Array|Object} collection The collection to iterate over.
1788
- * @param {number[]|string[]} [props] The property names or indexes of elements to pick.
1820
+ * @param {number[]|string[]} props The property names or indexes of elements to pick.
1789
1821
  * @returns {Array} Returns the new array of picked elements.
1790
1822
  */
1791
1823
  function baseAt(collection, props) {
@@ -1798,7 +1830,6 @@
1798
1830
  while(++index < propsLength) {
1799
1831
  var key = props[index];
1800
1832
  if (isArr) {
1801
- key = parseFloat(key);
1802
1833
  result[index] = isIndex(key, length) ? collection[key] : undefined;
1803
1834
  } else {
1804
1835
  result[index] = collection[key];
@@ -1808,19 +1839,17 @@
1808
1839
  }
1809
1840
 
1810
1841
  /**
1811
- * Copies the properties of `source` to `object`.
1842
+ * Copies properties of `source` to `object`.
1812
1843
  *
1813
1844
  * @private
1814
1845
  * @param {Object} source The object to copy properties from.
1815
- * @param {Object} [object={}] The object to copy properties to.
1816
1846
  * @param {Array} props The property names to copy.
1847
+ * @param {Object} [object={}] The object to copy properties to.
1817
1848
  * @returns {Object} Returns `object`.
1818
1849
  */
1819
- function baseCopy(source, object, props) {
1820
- if (!props) {
1821
- props = object;
1822
- object = {};
1823
- }
1850
+ function baseCopy(source, props, object) {
1851
+ object || (object = {});
1852
+
1824
1853
  var index = -1,
1825
1854
  length = props.length;
1826
1855
 
@@ -1844,7 +1873,7 @@
1844
1873
  function baseCallback(func, thisArg, argCount) {
1845
1874
  var type = typeof func;
1846
1875
  if (type == 'function') {
1847
- return typeof thisArg == 'undefined'
1876
+ return thisArg === undefined
1848
1877
  ? func
1849
1878
  : bindCallback(func, thisArg, argCount);
1850
1879
  }
@@ -1854,9 +1883,9 @@
1854
1883
  if (type == 'object') {
1855
1884
  return baseMatches(func);
1856
1885
  }
1857
- return typeof thisArg == 'undefined'
1858
- ? baseProperty(func + '')
1859
- : baseMatchesProperty(func + '', thisArg);
1886
+ return thisArg === undefined
1887
+ ? property(func)
1888
+ : baseMatchesProperty(func, thisArg);
1860
1889
  }
1861
1890
 
1862
1891
  /**
@@ -1878,7 +1907,7 @@
1878
1907
  if (customizer) {
1879
1908
  result = object ? customizer(value, key, object) : customizer(value);
1880
1909
  }
1881
- if (typeof result != 'undefined') {
1910
+ if (result !== undefined) {
1882
1911
  return result;
1883
1912
  }
1884
1913
  if (!isObject(value)) {
@@ -1900,7 +1929,7 @@
1900
1929
  }
1901
1930
  result = initCloneObject(isFunc ? {} : value);
1902
1931
  if (!isDeep) {
1903
- return baseCopy(value, result, keys(value));
1932
+ return baseAssign(result, value);
1904
1933
  }
1905
1934
  } else {
1906
1935
  return cloneableTags[tag]
@@ -2071,7 +2100,7 @@
2071
2100
  if (start < 0) {
2072
2101
  start = -start > length ? 0 : (length + start);
2073
2102
  }
2074
- end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);
2103
+ end = (end === undefined || end > length) ? length : (+end || 0);
2075
2104
  if (end < 0) {
2076
2105
  end += length;
2077
2106
  }
@@ -2168,7 +2197,7 @@
2168
2197
  /**
2169
2198
  * The base implementation of `baseForIn` and `baseForOwn` which iterates
2170
2199
  * over `object` properties returned by `keysFunc` invoking `iteratee` for
2171
- * each property. Iterator functions may exit iteration early by explicitly
2200
+ * each property. Iteratee functions may exit iteration early by explicitly
2172
2201
  * returning `false`.
2173
2202
  *
2174
2203
  * @private
@@ -2254,6 +2283,33 @@
2254
2283
  return result;
2255
2284
  }
2256
2285
 
2286
+ /**
2287
+ * The base implementation of `get` without support for string paths
2288
+ * and default values.
2289
+ *
2290
+ * @private
2291
+ * @param {Object} object The object to query.
2292
+ * @param {Array} path The path of the property to get.
2293
+ * @param {string} [pathKey] The key representation of path.
2294
+ * @returns {*} Returns the resolved value.
2295
+ */
2296
+ function baseGet(object, path, pathKey) {
2297
+ if (object == null) {
2298
+ return;
2299
+ }
2300
+ object = toObject(object);
2301
+ if (pathKey !== undefined && pathKey in object) {
2302
+ path = [pathKey];
2303
+ }
2304
+ var index = -1,
2305
+ length = path.length;
2306
+
2307
+ while (object != null && ++index < length) {
2308
+ var result = object = toObject(object)[path[index]];
2309
+ }
2310
+ return result;
2311
+ }
2312
+
2257
2313
  /**
2258
2314
  * The base implementation of `_.isEqual` without support for `this` binding
2259
2315
  * `customizer` functions.
@@ -2322,27 +2378,23 @@
2322
2378
  othIsArr = isTypedArray(other);
2323
2379
  }
2324
2380
  }
2325
- var objIsObj = (objTag == objectTag || (isLoose && objTag == funcTag)) && !isHostObject(object),
2326
- othIsObj = (othTag == objectTag || (isLoose && othTag == funcTag)) && !isHostObject(other),
2381
+ var objIsObj = objTag == objectTag && !isHostObject(object),
2382
+ othIsObj = othTag == objectTag && !isHostObject(other),
2327
2383
  isSameTag = objTag == othTag;
2328
2384
 
2329
2385
  if (isSameTag && !(objIsArr || objIsObj)) {
2330
2386
  return equalByTag(object, other, objTag);
2331
2387
  }
2332
- if (isLoose) {
2333
- if (!isSameTag && !(objIsObj && othIsObj)) {
2334
- return false;
2335
- }
2336
- } else {
2388
+ if (!isLoose) {
2337
2389
  var valWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
2338
2390
  othWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
2339
2391
 
2340
2392
  if (valWrapped || othWrapped) {
2341
2393
  return equalFunc(valWrapped ? object.value() : object, othWrapped ? other.value() : other, customizer, isLoose, stackA, stackB);
2342
2394
  }
2343
- if (!isSameTag) {
2344
- return false;
2345
- }
2395
+ }
2396
+ if (!isSameTag) {
2397
+ return false;
2346
2398
  }
2347
2399
  // Assume cyclic values are equal.
2348
2400
  // For more information on detecting circular references see https://es5.github.io/#JO.
@@ -2399,10 +2451,10 @@
2399
2451
  srcValue = values[index];
2400
2452
 
2401
2453
  if (noCustomizer && strictCompareFlags[index]) {
2402
- var result = typeof objValue != 'undefined' || (key in object);
2454
+ var result = objValue !== undefined || (key in object);
2403
2455
  } else {
2404
2456
  result = customizer ? customizer(objValue, srcValue, key) : undefined;
2405
- if (typeof result == 'undefined') {
2457
+ if (result === undefined) {
2406
2458
  result = baseIsEqual(srcValue, objValue, customizer, true);
2407
2459
  }
2408
2460
  }
@@ -2423,9 +2475,12 @@
2423
2475
  * @returns {Array} Returns the new mapped array.
2424
2476
  */
2425
2477
  function baseMap(collection, iteratee) {
2426
- var result = [];
2478
+ var index = -1,
2479
+ length = getLength(collection),
2480
+ result = isLength(length) ? Array(length) : [];
2481
+
2427
2482
  baseEach(collection, function(value, key, collection) {
2428
- result.push(iteratee(value, key, collection));
2483
+ result[++index] = iteratee(value, key, collection);
2429
2484
  });
2430
2485
  return result;
2431
2486
  }
@@ -2450,8 +2505,11 @@
2450
2505
 
2451
2506
  if (isStrictComparable(value)) {
2452
2507
  return function(object) {
2453
- return object != null && object[key] === value &&
2454
- (typeof value != 'undefined' || (key in toObject(object)));
2508
+ if (object == null) {
2509
+ return false;
2510
+ }
2511
+ object = toObject(object);
2512
+ return object[key] === value && (value !== undefined || (key in object));
2455
2513
  };
2456
2514
  }
2457
2515
  }
@@ -2469,23 +2527,37 @@
2469
2527
  }
2470
2528
 
2471
2529
  /**
2472
- * The base implementation of `_.matchesProperty` which does not coerce `key`
2473
- * to a string.
2530
+ * The base implementation of `_.matchesProperty` which does not which does
2531
+ * not clone `value`.
2474
2532
  *
2475
2533
  * @private
2476
- * @param {string} key The key of the property to get.
2534
+ * @param {string} path The path of the property to get.
2477
2535
  * @param {*} value The value to compare.
2478
2536
  * @returns {Function} Returns the new function.
2479
2537
  */
2480
- function baseMatchesProperty(key, value) {
2481
- if (isStrictComparable(value)) {
2482
- return function(object) {
2483
- return object != null && object[key] === value &&
2484
- (typeof value != 'undefined' || (key in toObject(object)));
2485
- };
2486
- }
2538
+ function baseMatchesProperty(path, value) {
2539
+ var isArr = isArray(path),
2540
+ isCommon = isKey(path) && isStrictComparable(value),
2541
+ pathKey = (path + '');
2542
+
2543
+ path = toPath(path);
2487
2544
  return function(object) {
2488
- return object != null && baseIsEqual(value, object[key], null, true);
2545
+ if (object == null) {
2546
+ return false;
2547
+ }
2548
+ var key = pathKey;
2549
+ object = toObject(object);
2550
+ if ((isArr || !isCommon) && !(key in object)) {
2551
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
2552
+ if (object == null) {
2553
+ return false;
2554
+ }
2555
+ key = last(path);
2556
+ object = toObject(object);
2557
+ }
2558
+ return object[key] === value
2559
+ ? (value !== undefined || (key in object))
2560
+ : baseIsEqual(value, object[key], null, true);
2489
2561
  };
2490
2562
  }
2491
2563
 
@@ -2499,29 +2571,39 @@
2499
2571
  * @param {Function} [customizer] The function to customize merging properties.
2500
2572
  * @param {Array} [stackA=[]] Tracks traversed source objects.
2501
2573
  * @param {Array} [stackB=[]] Associates values with source counterparts.
2502
- * @returns {Object} Returns the destination object.
2574
+ * @returns {Object} Returns `object`.
2503
2575
  */
2504
2576
  function baseMerge(object, source, customizer, stackA, stackB) {
2505
2577
  if (!isObject(object)) {
2506
2578
  return object;
2507
2579
  }
2508
2580
  var isSrcArr = isLength(source.length) && (isArray(source) || isTypedArray(source));
2509
- (isSrcArr ? arrayEach : baseForOwn)(source, function(srcValue, key, source) {
2581
+ if (!isSrcArr) {
2582
+ var props = keys(source);
2583
+ push.apply(props, getSymbols(source));
2584
+ }
2585
+ arrayEach(props || source, function(srcValue, key) {
2586
+ if (props) {
2587
+ key = srcValue;
2588
+ srcValue = source[key];
2589
+ }
2510
2590
  if (isObjectLike(srcValue)) {
2511
2591
  stackA || (stackA = []);
2512
2592
  stackB || (stackB = []);
2513
- return baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
2593
+ baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
2514
2594
  }
2515
- var value = object[key],
2516
- result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
2517
- isCommon = typeof result == 'undefined';
2595
+ else {
2596
+ var value = object[key],
2597
+ result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
2598
+ isCommon = result === undefined;
2518
2599
 
2519
- if (isCommon) {
2520
- result = srcValue;
2521
- }
2522
- if ((isSrcArr || typeof result != 'undefined') &&
2523
- (isCommon || (result === result ? (result !== value) : (value === value)))) {
2524
- object[key] = result;
2600
+ if (isCommon) {
2601
+ result = srcValue;
2602
+ }
2603
+ if ((isSrcArr || result !== undefined) &&
2604
+ (isCommon || (result === result ? (result !== value) : (value === value)))) {
2605
+ object[key] = result;
2606
+ }
2525
2607
  }
2526
2608
  });
2527
2609
  return object;
@@ -2554,14 +2636,14 @@
2554
2636
  }
2555
2637
  var value = object[key],
2556
2638
  result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
2557
- isCommon = typeof result == 'undefined';
2639
+ isCommon = result === undefined;
2558
2640
 
2559
2641
  if (isCommon) {
2560
2642
  result = srcValue;
2561
2643
  if (isLength(srcValue.length) && (isArray(srcValue) || isTypedArray(srcValue))) {
2562
2644
  result = isArray(value)
2563
2645
  ? value
2564
- : ((value && value.length) ? arrayCopy(value) : []);
2646
+ : (getLength(value) ? arrayCopy(value) : []);
2565
2647
  }
2566
2648
  else if (isPlainObject(srcValue) || isArguments(srcValue)) {
2567
2649
  result = isArguments(value)
@@ -2586,7 +2668,7 @@
2586
2668
  }
2587
2669
 
2588
2670
  /**
2589
- * The base implementation of `_.property` which does not coerce `key` to a string.
2671
+ * The base implementation of `_.property` without support for deep paths.
2590
2672
  *
2591
2673
  * @private
2592
2674
  * @param {string} key The key of the property to get.
@@ -2594,10 +2676,46 @@
2594
2676
  */
2595
2677
  function baseProperty(key) {
2596
2678
  return function(object) {
2597
- return object == null ? undefined : object[key];
2679
+ return object == null ? undefined : toObject(object)[key];
2598
2680
  };
2599
2681
  }
2600
2682
 
2683
+ /**
2684
+ * A specialized version of `baseProperty` which supports deep paths.
2685
+ *
2686
+ * @private
2687
+ * @param {Array|string} path The path of the property to get.
2688
+ * @returns {Function} Returns the new function.
2689
+ */
2690
+ function basePropertyDeep(path) {
2691
+ var pathKey = (path + '');
2692
+ path = toPath(path);
2693
+ return function(object) {
2694
+ return baseGet(object, path, pathKey);
2695
+ };
2696
+ }
2697
+
2698
+ /**
2699
+ * The base implementation of `_.pullAt` without support for individual
2700
+ * index arguments and capturing the removed elements.
2701
+ *
2702
+ * @private
2703
+ * @param {Array} array The array to modify.
2704
+ * @param {number[]} indexes The indexes of elements to remove.
2705
+ * @returns {Array} Returns `array`.
2706
+ */
2707
+ function basePullAt(array, indexes) {
2708
+ var length = indexes.length;
2709
+ while (length--) {
2710
+ var index = parseFloat(indexes[length]);
2711
+ if (index != previous && isIndex(index)) {
2712
+ var previous = index;
2713
+ splice.call(array, index, 1);
2714
+ }
2715
+ }
2716
+ return array;
2717
+ }
2718
+
2601
2719
  /**
2602
2720
  * The base implementation of `_.random` without support for argument juggling
2603
2721
  * and returning floating-point numbers.
@@ -2664,7 +2782,7 @@
2664
2782
  if (start < 0) {
2665
2783
  start = -start > length ? 0 : (length + start);
2666
2784
  }
2667
- end = (typeof end == 'undefined' || end > length) ? length : (+end || 0);
2785
+ end = (end === undefined || end > length) ? length : (+end || 0);
2668
2786
  if (end < 0) {
2669
2787
  end += length;
2670
2788
  }
@@ -2723,23 +2841,19 @@
2723
2841
  *
2724
2842
  * @private
2725
2843
  * @param {Array|Object|string} collection The collection to iterate over.
2726
- * @param {string[]} props The property names to sort by.
2727
- * @param {boolean[]} orders The sort orders of `props`.
2844
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
2845
+ * @param {boolean[]} orders The sort orders of `iteratees`.
2728
2846
  * @returns {Array} Returns the new sorted array.
2729
2847
  */
2730
- function baseSortByOrder(collection, props, orders) {
2731
- var index = -1,
2732
- length = collection.length,
2733
- result = isLength(length) ? Array(length) : [];
2848
+ function baseSortByOrder(collection, iteratees, orders) {
2849
+ var callback = getCallback(),
2850
+ index = -1;
2734
2851
 
2735
- baseEach(collection, function(value) {
2736
- var length = props.length,
2737
- criteria = Array(length);
2852
+ iteratees = arrayMap(iteratees, function(iteratee) { return callback(iteratee); });
2738
2853
 
2739
- while (length--) {
2740
- criteria[length] = value == null ? undefined : value[props[length]];
2741
- }
2742
- result[++index] = { 'criteria': criteria, 'index': index, 'value': value };
2854
+ var result = baseMap(collection, function(value) {
2855
+ var criteria = arrayMap(iteratees, function(iteratee) { return iteratee(value); });
2856
+ return { 'criteria': criteria, 'index': ++index, 'value': value };
2743
2857
  });
2744
2858
 
2745
2859
  return baseSortBy(result, function(object, other) {
@@ -2819,7 +2933,7 @@
2819
2933
  /**
2820
2934
  * The base implementation of `_.values` and `_.valuesIn` which creates an
2821
2935
  * array of `object` property values corresponding to the property names
2822
- * returned by `keysFunc`.
2936
+ * of `props`.
2823
2937
  *
2824
2938
  * @private
2825
2939
  * @param {Object} object The object to query.
@@ -2936,7 +3050,7 @@
2936
3050
  var low = 0,
2937
3051
  high = array ? array.length : 0,
2938
3052
  valIsNaN = value !== value,
2939
- valIsUndef = typeof value == 'undefined';
3053
+ valIsUndef = value === undefined;
2940
3054
 
2941
3055
  while (low < high) {
2942
3056
  var mid = floor((low + high) / 2),
@@ -2946,7 +3060,7 @@
2946
3060
  if (valIsNaN) {
2947
3061
  var setLow = isReflexive || retHighest;
2948
3062
  } else if (valIsUndef) {
2949
- setLow = isReflexive && (retHighest || typeof computed != 'undefined');
3063
+ setLow = isReflexive && (retHighest || computed !== undefined);
2950
3064
  } else {
2951
3065
  setLow = retHighest ? (computed <= value) : (computed < value);
2952
3066
  }
@@ -2973,7 +3087,7 @@
2973
3087
  if (typeof func != 'function') {
2974
3088
  return identity;
2975
3089
  }
2976
- if (typeof thisArg == 'undefined') {
3090
+ if (thisArg === undefined) {
2977
3091
  return func;
2978
3092
  }
2979
3093
  switch (argCount) {
@@ -3133,38 +3247,32 @@
3133
3247
  * @returns {Function} Returns the new assigner function.
3134
3248
  */
3135
3249
  function createAssigner(assigner) {
3136
- return function() {
3137
- var args = arguments,
3138
- length = args.length,
3139
- object = args[0];
3140
-
3141
- if (length < 2 || object == null) {
3142
- return object;
3143
- }
3144
- var customizer = args[length - 2],
3145
- thisArg = args[length - 1],
3146
- guard = args[3];
3250
+ return restParam(function(object, sources) {
3251
+ var index = -1,
3252
+ length = object == null ? 0 : sources.length,
3253
+ customizer = length > 2 && sources[length - 2],
3254
+ guard = length > 2 && sources[2],
3255
+ thisArg = length > 1 && sources[length - 1];
3147
3256
 
3148
- if (length > 3 && typeof customizer == 'function') {
3257
+ if (typeof customizer == 'function') {
3149
3258
  customizer = bindCallback(customizer, thisArg, 5);
3150
3259
  length -= 2;
3151
3260
  } else {
3152
- customizer = (length > 2 && typeof thisArg == 'function') ? thisArg : null;
3261
+ customizer = typeof thisArg == 'function' ? thisArg : null;
3153
3262
  length -= (customizer ? 1 : 0);
3154
3263
  }
3155
- if (guard && isIterateeCall(args[1], args[2], guard)) {
3156
- customizer = length == 3 ? null : customizer;
3157
- length = 2;
3264
+ if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3265
+ customizer = length < 3 ? null : customizer;
3266
+ length = 1;
3158
3267
  }
3159
- var index = 0;
3160
3268
  while (++index < length) {
3161
- var source = args[index];
3269
+ var source = sources[index];
3162
3270
  if (source) {
3163
3271
  assigner(object, source, customizer);
3164
3272
  }
3165
3273
  }
3166
3274
  return object;
3167
- };
3275
+ });
3168
3276
  }
3169
3277
 
3170
3278
  /**
@@ -3177,7 +3285,7 @@
3177
3285
  */
3178
3286
  function createBaseEach(eachFunc, fromRight) {
3179
3287
  return function(collection, iteratee) {
3180
- var length = collection ? collection.length : 0;
3288
+ var length = collection ? getLength(collection) : 0;
3181
3289
  if (!isLength(length)) {
3182
3290
  return eachFunc(collection, iteratee);
3183
3291
  }
@@ -3454,7 +3562,7 @@
3454
3562
  */
3455
3563
  function createForEach(arrayFunc, eachFunc) {
3456
3564
  return function(collection, iteratee, thisArg) {
3457
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
3565
+ return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
3458
3566
  ? arrayFunc(collection, iteratee)
3459
3567
  : eachFunc(collection, bindCallback(iteratee, thisArg, 3));
3460
3568
  };
@@ -3469,7 +3577,7 @@
3469
3577
  */
3470
3578
  function createForIn(objectFunc) {
3471
3579
  return function(object, iteratee, thisArg) {
3472
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
3580
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
3473
3581
  iteratee = bindCallback(iteratee, thisArg, 3);
3474
3582
  }
3475
3583
  return objectFunc(object, iteratee, keysIn);
@@ -3485,7 +3593,7 @@
3485
3593
  */
3486
3594
  function createForOwn(objectFunc) {
3487
3595
  return function(object, iteratee, thisArg) {
3488
- if (typeof iteratee != 'function' || typeof thisArg != 'undefined') {
3596
+ if (typeof iteratee != 'function' || thisArg !== undefined) {
3489
3597
  iteratee = bindCallback(iteratee, thisArg, 3);
3490
3598
  }
3491
3599
  return objectFunc(object, iteratee);
@@ -3532,7 +3640,7 @@
3532
3640
  function createReduce(arrayFunc, eachFunc) {
3533
3641
  return function(collection, iteratee, accumulator, thisArg) {
3534
3642
  var initFromArray = arguments.length < 3;
3535
- return (typeof iteratee == 'function' && typeof thisArg == 'undefined' && isArray(collection))
3643
+ return (typeof iteratee == 'function' && thisArg === undefined && isArray(collection))
3536
3644
  ? arrayFunc(collection, iteratee, accumulator, initFromArray)
3537
3645
  : baseReduce(collection, getCallback(iteratee, thisArg, 4), accumulator, initFromArray, eachFunc);
3538
3646
  };
@@ -3801,7 +3909,7 @@
3801
3909
  ? customizer(othValue, arrValue, index)
3802
3910
  : customizer(arrValue, othValue, index);
3803
3911
  }
3804
- if (typeof result == 'undefined') {
3912
+ if (result === undefined) {
3805
3913
  // Recursively compare arrays (susceptible to call stack limits).
3806
3914
  if (isLoose) {
3807
3915
  var othIndex = othLength;
@@ -3900,7 +4008,7 @@
3900
4008
  ? customizer(othValue, objValue, key)
3901
4009
  : customizer(objValue, othValue, key);
3902
4010
  }
3903
- if (typeof result == 'undefined') {
4011
+ if (result === undefined) {
3904
4012
  // Recursively compare objects (susceptible to call stack limits).
3905
4013
  result = (objValue && objValue === othValue) || equalFunc(objValue, othValue, customizer, isLoose, stackA, stackB);
3906
4014
  }
@@ -4025,6 +4133,29 @@
4025
4133
  return collection ? result(collection, target, fromIndex) : result;
4026
4134
  }
4027
4135
 
4136
+ /**
4137
+ * Gets the "length" property value of `object`.
4138
+ *
4139
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
4140
+ * in Safari on iOS 8.1 ARM64.
4141
+ *
4142
+ * @private
4143
+ * @param {Object} object The object to query.
4144
+ * @returns {*} Returns the "length" value.
4145
+ */
4146
+ var getLength = baseProperty('length');
4147
+
4148
+ /**
4149
+ * Creates an array of the own symbols of `object`.
4150
+ *
4151
+ * @private
4152
+ * @param {Object} object The object to query.
4153
+ * @returns {Array} Returns the array of symbols.
4154
+ */
4155
+ var getSymbols = !getOwnPropertySymbols ? constant([]) : function(object) {
4156
+ return getOwnPropertySymbols(toObject(object));
4157
+ };
4158
+
4028
4159
  /**
4029
4160
  * Gets the view, applying any `transforms` to the `start` and `end` positions.
4030
4161
  *
@@ -4093,7 +4224,6 @@
4093
4224
  * **Note:** This function only supports cloning values with tags of
4094
4225
  * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
4095
4226
  *
4096
- *
4097
4227
  * @private
4098
4228
  * @param {Object} object The object to clone.
4099
4229
  * @param {string} tag The `toStringTag` of the object to clone.
@@ -4131,6 +4261,25 @@
4131
4261
  return result;
4132
4262
  }
4133
4263
 
4264
+ /**
4265
+ * Invokes the method at `path` on `object`.
4266
+ *
4267
+ * @private
4268
+ * @param {Object} object The object to query.
4269
+ * @param {Array|string} path The path of the method to invoke.
4270
+ * @param {Array} args The arguments to invoke the method with.
4271
+ * @returns {*} Returns the result of the invoked method.
4272
+ */
4273
+ function invokePath(object, path, args) {
4274
+ if (object != null && !isKey(path, object)) {
4275
+ path = toPath(path);
4276
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
4277
+ path = last(path);
4278
+ }
4279
+ var func = object == null ? object : object[path];
4280
+ return func == null ? undefined : func.apply(object, args);
4281
+ }
4282
+
4134
4283
  /**
4135
4284
  * Checks if `value` is a valid array-like index.
4136
4285
  *
@@ -4160,7 +4309,7 @@
4160
4309
  }
4161
4310
  var type = typeof index;
4162
4311
  if (type == 'number') {
4163
- var length = object.length,
4312
+ var length = getLength(object),
4164
4313
  prereq = isLength(length) && isIndex(index, length);
4165
4314
  } else {
4166
4315
  prereq = type == 'string' && index in object;
@@ -4172,6 +4321,26 @@
4172
4321
  return false;
4173
4322
  }
4174
4323
 
4324
+ /**
4325
+ * Checks if `value` is a property name and not a property path.
4326
+ *
4327
+ * @private
4328
+ * @param {*} value The value to check.
4329
+ * @param {Object} [object] The object to query keys on.
4330
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
4331
+ */
4332
+ function isKey(value, object) {
4333
+ var type = typeof value;
4334
+ if ((type == 'string' && reIsPlainProp.test(value)) || type == 'number') {
4335
+ return true;
4336
+ }
4337
+ if (isArray(value)) {
4338
+ return false;
4339
+ }
4340
+ var result = !reIsDeepProp.test(value);
4341
+ return result || (object != null && value in toObject(object));
4342
+ }
4343
+
4175
4344
  /**
4176
4345
  * Checks if `func` has a lazy counterpart.
4177
4346
  *
@@ -4281,7 +4450,7 @@
4281
4450
 
4282
4451
  /**
4283
4452
  * A specialized version of `_.pick` that picks `object` properties specified
4284
- * by the `props` array.
4453
+ * by `props`.
4285
4454
  *
4286
4455
  * @private
4287
4456
  * @param {Object} object The source object.
@@ -4415,7 +4584,7 @@
4415
4584
  baseForIn(value, function(subValue, key) {
4416
4585
  result = key;
4417
4586
  });
4418
- return typeof result == 'undefined' || hasOwnProperty.call(value, result);
4587
+ return result === undefined || hasOwnProperty.call(value, result);
4419
4588
  }
4420
4589
 
4421
4590
  /**
@@ -4423,7 +4592,7 @@
4423
4592
  * own enumerable property names of `object`.
4424
4593
  *
4425
4594
  * @private
4426
- * @param {Object} object The object to inspect.
4595
+ * @param {Object} object The object to query.
4427
4596
  * @returns {Array} Returns the array of property names.
4428
4597
  */
4429
4598
  function shimKeys(object) {
@@ -4459,7 +4628,7 @@
4459
4628
  if (value == null) {
4460
4629
  return [];
4461
4630
  }
4462
- if (!isLength(value.length)) {
4631
+ if (!isLength(getLength(value))) {
4463
4632
  return values(value);
4464
4633
  }
4465
4634
  if (lodash.support.unindexedChars && isString(value)) {
@@ -4489,6 +4658,24 @@
4489
4658
  return isObject(value) ? value : Object(value);
4490
4659
  }
4491
4660
 
4661
+ /**
4662
+ * Converts `value` to property path array if it is not one.
4663
+ *
4664
+ * @private
4665
+ * @param {*} value The value to process.
4666
+ * @returns {Array} Returns the property path array.
4667
+ */
4668
+ function toPath(value) {
4669
+ if (isArray(value)) {
4670
+ return value;
4671
+ }
4672
+ var result = [];
4673
+ baseToString(value).replace(rePropName, function(match, number, quote, string) {
4674
+ result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
4675
+ });
4676
+ return result;
4677
+ }
4678
+
4492
4679
  /**
4493
4680
  * Creates a clone of `wrapper`.
4494
4681
  *
@@ -5073,7 +5260,8 @@
5073
5260
  argsLength = arguments.length,
5074
5261
  caches = [],
5075
5262
  indexOf = getIndexOf(),
5076
- isCommon = indexOf == baseIndexOf;
5263
+ isCommon = indexOf == baseIndexOf,
5264
+ result = [];
5077
5265
 
5078
5266
  while (++argsIndex < argsLength) {
5079
5267
  var value = arguments[argsIndex];
@@ -5083,10 +5271,12 @@
5083
5271
  }
5084
5272
  }
5085
5273
  argsLength = args.length;
5274
+ if (argsLength < 2) {
5275
+ return result;
5276
+ }
5086
5277
  var array = args[0],
5087
5278
  index = -1,
5088
5279
  length = array ? array.length : 0,
5089
- result = [],
5090
5280
  seen = caches[0];
5091
5281
 
5092
5282
  outer:
@@ -5254,17 +5444,8 @@
5254
5444
  array || (array = []);
5255
5445
  indexes = baseFlatten(indexes);
5256
5446
 
5257
- var length = indexes.length,
5258
- result = baseAt(array, indexes);
5259
-
5260
- indexes.sort(baseCompareAscending);
5261
- while (length--) {
5262
- var index = parseFloat(indexes[length]);
5263
- if (index != previous && isIndex(index)) {
5264
- var previous = index;
5265
- splice.call(array, index, 1);
5266
- }
5267
- }
5447
+ var result = baseAt(array, indexes);
5448
+ basePullAt(array, indexes.sort(baseCompareAscending));
5268
5449
  return result;
5269
5450
  });
5270
5451
 
@@ -5308,19 +5489,23 @@
5308
5489
  * // => [2, 4]
5309
5490
  */
5310
5491
  function remove(array, predicate, thisArg) {
5492
+ var result = [];
5493
+ if (!(array && array.length)) {
5494
+ return result;
5495
+ }
5311
5496
  var index = -1,
5312
- length = array ? array.length : 0,
5313
- result = [];
5497
+ indexes = [],
5498
+ length = array.length;
5314
5499
 
5315
5500
  predicate = getCallback(predicate, thisArg, 3);
5316
5501
  while (++index < length) {
5317
5502
  var value = array[index];
5318
5503
  if (predicate(value, index, array)) {
5319
5504
  result.push(value);
5320
- splice.call(array, index--, 1);
5321
- length--;
5505
+ indexes.push(index);
5322
5506
  }
5323
5507
  }
5508
+ basePullAt(array, indexes);
5324
5509
  return result;
5325
5510
  }
5326
5511
 
@@ -5345,7 +5530,7 @@
5345
5530
  /**
5346
5531
  * Creates a slice of `array` from `start` up to, but not including, `end`.
5347
5532
  *
5348
- * **Note:** This function is used instead of `Array#slice` to support node
5533
+ * **Note:** This method is used instead of `Array#slice` to support node
5349
5534
  * lists in IE < 9 and to ensure dense arrays are returned.
5350
5535
  *
5351
5536
  * @static
@@ -5644,12 +5829,13 @@
5644
5829
  });
5645
5830
 
5646
5831
  /**
5647
- * Creates a duplicate-value-free version of an array using `SameValueZero`
5648
- * for equality comparisons. Providing `true` for `isSorted` performs a faster
5649
- * search algorithm for sorted arrays. If an iteratee function is provided it
5650
- * is invoked for each value in the array to generate the criterion by which
5651
- * uniqueness is computed. The `iteratee` is bound to `thisArg` and invoked
5652
- * with three arguments: (value, index, array).
5832
+ * Creates a duplicate-free version of an array, using `SameValueZero` for
5833
+ * equality comparisons, in which only the first occurence of each element
5834
+ * is kept. Providing `true` for `isSorted` performs a faster search algorithm
5835
+ * for sorted arrays. If an iteratee function is provided it is invoked for
5836
+ * each element in the array to generate the criterion by which uniqueness
5837
+ * is computed. The `iteratee` is bound to `thisArg` and invoked with three
5838
+ * arguments: (value, index, array).
5653
5839
  *
5654
5840
  * If a property name is provided for `iteratee` the created `_.property`
5655
5841
  * style callback returns the property value of the given element.
@@ -5677,8 +5863,8 @@
5677
5863
  * @returns {Array} Returns the new duplicate-value-free array.
5678
5864
  * @example
5679
5865
  *
5680
- * _.uniq([1, 2, 1]);
5681
- * // => [1, 2]
5866
+ * _.uniq([2, 1, 2]);
5867
+ * // => [2, 1]
5682
5868
  *
5683
5869
  * // using `isSorted`
5684
5870
  * _.uniq([1, 1, 2], true);
@@ -6128,7 +6314,7 @@
6128
6314
  * // => ['barney', 'pebbles']
6129
6315
  */
6130
6316
  var at = restParam(function(collection, props) {
6131
- var length = collection ? collection.length : 0;
6317
+ var length = collection ? getLength(collection) : 0;
6132
6318
  if (isLength(length)) {
6133
6319
  collection = toIterable(collection);
6134
6320
  }
@@ -6233,7 +6419,7 @@
6233
6419
  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
6234
6420
  predicate = null;
6235
6421
  }
6236
- if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
6422
+ if (typeof predicate != 'function' || thisArg !== undefined) {
6237
6423
  predicate = getCallback(predicate, thisArg, 3);
6238
6424
  }
6239
6425
  return func(collection, predicate);
@@ -6403,10 +6589,10 @@
6403
6589
  /**
6404
6590
  * Iterates over elements of `collection` invoking `iteratee` for each element.
6405
6591
  * The `iteratee` is bound to `thisArg` and invoked with three arguments:
6406
- * (value, index|key, collection). Iterator functions may exit iteration early
6592
+ * (value, index|key, collection). Iteratee functions may exit iteration early
6407
6593
  * by explicitly returning `false`.
6408
6594
  *
6409
- * **Note:** As with other "Collections" methods, objects with a `length` property
6595
+ * **Note:** As with other "Collections" methods, objects with a "length" property
6410
6596
  * are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
6411
6597
  * may be used for object iteration.
6412
6598
  *
@@ -6536,7 +6722,7 @@
6536
6722
  * // => true
6537
6723
  */
6538
6724
  function includes(collection, target, fromIndex, guard) {
6539
- var length = collection ? collection.length : 0;
6725
+ var length = collection ? getLength(collection) : 0;
6540
6726
  if (!isLength(length)) {
6541
6727
  collection = values(collection);
6542
6728
  length = collection.length;
@@ -6605,16 +6791,16 @@
6605
6791
  });
6606
6792
 
6607
6793
  /**
6608
- * Invokes the method named by `methodName` on each element in `collection`,
6609
- * returning an array of the results of each invoked method. Any additional
6610
- * arguments are provided to each invoked method. If `methodName` is a function
6611
- * it is invoked for, and `this` bound to, each element in `collection`.
6794
+ * Invokes the method at `path` on each element in `collection`, returning
6795
+ * an array of the results of each invoked method. Any additional arguments
6796
+ * are provided to each invoked method. If `methodName` is a function it is
6797
+ * invoked for, and `this` bound to, each element in `collection`.
6612
6798
  *
6613
6799
  * @static
6614
6800
  * @memberOf _
6615
6801
  * @category Collection
6616
6802
  * @param {Array|Object|string} collection The collection to iterate over.
6617
- * @param {Function|string} methodName The name of the method to invoke or
6803
+ * @param {Array|Function|string} path The path of the method to invoke or
6618
6804
  * the function invoked per iteration.
6619
6805
  * @param {...*} [args] The arguments to invoke the method with.
6620
6806
  * @returns {Array} Returns the array of results.
@@ -6626,15 +6812,16 @@
6626
6812
  * _.invoke([123, 456], String.prototype.split, '');
6627
6813
  * // => [['1', '2', '3'], ['4', '5', '6']]
6628
6814
  */
6629
- var invoke = restParam(function(collection, methodName, args) {
6815
+ var invoke = restParam(function(collection, path, args) {
6630
6816
  var index = -1,
6631
- isFunc = typeof methodName == 'function',
6632
- length = collection ? collection.length : 0,
6817
+ isFunc = typeof path == 'function',
6818
+ isProp = isKey(path),
6819
+ length = getLength(collection),
6633
6820
  result = isLength(length) ? Array(length) : [];
6634
6821
 
6635
6822
  baseEach(collection, function(value) {
6636
- var func = isFunc ? methodName : (value != null && value[methodName]);
6637
- result[++index] = func ? func.apply(value, args) : undefined;
6823
+ var func = isFunc ? path : (isProp && value != null && value[path]);
6824
+ result[++index] = func ? func.apply(value, args) : invokePath(value, path, args);
6638
6825
  });
6639
6826
  return result;
6640
6827
  });
@@ -6671,7 +6858,6 @@
6671
6858
  * @param {Array|Object|string} collection The collection to iterate over.
6672
6859
  * @param {Function|Object|string} [iteratee=_.identity] The function invoked
6673
6860
  * per iteration.
6674
- * create a `_.property` or `_.matches` style callback respectively.
6675
6861
  * @param {*} [thisArg] The `this` binding of `iteratee`.
6676
6862
  * @returns {Array} Returns the new mapped array.
6677
6863
  * @example
@@ -6765,13 +6951,13 @@
6765
6951
  }, function() { return [[], []]; });
6766
6952
 
6767
6953
  /**
6768
- * Gets the value of `key` from all elements in `collection`.
6954
+ * Gets the property value of `path` from all elements in `collection`.
6769
6955
  *
6770
6956
  * @static
6771
6957
  * @memberOf _
6772
6958
  * @category Collection
6773
6959
  * @param {Array|Object|string} collection The collection to iterate over.
6774
- * @param {string} key The key of the property to pluck.
6960
+ * @param {Array|string} path The path of the property to pluck.
6775
6961
  * @returns {Array} Returns the property values.
6776
6962
  * @example
6777
6963
  *
@@ -6787,8 +6973,8 @@
6787
6973
  * _.pluck(userIndex, 'age');
6788
6974
  * // => [36, 40] (iteration order is not guaranteed)
6789
6975
  */
6790
- function pluck(collection, key) {
6791
- return map(collection, baseProperty(key));
6976
+ function pluck(collection, path) {
6977
+ return map(collection, property(path));
6792
6978
  }
6793
6979
 
6794
6980
  /**
@@ -6816,8 +7002,8 @@
6816
7002
  * @returns {*} Returns the accumulated value.
6817
7003
  * @example
6818
7004
  *
6819
- * _.reduce([1, 2], function(sum, n) {
6820
- * return sum + n;
7005
+ * _.reduce([1, 2], function(total, n) {
7006
+ * return total + n;
6821
7007
  * });
6822
7008
  * // => 3
6823
7009
  *
@@ -6989,7 +7175,7 @@
6989
7175
  * // => 7
6990
7176
  */
6991
7177
  function size(collection) {
6992
- var length = collection ? collection.length : 0;
7178
+ var length = collection ? getLength(collection) : 0;
6993
7179
  return isLength(length) ? length : keys(collection).length;
6994
7180
  }
6995
7181
 
@@ -7047,7 +7233,7 @@
7047
7233
  if (thisArg && isIterateeCall(collection, predicate, thisArg)) {
7048
7234
  predicate = null;
7049
7235
  }
7050
- if (typeof predicate != 'function' || typeof thisArg != 'undefined') {
7236
+ if (typeof predicate != 'function' || thisArg !== undefined) {
7051
7237
  predicate = getCallback(predicate, thisArg, 3);
7052
7238
  }
7053
7239
  return func(collection, predicate);
@@ -7075,9 +7261,8 @@
7075
7261
  * @memberOf _
7076
7262
  * @category Collection
7077
7263
  * @param {Array|Object|string} collection The collection to iterate over.
7078
- * @param {Array|Function|Object|string} [iteratee=_.identity] The function
7079
- * invoked per iteration. If a property name or an object is provided it is
7080
- * used to create a `_.property` or `_.matches` style callback respectively.
7264
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked
7265
+ * per iteration.
7081
7266
  * @param {*} [thisArg] The `this` binding of `iteratee`.
7082
7267
  * @returns {Array} Returns the new sorted array.
7083
7268
  * @example
@@ -7106,104 +7291,112 @@
7106
7291
  if (collection == null) {
7107
7292
  return [];
7108
7293
  }
7109
- var index = -1,
7110
- length = collection.length,
7111
- result = isLength(length) ? Array(length) : [];
7112
-
7113
7294
  if (thisArg && isIterateeCall(collection, iteratee, thisArg)) {
7114
7295
  iteratee = null;
7115
7296
  }
7297
+ var index = -1;
7116
7298
  iteratee = getCallback(iteratee, thisArg, 3);
7117
- baseEach(collection, function(value, key, collection) {
7118
- result[++index] = { 'criteria': iteratee(value, key, collection), 'index': index, 'value': value };
7299
+
7300
+ var result = baseMap(collection, function(value, key, collection) {
7301
+ return { 'criteria': iteratee(value, key, collection), 'index': ++index, 'value': value };
7119
7302
  });
7120
7303
  return baseSortBy(result, compareAscending);
7121
7304
  }
7122
7305
 
7123
7306
  /**
7124
- * This method is like `_.sortBy` except that it sorts by property names
7125
- * instead of an iteratee function.
7307
+ * This method is like `_.sortBy` except that it can sort by multiple iteratees
7308
+ * or property names.
7309
+ *
7310
+ * If a property name is provided for an iteratee the created `_.property`
7311
+ * style callback returns the property value of the given element.
7312
+ *
7313
+ * If an object is provided for an iteratee the created `_.matches` style
7314
+ * callback returns `true` for elements that have the properties of the given
7315
+ * object, else `false`.
7126
7316
  *
7127
7317
  * @static
7128
7318
  * @memberOf _
7129
7319
  * @category Collection
7130
7320
  * @param {Array|Object|string} collection The collection to iterate over.
7131
- * @param {...(string|string[])} props The property names to sort by,
7132
- * specified as individual property names or arrays of property names.
7321
+ * @param {...(Function|Function[]|Object|Object[]|string|string[])} iteratees
7322
+ * The iteratees to sort by, specified as individual values or arrays of values.
7133
7323
  * @returns {Array} Returns the new sorted array.
7134
7324
  * @example
7135
7325
  *
7136
7326
  * var users = [
7327
+ * { 'user': 'fred', 'age': 48 },
7137
7328
  * { 'user': 'barney', 'age': 36 },
7138
- * { 'user': 'fred', 'age': 40 },
7139
- * { 'user': 'barney', 'age': 26 },
7140
- * { 'user': 'fred', 'age': 30 }
7329
+ * { 'user': 'fred', 'age': 42 },
7330
+ * { 'user': 'barney', 'age': 34 }
7141
7331
  * ];
7142
7332
  *
7143
7333
  * _.map(_.sortByAll(users, ['user', 'age']), _.values);
7144
- * // => [['barney', 26], ['barney', 36], ['fred', 30], ['fred', 40]]
7334
+ * // => [['barney', 34], ['barney', 36], ['fred', 42], ['fred', 48]]
7335
+ *
7336
+ * _.map(_.sortByAll(users, 'user', function(chr) {
7337
+ * return Math.floor(chr.age / 10);
7338
+ * }), _.values);
7339
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
7145
7340
  */
7146
- function sortByAll() {
7147
- var args = arguments,
7148
- collection = args[0],
7149
- guard = args[3],
7150
- index = 0,
7151
- length = args.length - 1;
7152
-
7341
+ var sortByAll = restParam(function(collection, iteratees) {
7153
7342
  if (collection == null) {
7154
7343
  return [];
7155
7344
  }
7156
- var props = Array(length);
7157
- while (index < length) {
7158
- props[index] = args[++index];
7159
- }
7160
- if (guard && isIterateeCall(args[1], args[2], guard)) {
7161
- props = args[1];
7345
+ var guard = iteratees[2];
7346
+ if (guard && isIterateeCall(iteratees[0], iteratees[1], guard)) {
7347
+ iteratees.length = 1;
7162
7348
  }
7163
- return baseSortByOrder(collection, baseFlatten(props), []);
7164
- }
7349
+ return baseSortByOrder(collection, baseFlatten(iteratees), []);
7350
+ });
7165
7351
 
7166
7352
  /**
7167
7353
  * This method is like `_.sortByAll` except that it allows specifying the
7168
- * sort orders of the property names to sort by. A truthy value in `orders`
7169
- * will sort the corresponding property name in ascending order while a
7170
- * falsey value will sort it in descending order.
7354
+ * sort orders of the iteratees to sort by. A truthy value in `orders` will
7355
+ * sort the corresponding property name in ascending order while a falsey
7356
+ * value will sort it in descending order.
7357
+ *
7358
+ * If a property name is provided for an iteratee the created `_.property`
7359
+ * style callback returns the property value of the given element.
7360
+ *
7361
+ * If an object is provided for an iteratee the created `_.matches` style
7362
+ * callback returns `true` for elements that have the properties of the given
7363
+ * object, else `false`.
7171
7364
  *
7172
7365
  * @static
7173
7366
  * @memberOf _
7174
7367
  * @category Collection
7175
7368
  * @param {Array|Object|string} collection The collection to iterate over.
7176
- * @param {string[]} props The property names to sort by.
7177
- * @param {boolean[]} orders The sort orders of `props`.
7369
+ * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
7370
+ * @param {boolean[]} orders The sort orders of `iteratees`.
7178
7371
  * @param- {Object} [guard] Enables use as a callback for functions like `_.reduce`.
7179
7372
  * @returns {Array} Returns the new sorted array.
7180
7373
  * @example
7181
7374
  *
7182
7375
  * var users = [
7183
- * { 'user': 'barney', 'age': 26 },
7184
- * { 'user': 'fred', 'age': 40 },
7185
- * { 'user': 'barney', 'age': 36 },
7186
- * { 'user': 'fred', 'age': 30 }
7376
+ * { 'user': 'fred', 'age': 48 },
7377
+ * { 'user': 'barney', 'age': 34 },
7378
+ * { 'user': 'fred', 'age': 42 },
7379
+ * { 'user': 'barney', 'age': 36 }
7187
7380
  * ];
7188
7381
  *
7189
7382
  * // sort by `user` in ascending order and by `age` in descending order
7190
7383
  * _.map(_.sortByOrder(users, ['user', 'age'], [true, false]), _.values);
7191
- * // => [['barney', 36], ['barney', 26], ['fred', 40], ['fred', 30]]
7384
+ * // => [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
7192
7385
  */
7193
- function sortByOrder(collection, props, orders, guard) {
7386
+ function sortByOrder(collection, iteratees, orders, guard) {
7194
7387
  if (collection == null) {
7195
7388
  return [];
7196
7389
  }
7197
- if (guard && isIterateeCall(props, orders, guard)) {
7390
+ if (guard && isIterateeCall(iteratees, orders, guard)) {
7198
7391
  orders = null;
7199
7392
  }
7200
- if (!isArray(props)) {
7201
- props = props == null ? [] : [props];
7393
+ if (!isArray(iteratees)) {
7394
+ iteratees = iteratees == null ? [] : [iteratees];
7202
7395
  }
7203
7396
  if (!isArray(orders)) {
7204
7397
  orders = orders == null ? [] : [orders];
7205
7398
  }
7206
- return baseSortByOrder(collection, props, orders);
7399
+ return baseSortByOrder(collection, iteratees, orders);
7207
7400
  }
7208
7401
 
7209
7402
  /**
@@ -7356,7 +7549,8 @@
7356
7549
  return function() {
7357
7550
  if (--n > 0) {
7358
7551
  result = func.apply(this, arguments);
7359
- } else {
7552
+ }
7553
+ if (n <= 1) {
7360
7554
  func = null;
7361
7555
  }
7362
7556
  return result;
@@ -7371,7 +7565,7 @@
7371
7565
  * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
7372
7566
  * may be used as a placeholder for partially applied arguments.
7373
7567
  *
7374
- * **Note:** Unlike native `Function#bind` this method does not set the `length`
7568
+ * **Note:** Unlike native `Function#bind` this method does not set the "length"
7375
7569
  * property of bound functions.
7376
7570
  *
7377
7571
  * @static
@@ -7413,7 +7607,7 @@
7413
7607
  * of method names. If no method names are provided all enumerable function
7414
7608
  * properties, own and inherited, of `object` are bound.
7415
7609
  *
7416
- * **Note:** This method does not set the `length` property of bound functions.
7610
+ * **Note:** This method does not set the "length" property of bound functions.
7417
7611
  *
7418
7612
  * @static
7419
7613
  * @memberOf _
@@ -7454,7 +7648,7 @@
7454
7648
  *
7455
7649
  * This method differs from `_.bind` by allowing bound functions to reference
7456
7650
  * methods that may be redefined or don't yet exist.
7457
- * See [Peter Michaux's article](http://michaux.ca/articles/lazy-function-definition-pattern)
7651
+ * See [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
7458
7652
  * for more details.
7459
7653
  *
7460
7654
  * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
@@ -7511,7 +7705,7 @@
7511
7705
  * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
7512
7706
  * may be used as a placeholder for provided arguments.
7513
7707
  *
7514
- * **Note:** This method does not set the `length` property of curried functions.
7708
+ * **Note:** This method does not set the "length" property of curried functions.
7515
7709
  *
7516
7710
  * @static
7517
7711
  * @memberOf _
@@ -7550,7 +7744,7 @@
7550
7744
  * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
7551
7745
  * builds, may be used as a placeholder for provided arguments.
7552
7746
  *
7553
- * **Note:** This method does not set the `length` property of curried functions.
7747
+ * **Note:** This method does not set the "length" property of curried functions.
7554
7748
  *
7555
7749
  * @static
7556
7750
  * @memberOf _
@@ -7962,7 +8156,7 @@
7962
8156
  * // `initialize` invokes `createApplication` once
7963
8157
  */
7964
8158
  function once(func) {
7965
- return before(func, 2);
8159
+ return before(2, func);
7966
8160
  }
7967
8161
 
7968
8162
  /**
@@ -7973,7 +8167,7 @@
7973
8167
  * The `_.partial.placeholder` value, which defaults to `_` in monolithic
7974
8168
  * builds, may be used as a placeholder for partially applied arguments.
7975
8169
  *
7976
- * **Note:** This method does not set the `length` property of partially
8170
+ * **Note:** This method does not set the "length" property of partially
7977
8171
  * applied functions.
7978
8172
  *
7979
8173
  * @static
@@ -8006,7 +8200,7 @@
8006
8200
  * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
8007
8201
  * builds, may be used as a placeholder for partially applied arguments.
8008
8202
  *
8009
- * **Note:** This method does not set the `length` property of partially
8203
+ * **Note:** This method does not set the "length" property of partially
8010
8204
  * applied functions.
8011
8205
  *
8012
8206
  * @static
@@ -8090,7 +8284,7 @@
8090
8284
  if (typeof func != 'function') {
8091
8285
  throw new TypeError(FUNC_ERROR_TEXT);
8092
8286
  }
8093
- start = nativeMax(typeof start == 'undefined' ? (func.length - 1) : (+start || 0), 0);
8287
+ start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
8094
8288
  return function() {
8095
8289
  var args = arguments,
8096
8290
  index = -1,
@@ -8502,7 +8696,7 @@
8502
8696
  if (value == null) {
8503
8697
  return true;
8504
8698
  }
8505
- var length = value.length;
8699
+ var length = getLength(value);
8506
8700
  if (isLength(length) && (isArray(value) || isString(value) || isArguments(value) ||
8507
8701
  (isObjectLike(value) && isFunction(value.splice)))) {
8508
8702
  return !length;
@@ -8528,7 +8722,7 @@
8528
8722
  * @category Lang
8529
8723
  * @param {*} value The value to compare.
8530
8724
  * @param {*} other The other value to compare.
8531
- * @param {Function} [customizer] The function to customize comparing values.
8725
+ * @param {Function} [customizer] The function to customize value comparisons.
8532
8726
  * @param {*} [thisArg] The `this` binding of `customizer`.
8533
8727
  * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
8534
8728
  * @example
@@ -8559,7 +8753,7 @@
8559
8753
  return value === other;
8560
8754
  }
8561
8755
  var result = customizer ? customizer(value, other) : undefined;
8562
- return typeof result == 'undefined' ? baseIsEqual(value, other, customizer) : !!result;
8756
+ return result === undefined ? baseIsEqual(value, other, customizer) : !!result;
8563
8757
  }
8564
8758
 
8565
8759
  /**
@@ -8681,7 +8875,7 @@
8681
8875
  * @category Lang
8682
8876
  * @param {Object} object The object to inspect.
8683
8877
  * @param {Object} source The object of property values to match.
8684
- * @param {Function} [customizer] The function to customize comparing values.
8878
+ * @param {Function} [customizer] The function to customize value comparisons.
8685
8879
  * @param {*} [thisArg] The `this` binding of `customizer`.
8686
8880
  * @returns {boolean} Returns `true` if `object` is a match, else `false`.
8687
8881
  * @example
@@ -8714,12 +8908,13 @@
8714
8908
  return false;
8715
8909
  }
8716
8910
  customizer = typeof customizer == 'function' && bindCallback(customizer, thisArg, 3);
8911
+ object = toObject(object);
8717
8912
  if (!customizer && length == 1) {
8718
8913
  var key = props[0],
8719
8914
  value = source[key];
8720
8915
 
8721
8916
  if (isStrictComparable(value)) {
8722
- return value === object[key] && (typeof value != 'undefined' || (key in toObject(object)));
8917
+ return value === object[key] && (value !== undefined || (key in object));
8723
8918
  }
8724
8919
  }
8725
8920
  var values = Array(length),
@@ -8729,7 +8924,7 @@
8729
8924
  value = values[length] = source[props[length]];
8730
8925
  strictCompareFlags[length] = isStrictComparable(value);
8731
8926
  }
8732
- return baseIsMatch(toObject(object), props, values, strictCompareFlags, customizer);
8927
+ return baseIsMatch(object, props, values, strictCompareFlags, customizer);
8733
8928
  }
8734
8929
 
8735
8930
  /**
@@ -8784,9 +8979,9 @@
8784
8979
  return false;
8785
8980
  }
8786
8981
  if (objToString.call(value) == funcTag) {
8787
- return reNative.test(fnToString.call(value));
8982
+ return reIsNative.test(fnToString.call(value));
8788
8983
  }
8789
- return isObjectLike(value) && (isHostObject(value) ? reNative : reHostCtor).test(value);
8984
+ return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
8790
8985
  }
8791
8986
 
8792
8987
  /**
@@ -8954,7 +9149,7 @@
8954
9149
  * // => false
8955
9150
  */
8956
9151
  function isUndefined(value) {
8957
- return typeof value == 'undefined';
9152
+ return value === undefined;
8958
9153
  }
8959
9154
 
8960
9155
  /**
@@ -8973,7 +9168,7 @@
8973
9168
  * // => [2, 3]
8974
9169
  */
8975
9170
  function toArray(value) {
8976
- var length = value ? value.length : 0;
9171
+ var length = value ? getLength(value) : 0;
8977
9172
  if (!isLength(length)) {
8978
9173
  return values(value);
8979
9174
  }
@@ -9021,13 +9216,17 @@
9021
9216
  * The `customizer` is bound to `thisArg` and invoked with five arguments:
9022
9217
  * (objectValue, sourceValue, key, object, source).
9023
9218
  *
9219
+ * **Note:** This method mutates `object` and is based on
9220
+ * [`Object.assign`](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign).
9221
+ *
9222
+ *
9024
9223
  * @static
9025
9224
  * @memberOf _
9026
9225
  * @alias extend
9027
9226
  * @category Object
9028
9227
  * @param {Object} object The destination object.
9029
9228
  * @param {...Object} [sources] The source objects.
9030
- * @param {Function} [customizer] The function to customize assigning values.
9229
+ * @param {Function} [customizer] The function to customize assigned values.
9031
9230
  * @param {*} [thisArg] The `this` binding of `customizer`.
9032
9231
  * @returns {Object} Returns `object`.
9033
9232
  * @example
@@ -9037,13 +9236,17 @@
9037
9236
  *
9038
9237
  * // using a customizer callback
9039
9238
  * var defaults = _.partialRight(_.assign, function(value, other) {
9040
- * return typeof value == 'undefined' ? other : value;
9239
+ * return _.isUndefined(value) ? other : value;
9041
9240
  * });
9042
9241
  *
9043
9242
  * defaults({ 'user': 'barney' }, { 'age': 36 }, { 'user': 'fred' });
9044
9243
  * // => { 'user': 'barney', 'age': 36 }
9045
9244
  */
9046
- var assign = createAssigner(baseAssign);
9245
+ var assign = createAssigner(function(object, source, customizer) {
9246
+ return customizer
9247
+ ? assignWith(object, source, customizer)
9248
+ : baseAssign(object, source);
9249
+ });
9047
9250
 
9048
9251
  /**
9049
9252
  * Creates an object that inherits from the given `prototype` object. If a
@@ -9084,7 +9287,7 @@
9084
9287
  if (guard && isIterateeCall(prototype, properties, guard)) {
9085
9288
  properties = null;
9086
9289
  }
9087
- return properties ? baseCopy(properties, result, keys(properties)) : result;
9290
+ return properties ? baseAssign(result, properties) : result;
9088
9291
  }
9089
9292
 
9090
9293
  /**
@@ -9092,6 +9295,8 @@
9092
9295
  * object for all destination properties that resolve to `undefined`. Once a
9093
9296
  * property is set, additional values of the same property are ignored.
9094
9297
  *
9298
+ * **Note:** This method mutates `object`.
9299
+ *
9095
9300
  * @static
9096
9301
  * @memberOf _
9097
9302
  * @category Object
@@ -9215,7 +9420,7 @@
9215
9420
  /**
9216
9421
  * Iterates over own and inherited enumerable properties of an object invoking
9217
9422
  * `iteratee` for each property. The `iteratee` is bound to `thisArg` and invoked
9218
- * with three arguments: (value, key, object). Iterator functions may exit
9423
+ * with three arguments: (value, key, object). Iteratee functions may exit
9219
9424
  * iteration early by explicitly returning `false`.
9220
9425
  *
9221
9426
  * @static
@@ -9271,7 +9476,7 @@
9271
9476
  /**
9272
9477
  * Iterates over own enumerable properties of an object invoking `iteratee`
9273
9478
  * for each property. The `iteratee` is bound to `thisArg` and invoked with
9274
- * three arguments: (value, key, object). Iterator functions may exit iteration
9479
+ * three arguments: (value, key, object). Iteratee functions may exit iteration
9275
9480
  * early by explicitly returning `false`.
9276
9481
  *
9277
9482
  * @static
@@ -9344,24 +9549,68 @@
9344
9549
  }
9345
9550
 
9346
9551
  /**
9347
- * Checks if `key` exists as a direct property of `object` instead of an
9348
- * inherited property.
9552
+ * Gets the property value of `path` on `object`. If the resolved value is
9553
+ * `undefined` the `defaultValue` is used in its place.
9349
9554
  *
9350
9555
  * @static
9351
9556
  * @memberOf _
9352
9557
  * @category Object
9353
- * @param {Object} object The object to inspect.
9354
- * @param {string} key The key to check.
9355
- * @returns {boolean} Returns `true` if `key` is a direct property, else `false`.
9558
+ * @param {Object} object The object to query.
9559
+ * @param {Array|string} path The path of the property to get.
9560
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
9561
+ * @returns {*} Returns the resolved value.
9356
9562
  * @example
9357
9563
  *
9358
- * var object = { 'a': 1, 'b': 2, 'c': 3 };
9564
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
9359
9565
  *
9360
- * _.has(object, 'b');
9566
+ * _.get(object, 'a[0].b.c');
9567
+ * // => 3
9568
+ *
9569
+ * _.get(object, ['a', '0', 'b', 'c']);
9570
+ * // => 3
9571
+ *
9572
+ * _.get(object, 'a.b.c', 'default');
9573
+ * // => 'default'
9574
+ */
9575
+ function get(object, path, defaultValue) {
9576
+ var result = object == null ? undefined : baseGet(object, toPath(path), path + '');
9577
+ return result === undefined ? defaultValue : result;
9578
+ }
9579
+
9580
+ /**
9581
+ * Checks if `path` is a direct property.
9582
+ *
9583
+ * @static
9584
+ * @memberOf _
9585
+ * @category Object
9586
+ * @param {Object} object The object to query.
9587
+ * @param {Array|string} path The path to check.
9588
+ * @returns {boolean} Returns `true` if `path` is a direct property, else `false`.
9589
+ * @example
9590
+ *
9591
+ * var object = { 'a': { 'b': { 'c': 3 } } };
9592
+ *
9593
+ * _.has(object, 'a');
9594
+ * // => true
9595
+ *
9596
+ * _.has(object, 'a.b.c');
9597
+ * // => true
9598
+ *
9599
+ * _.has(object, ['a', 'b', 'c']);
9361
9600
  * // => true
9362
9601
  */
9363
- function has(object, key) {
9364
- return object ? hasOwnProperty.call(object, key) : false;
9602
+ function has(object, path) {
9603
+ if (object == null) {
9604
+ return false;
9605
+ }
9606
+ var result = hasOwnProperty.call(object, path);
9607
+ if (!result && !isKey(path)) {
9608
+ path = toPath(path);
9609
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
9610
+ path = last(path);
9611
+ result = object != null && hasOwnProperty.call(object, path);
9612
+ }
9613
+ return result || (lodash.support.nonEnumStrings && isString(object) && isIndex(path, object.length));
9365
9614
  }
9366
9615
 
9367
9616
  /**
@@ -9424,7 +9673,7 @@
9424
9673
  * @static
9425
9674
  * @memberOf _
9426
9675
  * @category Object
9427
- * @param {Object} object The object to inspect.
9676
+ * @param {Object} object The object to query.
9428
9677
  * @returns {Array} Returns the array of property names.
9429
9678
  * @example
9430
9679
  *
@@ -9447,7 +9696,7 @@
9447
9696
  length = object.length;
9448
9697
  }
9449
9698
  if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
9450
- (typeof object == 'function' ? lodash.support.enumPrototypes : (length && isLength(length)))) {
9699
+ (typeof object == 'function' ? lodash.support.enumPrototypes : isLength(length))) {
9451
9700
  return shimKeys(object);
9452
9701
  }
9453
9702
  return isObject(object) ? nativeKeys(object) : [];
@@ -9461,7 +9710,7 @@
9461
9710
  * @static
9462
9711
  * @memberOf _
9463
9712
  * @category Object
9464
- * @param {Object} object The object to inspect.
9713
+ * @param {Object} object The object to query.
9465
9714
  * @returns {Array} Returns the array of property names.
9466
9715
  * @example
9467
9716
  *
@@ -9598,7 +9847,7 @@
9598
9847
  * @category Object
9599
9848
  * @param {Object} object The destination object.
9600
9849
  * @param {...Object} [sources] The source objects.
9601
- * @param {Function} [customizer] The function to customize merging properties.
9850
+ * @param {Function} [customizer] The function to customize assigned values.
9602
9851
  * @param {*} [thisArg] The `this` binding of `customizer`.
9603
9852
  * @returns {Object} Returns `object`.
9604
9853
  * @example
@@ -9683,7 +9932,7 @@
9683
9932
  * @static
9684
9933
  * @memberOf _
9685
9934
  * @category Object
9686
- * @param {Object} object The object to inspect.
9935
+ * @param {Object} object The object to query.
9687
9936
  * @returns {Array} Returns the new array of key-value pairs.
9688
9937
  * @example
9689
9938
  *
@@ -9739,41 +9988,93 @@
9739
9988
  });
9740
9989
 
9741
9990
  /**
9742
- * Resolves the value of property `key` on `object`. If the value of `key` is
9743
- * a function it is invoked with the `this` binding of `object` and its result
9744
- * is returned, else the property value is returned. If the property value is
9745
- * `undefined` the `defaultValue` is used in its place.
9991
+ * This method is like `_.get` except that if the resolved value is a function
9992
+ * it is invoked with the `this` binding of its parent object and its result
9993
+ * is returned.
9746
9994
  *
9747
9995
  * @static
9748
9996
  * @memberOf _
9749
9997
  * @category Object
9750
9998
  * @param {Object} object The object to query.
9751
- * @param {string} key The key of the property to resolve.
9752
- * @param {*} [defaultValue] The value returned if the property value
9753
- * resolves to `undefined`.
9999
+ * @param {Array|string} path The path of the property to resolve.
10000
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
9754
10001
  * @returns {*} Returns the resolved value.
9755
10002
  * @example
9756
10003
  *
9757
- * var object = { 'user': 'fred', 'age': _.constant(40) };
10004
+ * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
9758
10005
  *
9759
- * _.result(object, 'user');
9760
- * // => 'fred'
10006
+ * _.result(object, 'a[0].b.c1');
10007
+ * // => 3
9761
10008
  *
9762
- * _.result(object, 'age');
9763
- * // => 40
10009
+ * _.result(object, 'a[0].b.c2');
10010
+ * // => 4
9764
10011
  *
9765
- * _.result(object, 'status', 'busy');
9766
- * // => 'busy'
10012
+ * _.result(object, 'a.b.c', 'default');
10013
+ * // => 'default'
9767
10014
  *
9768
- * _.result(object, 'status', _.constant('busy'));
9769
- * // => 'busy'
10015
+ * _.result(object, 'a.b.c', _.constant('default'));
10016
+ * // => 'default'
9770
10017
  */
9771
- function result(object, key, defaultValue) {
9772
- var value = object == null ? undefined : object[key];
9773
- if (typeof value == 'undefined') {
9774
- value = defaultValue;
10018
+ function result(object, path, defaultValue) {
10019
+ var result = object == null ? undefined : toObject(object)[path];
10020
+ if (result === undefined) {
10021
+ if (object != null && !isKey(path, object)) {
10022
+ path = toPath(path);
10023
+ object = path.length == 1 ? object : baseGet(object, baseSlice(path, 0, -1));
10024
+ result = object == null ? undefined : toObject(object)[last(path)];
10025
+ }
10026
+ result = result === undefined ? defaultValue : result;
9775
10027
  }
9776
- return isFunction(value) ? value.call(object) : value;
10028
+ return isFunction(result) ? result.call(object) : result;
10029
+ }
10030
+
10031
+ /**
10032
+ * Sets the property value of `path` on `object`. If a portion of `path`
10033
+ * does not exist it is created.
10034
+ *
10035
+ * @static
10036
+ * @memberOf _
10037
+ * @category Object
10038
+ * @param {Object} object The object to augment.
10039
+ * @param {Array|string} path The path of the property to set.
10040
+ * @param {*} value The value to set.
10041
+ * @returns {Object} Returns `object`.
10042
+ * @example
10043
+ *
10044
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
10045
+ *
10046
+ * _.set(object, 'a[0].b.c', 4);
10047
+ * console.log(object.a[0].b.c);
10048
+ * // => 4
10049
+ *
10050
+ * _.set(object, 'x[0].y.z', 5);
10051
+ * console.log(object.x[0].y.z);
10052
+ * // => 5
10053
+ */
10054
+ function set(object, path, value) {
10055
+ if (object == null) {
10056
+ return object;
10057
+ }
10058
+ var pathKey = (path + '');
10059
+ path = (object[pathKey] != null || isKey(path, object)) ? [pathKey] : toPath(path);
10060
+
10061
+ var index = -1,
10062
+ length = path.length,
10063
+ endIndex = length - 1,
10064
+ nested = object;
10065
+
10066
+ while (nested != null && ++index < length) {
10067
+ var key = path[index];
10068
+ if (isObject(nested)) {
10069
+ if (index == endIndex) {
10070
+ nested[key] = value;
10071
+ } else if (nested[key] == null) {
10072
+ nested[key] = isIndex(path[index + 1]) ? [] : {};
10073
+ }
10074
+ }
10075
+ nested = nested[key];
10076
+ }
10077
+ return object;
9777
10078
  }
9778
10079
 
9779
10080
  /**
@@ -9781,7 +10082,7 @@
9781
10082
  * `accumulator` object which is the result of running each of its own enumerable
9782
10083
  * properties through `iteratee`, with each invocation potentially mutating
9783
10084
  * the `accumulator` object. The `iteratee` is bound to `thisArg` and invoked
9784
- * with four arguments: (accumulator, value, key, object). Iterator functions
10085
+ * with four arguments: (accumulator, value, key, object). Iteratee functions
9785
10086
  * may exit iteration early by explicitly returning `false`.
9786
10087
  *
9787
10088
  * @static
@@ -9924,7 +10225,7 @@
9924
10225
  } else {
9925
10226
  end = +end || 0;
9926
10227
  }
9927
- return value >= start && value < end;
10228
+ return value >= nativeMin(start, end) && value < nativeMax(start, end);
9928
10229
  }
9929
10230
 
9930
10231
  /**
@@ -10049,7 +10350,7 @@
10049
10350
  */
10050
10351
  function deburr(string) {
10051
10352
  string = baseToString(string);
10052
- return string && string.replace(reLatin1, deburrLetter).replace(reComboMarks, '');
10353
+ return string && string.replace(reLatin1, deburrLetter).replace(reComboMark, '');
10053
10354
  }
10054
10355
 
10055
10356
  /**
@@ -10078,7 +10379,7 @@
10078
10379
  target = (target + '');
10079
10380
 
10080
10381
  var length = string.length;
10081
- position = typeof position == 'undefined'
10382
+ position = position === undefined
10082
10383
  ? length
10083
10384
  : nativeMin(position < 0 ? 0 : (+position || 0), length);
10084
10385
 
@@ -10100,9 +10401,10 @@
10100
10401
  * (under "semi-related fun fact") for more details.
10101
10402
  *
10102
10403
  * Backticks are escaped because in Internet Explorer < 9, they can break out
10103
- * of attribute values or HTML comments. See [#102](https://html5sec.org/#102),
10104
- * [#108](https://html5sec.org/#108), and [#133](https://html5sec.org/#133) of
10105
- * the [HTML5 Security Cheatsheet](https://html5sec.org/) for more details.
10404
+ * of attribute values or HTML comments. See [#59](https://html5sec.org/#59),
10405
+ * [#102](https://html5sec.org/#102), [#108](https://html5sec.org/#108), and
10406
+ * [#133](https://html5sec.org/#133) of the [HTML5 Security Cheatsheet](https://html5sec.org/)
10407
+ * for more details.
10106
10408
  *
10107
10409
  * When working with HTML you should always [quote attribute values](http://wonko.com/post/html-escaping)
10108
10410
  * to reduce XSS vectors.
@@ -10296,7 +10598,7 @@
10296
10598
  radix = +radix;
10297
10599
  }
10298
10600
  string = trim(string);
10299
- return nativeParseInt(string, radix || (reHexPrefix.test(string) ? 16 : 10));
10601
+ return nativeParseInt(string, radix || (reHasHexPrefix.test(string) ? 16 : 10));
10300
10602
  };
10301
10603
  }
10302
10604
 
@@ -10521,9 +10823,9 @@
10521
10823
  options = otherOptions = null;
10522
10824
  }
10523
10825
  string = baseToString(string);
10524
- options = baseAssign(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
10826
+ options = assignWith(baseAssign({}, otherOptions || options), settings, assignOwnDefaults);
10525
10827
 
10526
- var imports = baseAssign(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
10828
+ var imports = assignWith(baseAssign({}, options.imports), settings.imports, assignOwnDefaults),
10527
10829
  importsKeys = keys(imports),
10528
10830
  importsValues = baseValues(imports, importsKeys);
10529
10831
 
@@ -10927,9 +11229,7 @@
10927
11229
  if (guard && isIterateeCall(func, thisArg, guard)) {
10928
11230
  thisArg = null;
10929
11231
  }
10930
- return isObjectLike(func)
10931
- ? matches(func)
10932
- : baseCallback(func, thisArg);
11232
+ return baseCallback(func, thisArg);
10933
11233
  }
10934
11234
 
10935
11235
  /**
@@ -11003,7 +11303,7 @@
11003
11303
  }
11004
11304
 
11005
11305
  /**
11006
- * Creates a function which compares the property value of `key` on a given
11306
+ * Creates a function which compares the property value of `path` on a given
11007
11307
  * object to `value`.
11008
11308
  *
11009
11309
  * **Note:** This method supports comparing arrays, booleans, `Date` objects,
@@ -11013,7 +11313,7 @@
11013
11313
  * @static
11014
11314
  * @memberOf _
11015
11315
  * @category Utility
11016
- * @param {string} key The key of the property to get.
11316
+ * @param {Array|string} path The path of the property to get.
11017
11317
  * @param {*} value The value to compare.
11018
11318
  * @returns {Function} Returns the new function.
11019
11319
  * @example
@@ -11026,22 +11326,75 @@
11026
11326
  * _.find(users, _.matchesProperty('user', 'fred'));
11027
11327
  * // => { 'user': 'fred' }
11028
11328
  */
11029
- function matchesProperty(key, value) {
11030
- return baseMatchesProperty(key + '', baseClone(value, true));
11329
+ function matchesProperty(path, value) {
11330
+ return baseMatchesProperty(path, baseClone(value, true));
11031
11331
  }
11032
11332
 
11333
+ /**
11334
+ * Creates a function which invokes the method at `path` on a given object.
11335
+ *
11336
+ * @static
11337
+ * @memberOf _
11338
+ * @category Utility
11339
+ * @param {Array|string} path The path of the method to invoke.
11340
+ * @returns {Function} Returns the new function.
11341
+ * @example
11342
+ *
11343
+ * var objects = [
11344
+ * { 'a': { 'b': { 'c': _.constant(2) } } },
11345
+ * { 'a': { 'b': { 'c': _.constant(1) } } }
11346
+ * ];
11347
+ *
11348
+ * _.map(objects, _.method('a.b.c'));
11349
+ * // => [2, 1]
11350
+ *
11351
+ * _.invoke(_.sortBy(objects, _.method(['a', 'b', 'c'])), 'a.b.c');
11352
+ * // => [1, 2]
11353
+ */
11354
+ var method = restParam(function(path, args) {
11355
+ return function(object) {
11356
+ return invokePath(object, path, args);
11357
+ }
11358
+ });
11359
+
11360
+ /**
11361
+ * The opposite of `_.method`; this method creates a function which invokes
11362
+ * the method at a given path on `object`.
11363
+ *
11364
+ * @static
11365
+ * @memberOf _
11366
+ * @category Utility
11367
+ * @param {Object} object The object to query.
11368
+ * @returns {Function} Returns the new function.
11369
+ * @example
11370
+ *
11371
+ * var array = _.times(3, _.constant),
11372
+ * object = { 'a': array, 'b': array, 'c': array };
11373
+ *
11374
+ * _.map(['a[2]', 'c[0]'], _.methodOf(object));
11375
+ * // => [2, 0]
11376
+ *
11377
+ * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
11378
+ * // => [2, 0]
11379
+ */
11380
+ var methodOf = restParam(function(object, args) {
11381
+ return function(path) {
11382
+ return invokePath(object, path, args);
11383
+ };
11384
+ });
11385
+
11033
11386
  /**
11034
11387
  * Adds all own enumerable function properties of a source object to the
11035
11388
  * destination object. If `object` is a function then methods are added to
11036
11389
  * its prototype as well.
11037
11390
  *
11038
- * **Note:** Use `_.runInContext` to create a pristine `lodash` function
11039
- * for mixins to avoid conflicts caused by modifying the original.
11391
+ * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
11392
+ * avoid conflicts caused by modifying the original.
11040
11393
  *
11041
11394
  * @static
11042
11395
  * @memberOf _
11043
11396
  * @category Utility
11044
- * @param {Function|Object} [object=this] object The destination object.
11397
+ * @param {Function|Object} [object=lodash] The destination object.
11045
11398
  * @param {Object} source The object of functions to add.
11046
11399
  * @param {Object} [options] The options object.
11047
11400
  * @param {boolean} [options.chain=true] Specify whether the functions added
@@ -11158,61 +11511,61 @@
11158
11511
  }
11159
11512
 
11160
11513
  /**
11161
- * Creates a function which returns the property value of `key` on a given object.
11514
+ * Creates a function which returns the property value at `path` on a
11515
+ * given object.
11162
11516
  *
11163
11517
  * @static
11164
11518
  * @memberOf _
11165
11519
  * @category Utility
11166
- * @param {string} key The key of the property to get.
11520
+ * @param {Array|string} path The path of the property to get.
11167
11521
  * @returns {Function} Returns the new function.
11168
11522
  * @example
11169
11523
  *
11170
- * var users = [
11171
- * { 'user': 'fred' },
11172
- * { 'user': 'barney' }
11524
+ * var objects = [
11525
+ * { 'a': { 'b': { 'c': 2 } } },
11526
+ * { 'a': { 'b': { 'c': 1 } } }
11173
11527
  * ];
11174
11528
  *
11175
- * var getName = _.property('user');
11176
- *
11177
- * _.map(users, getName);
11178
- * // => ['fred', 'barney']
11529
+ * _.map(objects, _.property('a.b.c'));
11530
+ * // => [2, 1]
11179
11531
  *
11180
- * _.pluck(_.sortBy(users, getName), 'user');
11181
- * // => ['barney', 'fred']
11532
+ * _.pluck(_.sortBy(objects, _.property(['a', 'b', 'c'])), 'a.b.c');
11533
+ * // => [1, 2]
11182
11534
  */
11183
- function property(key) {
11184
- return baseProperty(key + '');
11535
+ function property(path) {
11536
+ return isKey(path) ? baseProperty(path) : basePropertyDeep(path);
11185
11537
  }
11186
11538
 
11187
11539
  /**
11188
11540
  * The opposite of `_.property`; this method creates a function which returns
11189
- * the property value of a given key on `object`.
11541
+ * the property value at a given path on `object`.
11190
11542
  *
11191
11543
  * @static
11192
11544
  * @memberOf _
11193
11545
  * @category Utility
11194
- * @param {Object} object The object to inspect.
11546
+ * @param {Object} object The object to query.
11195
11547
  * @returns {Function} Returns the new function.
11196
11548
  * @example
11197
11549
  *
11198
- * var object = { 'a': 3, 'b': 1, 'c': 2 };
11550
+ * var array = [0, 1, 2],
11551
+ * object = { 'a': array, 'b': array, 'c': array };
11199
11552
  *
11200
- * _.map(['a', 'c'], _.propertyOf(object));
11201
- * // => [3, 2]
11553
+ * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
11554
+ * // => [2, 0]
11202
11555
  *
11203
- * _.sortBy(['a', 'b', 'c'], _.propertyOf(object));
11204
- * // => ['b', 'c', 'a']
11556
+ * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
11557
+ * // => [2, 0]
11205
11558
  */
11206
11559
  function propertyOf(object) {
11207
- return function(key) {
11208
- return object == null ? undefined : object[key];
11560
+ return function(path) {
11561
+ return baseGet(object, toPath(path), path + '');
11209
11562
  };
11210
11563
  }
11211
11564
 
11212
11565
  /**
11213
11566
  * Creates an array of numbers (positive and/or negative) progressing from
11214
11567
  * `start` up to, but not including, `end`. If `end` is not specified it is
11215
- * set to `start` with `start` then set to `0`. If `start` is less than `end`
11568
+ * set to `start` with `start` then set to `0`. If `end` is less than `start`
11216
11569
  * a zero-length range is created unless a negative `step` is specified.
11217
11570
  *
11218
11571
  * @static
@@ -11288,7 +11641,7 @@
11288
11641
  * _.times(3, function(n) {
11289
11642
  * mage.castSpell(n);
11290
11643
  * });
11291
- * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2` respectively
11644
+ * // => invokes `mage.castSpell(n)` three times with `n` of `0`, `1`, and `2`
11292
11645
  *
11293
11646
  * _.times(3, function(n) {
11294
11647
  * this.cast(n);
@@ -11296,7 +11649,7 @@
11296
11649
  * // => also invokes `mage.castSpell(n)` three times
11297
11650
  */
11298
11651
  function times(n, iteratee, thisArg) {
11299
- n = +n;
11652
+ n = floor(n);
11300
11653
 
11301
11654
  // Exit early to avoid a JSC JIT bug in Safari 8
11302
11655
  // where `Array(0)` is treated as `Array(1)`.
@@ -11355,7 +11708,7 @@
11355
11708
  * // => 10
11356
11709
  */
11357
11710
  function add(augend, addend) {
11358
- return augend + addend;
11711
+ return (+augend || 0) + (+addend || 0);
11359
11712
  }
11360
11713
 
11361
11714
  /**
@@ -11581,6 +11934,8 @@
11581
11934
  lodash.matchesProperty = matchesProperty;
11582
11935
  lodash.memoize = memoize;
11583
11936
  lodash.merge = merge;
11937
+ lodash.method = method;
11938
+ lodash.methodOf = methodOf;
11584
11939
  lodash.mixin = mixin;
11585
11940
  lodash.negate = negate;
11586
11941
  lodash.omit = omit;
@@ -11601,6 +11956,7 @@
11601
11956
  lodash.remove = remove;
11602
11957
  lodash.rest = rest;
11603
11958
  lodash.restParam = restParam;
11959
+ lodash.set = set;
11604
11960
  lodash.shuffle = shuffle;
11605
11961
  lodash.slice = slice;
11606
11962
  lodash.sortBy = sortBy;
@@ -11669,6 +12025,7 @@
11669
12025
  lodash.findLastKey = findLastKey;
11670
12026
  lodash.findWhere = findWhere;
11671
12027
  lodash.first = first;
12028
+ lodash.get = get;
11672
12029
  lodash.has = has;
11673
12030
  lodash.identity = identity;
11674
12031
  lodash.includes = includes;
@@ -11857,7 +12214,7 @@
11857
12214
  // Add `LazyWrapper` methods for `_.pluck` and `_.where`.
11858
12215
  arrayEach(['pluck', 'where'], function(methodName, index) {
11859
12216
  var operationName = index ? 'filter' : 'map',
11860
- createCallback = index ? baseMatches : baseProperty;
12217
+ createCallback = index ? baseMatches : property;
11861
12218
 
11862
12219
  LazyWrapper.prototype[methodName] = function(value) {
11863
12220
  return this[operationName](createCallback(value));
@@ -11879,7 +12236,7 @@
11879
12236
  start = start == null ? 0 : (+start || 0);
11880
12237
  var result = start < 0 ? this.takeRight(-start) : this.drop(start);
11881
12238
 
11882
- if (typeof end != 'undefined') {
12239
+ if (end !== undefined) {
11883
12240
  end = (+end || 0);
11884
12241
  result = end < 0 ? result.dropRight(-end) : result.take(end - start);
11885
12242
  }
@@ -11910,7 +12267,7 @@
11910
12267
  useLazy = isLazy || isArray(value);
11911
12268
 
11912
12269
  if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
11913
- // avoid lazy use if the iteratee has a `length` other than `1`
12270
+ // avoid lazy use if the iteratee has a "length" value other than `1`
11914
12271
  isLazy = useLazy = false;
11915
12272
  }
11916
12273
  var onlyLazy = isLazy && !isHybrid;