lodash-rails 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/lodash/rails/version.rb +1 -1
- data/vendor/assets/javascripts/lodash.compat.js +215 -137
- data/vendor/assets/javascripts/lodash.compat.min.js +41 -41
- data/vendor/assets/javascripts/lodash.js +312 -291
- data/vendor/assets/javascripts/lodash.min.js +39 -37
- data/vendor/assets/javascripts/lodash.underscore.js +165 -120
- data/vendor/assets/javascripts/lodash.underscore.min.js +29 -29
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c75fa28c6e41ea63fa104d2667a6d9be3c80701
|
4
|
+
data.tar.gz: e2e427625bac90a463148d008c0842238c403915
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a9e6c01ff63f72e01feed04899fa9739dd8b2b2d049a800cd1f68638e4c71d3c5240992199b0b6bdb5c979c1338830d8a229f167326a667bdb27ca73da3fd09a
|
7
|
+
data.tar.gz: 510cec5d45dcee17f38d5117b21c8ce9b3657edaac5a795dcc6eb13ac65389cd42ee808295604821220746022f4049544579638e6cfa10b326fe8f3540121c18
|
data/README.md
CHANGED
data/lib/lodash/rails/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/**
|
2
2
|
* @license
|
3
|
-
* Lo-Dash 1.
|
3
|
+
* Lo-Dash 1.2.0 (Custom Build) <http://lodash.com/>
|
4
4
|
* Build: `lodash -o ./dist/lodash.compat.js`
|
5
5
|
* Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/>
|
6
6
|
* Based on Underscore.js 1.4.4 <http://underscorejs.org/>
|
@@ -18,9 +18,9 @@
|
|
18
18
|
/** Detect free variable `module` */
|
19
19
|
var freeModule = typeof module == 'object' && module && module.exports == freeExports && module;
|
20
20
|
|
21
|
-
/** Detect free variable `global
|
21
|
+
/** Detect free variable `global`, from Node.js or Browserified code, and use it as `window` */
|
22
22
|
var freeGlobal = typeof global == 'object' && global;
|
23
|
-
if (freeGlobal.global === freeGlobal) {
|
23
|
+
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
|
24
24
|
window = freeGlobal;
|
25
25
|
}
|
26
26
|
|
@@ -30,6 +30,12 @@
|
|
30
30
|
/** Used internally to indicate various things */
|
31
31
|
var indicatorObject = {};
|
32
32
|
|
33
|
+
/** Used to prefix keys to avoid issues with `__proto__` and properties on `Object.prototype` */
|
34
|
+
var keyPrefix = +new Date + '';
|
35
|
+
|
36
|
+
/** Used as the size when optimizations are enabled for large arrays */
|
37
|
+
var largeArraySize = 200;
|
38
|
+
|
33
39
|
/** Used to match empty string literals in compiled template source */
|
34
40
|
var reEmptyStringLeading = /\b__p \+= '';/g,
|
35
41
|
reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
|
@@ -175,7 +181,7 @@
|
|
175
181
|
toString = objectRef.toString;
|
176
182
|
|
177
183
|
/* Native method shortcuts for methods with the same name as other `lodash` methods */
|
178
|
-
var nativeBind = reNative.test(nativeBind =
|
184
|
+
var nativeBind = reNative.test(nativeBind = toString.bind) && nativeBind,
|
179
185
|
nativeIsArray = reNative.test(nativeIsArray = Array.isArray) && nativeIsArray,
|
180
186
|
nativeIsFinite = context.isFinite,
|
181
187
|
nativeIsNaN = context.isNaN,
|
@@ -183,7 +189,8 @@
|
|
183
189
|
nativeMax = Math.max,
|
184
190
|
nativeMin = Math.min,
|
185
191
|
nativeParseInt = context.parseInt,
|
186
|
-
nativeRandom = Math.random
|
192
|
+
nativeRandom = Math.random,
|
193
|
+
nativeSlice = arrayRef.slice;
|
187
194
|
|
188
195
|
/** Detect various environments */
|
189
196
|
var isIeOpera = reNative.test(context.attachEvent),
|
@@ -202,7 +209,7 @@
|
|
202
209
|
/*--------------------------------------------------------------------------*/
|
203
210
|
|
204
211
|
/**
|
205
|
-
* Creates a `lodash` object,
|
212
|
+
* Creates a `lodash` object, which wraps the given `value`, to enable method
|
206
213
|
* chaining.
|
207
214
|
*
|
208
215
|
* In addition to Lo-Dash methods, wrappers also have the following `Array` methods:
|
@@ -220,8 +227,8 @@
|
|
220
227
|
* `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
|
221
228
|
* `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `push`, `range`,
|
222
229
|
* `reject`, `rest`, `reverse`, `shuffle`, `slice`, `sort`, `sortBy`, `splice`,
|
223
|
-
* `tap`, `throttle`, `times`, `toArray`, `union`, `uniq`, `unshift`, `
|
224
|
-
* `where`, `without`, `wrap`, and `zip`
|
230
|
+
* `tap`, `throttle`, `times`, `toArray`, `union`, `uniq`, `unshift`, `unzip`,
|
231
|
+
* `values`, `where`, `without`, `wrap`, and `zip`
|
225
232
|
*
|
226
233
|
* The non-chainable wrapper functions are:
|
227
234
|
* `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `has`,
|
@@ -240,6 +247,26 @@
|
|
240
247
|
* @category Chaining
|
241
248
|
* @param {Mixed} value The value to wrap in a `lodash` instance.
|
242
249
|
* @returns {Object} Returns a `lodash` instance.
|
250
|
+
* @example
|
251
|
+
*
|
252
|
+
* var wrapped = _([1, 2, 3]);
|
253
|
+
*
|
254
|
+
* // returns an unwrapped value
|
255
|
+
* wrapped.reduce(function(sum, num) {
|
256
|
+
* return sum + num;
|
257
|
+
* });
|
258
|
+
* // => 6
|
259
|
+
*
|
260
|
+
* // returns a wrapped value
|
261
|
+
* var squares = wrapped.map(function(num) {
|
262
|
+
* return num * num;
|
263
|
+
* });
|
264
|
+
*
|
265
|
+
* _.isArray(squares);
|
266
|
+
* // => false
|
267
|
+
*
|
268
|
+
* _.isArray(squares.value());
|
269
|
+
* // => true
|
243
270
|
*/
|
244
271
|
function lodash(value) {
|
245
272
|
// don't wrap if already wrapped, even if wrapped by a different `lodash` constructor
|
@@ -267,12 +294,12 @@
|
|
267
294
|
for (prop in arguments) { }
|
268
295
|
|
269
296
|
/**
|
270
|
-
* Detect if `arguments` objects are `Object` objects (all but Opera < 10.5).
|
297
|
+
* Detect if `arguments` objects are `Object` objects (all but Narwhal and Opera < 10.5).
|
271
298
|
*
|
272
299
|
* @memberOf _.support
|
273
300
|
* @type Boolean
|
274
301
|
*/
|
275
|
-
support.argsObject = arguments.constructor == Object;
|
302
|
+
support.argsObject = arguments.constructor == Object && !(arguments instanceof Array);
|
276
303
|
|
277
304
|
/**
|
278
305
|
* Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).
|
@@ -438,7 +465,7 @@
|
|
438
465
|
* The template used to create iterator functions.
|
439
466
|
*
|
440
467
|
* @private
|
441
|
-
* @param {
|
468
|
+
* @param {Object} data The data object used to populate the text.
|
442
469
|
* @returns {String} Returns the interpolated text.
|
443
470
|
*/
|
444
471
|
var iteratorTemplate = function(obj) {
|
@@ -566,31 +593,27 @@
|
|
566
593
|
* @private
|
567
594
|
* @param {Array} array The array to search.
|
568
595
|
* @param {Mixed} value The value to search for.
|
569
|
-
* @param {Number} fromIndex The index to search from.
|
570
|
-
* @param {Number} largeSize The length at which an array is considered large.
|
571
596
|
* @returns {Boolean} Returns `true`, if `value` is found, else `false`.
|
572
597
|
*/
|
573
|
-
function cachedContains(array
|
598
|
+
function cachedContains(array) {
|
574
599
|
var length = array.length,
|
575
|
-
isLarge =
|
600
|
+
isLarge = length >= largeArraySize;
|
576
601
|
|
577
602
|
if (isLarge) {
|
578
603
|
var cache = {},
|
579
|
-
index =
|
604
|
+
index = -1;
|
580
605
|
|
581
606
|
while (++index < length) {
|
582
|
-
|
583
|
-
|
584
|
-
var key = String(array[index]);
|
585
|
-
(hasOwnProperty.call(cache, key) ? cache[key] : (cache[key] = [])).push(array[index]);
|
607
|
+
var key = keyPrefix + array[index];
|
608
|
+
(cache[key] || (cache[key] = [])).push(array[index]);
|
586
609
|
}
|
587
610
|
}
|
588
611
|
return function(value) {
|
589
612
|
if (isLarge) {
|
590
|
-
var key =
|
591
|
-
return
|
613
|
+
var key = keyPrefix + value;
|
614
|
+
return cache[key] && indexOf(cache[key], value) > -1;
|
592
615
|
}
|
593
|
-
return indexOf(array, value
|
616
|
+
return indexOf(array, value) > -1;
|
594
617
|
}
|
595
618
|
}
|
596
619
|
|
@@ -676,7 +699,7 @@
|
|
676
699
|
}
|
677
700
|
if (partialArgs.length) {
|
678
701
|
args = args.length
|
679
|
-
? (args =
|
702
|
+
? (args = nativeSlice.call(args), rightIndicator ? args.concat(partialArgs) : partialArgs.concat(args))
|
680
703
|
: partialArgs;
|
681
704
|
}
|
682
705
|
if (this instanceof bound) {
|
@@ -702,6 +725,7 @@
|
|
702
725
|
* @param {Object} [options1, options2, ...] The compile options object(s).
|
703
726
|
* arrays - A string of code to determine if the iterable is an array or array-like.
|
704
727
|
* useHas - A boolean to specify using `hasOwnProperty` checks in the object loop.
|
728
|
+
* useKeys - A boolean to specify using `_.keys` for own property iteration.
|
705
729
|
* args - A string of comma separated arguments the iteration function will accept.
|
706
730
|
* top - A string of code to execute before the iteration branches.
|
707
731
|
* loop - A string of code to execute in the object loop.
|
@@ -803,7 +827,7 @@
|
|
803
827
|
}
|
804
828
|
|
805
829
|
/**
|
806
|
-
* A fallback implementation of `isPlainObject`
|
830
|
+
* A fallback implementation of `isPlainObject` which checks if a given `value`
|
807
831
|
* is an object created by the `Object` constructor, assuming objects created
|
808
832
|
* by the `Object` constructor have no inherited enumerable properties and that
|
809
833
|
* there are no `Object.prototype` extensions.
|
@@ -911,29 +935,7 @@
|
|
911
935
|
}
|
912
936
|
|
913
937
|
/**
|
914
|
-
*
|
915
|
-
*
|
916
|
-
* @static
|
917
|
-
* @memberOf _
|
918
|
-
* @category Objects
|
919
|
-
* @param {Mixed} value The value to check.
|
920
|
-
* @returns {Boolean} Returns `true`, if the `value` is an array, else `false`.
|
921
|
-
* @example
|
922
|
-
*
|
923
|
-
* (function() { return _.isArray(arguments); })();
|
924
|
-
* // => false
|
925
|
-
*
|
926
|
-
* _.isArray([1, 2, 3]);
|
927
|
-
* // => true
|
928
|
-
*/
|
929
|
-
var isArray = nativeIsArray || function(value) {
|
930
|
-
// `instanceof` may cause a memory leak in IE 7 if `value` is a host object
|
931
|
-
// http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak
|
932
|
-
return (support.argsObject && value instanceof Array) || toString.call(value) == arrayClass;
|
933
|
-
};
|
934
|
-
|
935
|
-
/**
|
936
|
-
* A fallback implementation of `Object.keys` that produces an array of the
|
938
|
+
* A fallback implementation of `Object.keys` which produces an array of the
|
937
939
|
* given object's own enumerable property names.
|
938
940
|
*
|
939
941
|
* @private
|
@@ -1253,7 +1255,7 @@
|
|
1253
1255
|
* @static
|
1254
1256
|
* @memberOf _
|
1255
1257
|
* @category Objects
|
1256
|
-
* @param {
|
1258
|
+
* @param {Object} object The object to search.
|
1257
1259
|
* @param {Function|Object|String} [callback=identity] The function called per
|
1258
1260
|
* iteration. If a property name or object is passed, it will be used to create
|
1259
1261
|
* a "_.pluck" or "_.where" style callback, respectively.
|
@@ -1261,14 +1263,16 @@
|
|
1261
1263
|
* @returns {Mixed} Returns the key of the found element, else `undefined`.
|
1262
1264
|
* @example
|
1263
1265
|
*
|
1264
|
-
* _.findKey({ 'a': 1, 'b': 2, 'c': 3, 'd': 4 }, function(num) {
|
1266
|
+
* _.findKey({ 'a': 1, 'b': 2, 'c': 3, 'd': 4 }, function(num) {
|
1267
|
+
* return num % 2 == 0;
|
1268
|
+
* });
|
1265
1269
|
* // => 'b'
|
1266
1270
|
*/
|
1267
|
-
function findKey(
|
1271
|
+
function findKey(object, callback, thisArg) {
|
1268
1272
|
var result;
|
1269
1273
|
callback = lodash.createCallback(callback, thisArg);
|
1270
|
-
forOwn(
|
1271
|
-
if (callback(value, key,
|
1274
|
+
forOwn(object, function(value, key, object) {
|
1275
|
+
if (callback(value, key, object)) {
|
1272
1276
|
result = key;
|
1273
1277
|
return false;
|
1274
1278
|
}
|
@@ -1402,6 +1406,29 @@
|
|
1402
1406
|
return result;
|
1403
1407
|
}
|
1404
1408
|
|
1409
|
+
/**
|
1410
|
+
* Checks if `value` is an array.
|
1411
|
+
*
|
1412
|
+
* @static
|
1413
|
+
* @memberOf _
|
1414
|
+
* @category Objects
|
1415
|
+
* @param {Mixed} value The value to check.
|
1416
|
+
* @returns {Boolean} Returns `true`, if the `value` is an array, else `false`.
|
1417
|
+
* @example
|
1418
|
+
*
|
1419
|
+
* (function() { return _.isArray(arguments); })();
|
1420
|
+
* // => false
|
1421
|
+
*
|
1422
|
+
* _.isArray([1, 2, 3]);
|
1423
|
+
* // => true
|
1424
|
+
*/
|
1425
|
+
function isArray(value) {
|
1426
|
+
// `instanceof` may cause a memory leak in IE 7 if `value` is a host object
|
1427
|
+
// http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak
|
1428
|
+
return (support.argsObject && value instanceof Array) ||
|
1429
|
+
(nativeIsArray ? nativeIsArray(value) : toString.call(value) == arrayClass);
|
1430
|
+
}
|
1431
|
+
|
1405
1432
|
/**
|
1406
1433
|
* Checks if `value` is a boolean value.
|
1407
1434
|
*
|
@@ -1536,11 +1563,8 @@
|
|
1536
1563
|
function isEqual(a, b, callback, thisArg, stackA, stackB) {
|
1537
1564
|
// used to indicate that when comparing objects, `a` has at least the properties of `b`
|
1538
1565
|
var whereIndicator = callback === indicatorObject;
|
1539
|
-
if (callback && !whereIndicator) {
|
1540
|
-
callback = (
|
1541
|
-
? callback
|
1542
|
-
: lodash.createCallback(callback, thisArg, 2);
|
1543
|
-
|
1566
|
+
if (typeof callback == 'function' && !whereIndicator) {
|
1567
|
+
callback = lodash.createCallback(callback, thisArg, 2);
|
1544
1568
|
var result = callback(a, b);
|
1545
1569
|
if (typeof result != 'undefined') {
|
1546
1570
|
return !!result;
|
@@ -2026,22 +2050,24 @@
|
|
2026
2050
|
}
|
2027
2051
|
}
|
2028
2052
|
if (!found) {
|
2029
|
-
|
2030
|
-
? (isArray(value) ? value : [])
|
2031
|
-
: (isPlainObject(value) ? value : {});
|
2032
|
-
|
2053
|
+
var isShallow;
|
2033
2054
|
if (callback) {
|
2034
2055
|
result = callback(value, source);
|
2035
|
-
if (typeof result != 'undefined') {
|
2056
|
+
if ((isShallow = typeof result != 'undefined')) {
|
2036
2057
|
value = result;
|
2037
2058
|
}
|
2038
2059
|
}
|
2060
|
+
if (!isShallow) {
|
2061
|
+
value = isArr
|
2062
|
+
? (isArray(value) ? value : [])
|
2063
|
+
: (isPlainObject(value) ? value : {});
|
2064
|
+
}
|
2039
2065
|
// add `source` and associated `value` to the stack of traversed objects
|
2040
2066
|
stackA.push(source);
|
2041
2067
|
stackB.push(value);
|
2042
2068
|
|
2043
2069
|
// recursively merge objects and arrays (susceptible to call stack limits)
|
2044
|
-
if (!
|
2070
|
+
if (!isShallow) {
|
2045
2071
|
value = merge(value, source, indicatorObject, callback, stackA, stackB);
|
2046
2072
|
}
|
2047
2073
|
}
|
@@ -2096,12 +2122,12 @@
|
|
2096
2122
|
if (isFunc) {
|
2097
2123
|
callback = lodash.createCallback(callback, thisArg);
|
2098
2124
|
} else {
|
2099
|
-
var props = concat.apply(arrayRef, arguments);
|
2125
|
+
var props = concat.apply(arrayRef, nativeSlice.call(arguments, 1));
|
2100
2126
|
}
|
2101
2127
|
forIn(object, function(value, key, object) {
|
2102
2128
|
if (isFunc
|
2103
2129
|
? !callback(value, key, object)
|
2104
|
-
: indexOf(props, key
|
2130
|
+
: indexOf(props, key) < 0
|
2105
2131
|
) {
|
2106
2132
|
result[key] = value;
|
2107
2133
|
}
|
@@ -2164,8 +2190,8 @@
|
|
2164
2190
|
function pick(object, callback, thisArg) {
|
2165
2191
|
var result = {};
|
2166
2192
|
if (typeof callback != 'function') {
|
2167
|
-
var index =
|
2168
|
-
props = concat.apply(arrayRef, arguments),
|
2193
|
+
var index = -1,
|
2194
|
+
props = concat.apply(arrayRef, nativeSlice.call(arguments, 1)),
|
2169
2195
|
length = isObject(object) ? props.length : 0;
|
2170
2196
|
|
2171
2197
|
while (++index < length) {
|
@@ -2235,7 +2261,7 @@
|
|
2235
2261
|
*/
|
2236
2262
|
function at(collection) {
|
2237
2263
|
var index = -1,
|
2238
|
-
props = concat.apply(arrayRef,
|
2264
|
+
props = concat.apply(arrayRef, nativeSlice.call(arguments, 1)),
|
2239
2265
|
length = props.length,
|
2240
2266
|
result = Array(length);
|
2241
2267
|
|
@@ -2490,7 +2516,9 @@
|
|
2490
2516
|
* @returns {Mixed} Returns the found element, else `undefined`.
|
2491
2517
|
* @example
|
2492
2518
|
*
|
2493
|
-
* _.find([1, 2, 3, 4], function(num) {
|
2519
|
+
* _.find([1, 2, 3, 4], function(num) {
|
2520
|
+
* return num % 2 == 0;
|
2521
|
+
* });
|
2494
2522
|
* // => 2
|
2495
2523
|
*
|
2496
2524
|
* var food = [
|
@@ -2638,7 +2666,7 @@
|
|
2638
2666
|
* // => [['1', '2', '3'], ['4', '5', '6']]
|
2639
2667
|
*/
|
2640
2668
|
function invoke(collection, methodName) {
|
2641
|
-
var args =
|
2669
|
+
var args = nativeSlice.call(arguments, 2),
|
2642
2670
|
index = -1,
|
2643
2671
|
isFunc = typeof methodName == 'function',
|
2644
2672
|
length = collection ? collection.length : 0,
|
@@ -2868,7 +2896,7 @@
|
|
2868
2896
|
var pluck = map;
|
2869
2897
|
|
2870
2898
|
/**
|
2871
|
-
* Reduces a `collection` to a value
|
2899
|
+
* Reduces a `collection` to a value which is the accumulated result of running
|
2872
2900
|
* each element in the `collection` through the `callback`, where each successive
|
2873
2901
|
* `callback` execution consumes the return value of the previous execution.
|
2874
2902
|
* If `accumulator` is not passed, the first element of the `collection` will be
|
@@ -3275,8 +3303,8 @@
|
|
3275
3303
|
function difference(array) {
|
3276
3304
|
var index = -1,
|
3277
3305
|
length = array ? array.length : 0,
|
3278
|
-
flattened = concat.apply(arrayRef, arguments),
|
3279
|
-
contains = cachedContains(flattened
|
3306
|
+
flattened = concat.apply(arrayRef, nativeSlice.call(arguments, 1)),
|
3307
|
+
contains = cachedContains(flattened),
|
3280
3308
|
result = [];
|
3281
3309
|
|
3282
3310
|
while (++index < length) {
|
@@ -3295,7 +3323,7 @@
|
|
3295
3323
|
* @static
|
3296
3324
|
* @memberOf _
|
3297
3325
|
* @category Arrays
|
3298
|
-
* @param {Array
|
3326
|
+
* @param {Array} array The array to search.
|
3299
3327
|
* @param {Function|Object|String} [callback=identity] The function called per
|
3300
3328
|
* iteration. If a property name or object is passed, it will be used to create
|
3301
3329
|
* a "_.pluck" or "_.where" style callback, respectively.
|
@@ -3303,16 +3331,18 @@
|
|
3303
3331
|
* @returns {Mixed} Returns the index of the found element, else `-1`.
|
3304
3332
|
* @example
|
3305
3333
|
*
|
3306
|
-
* _.findIndex(['apple', 'banana', 'beet'], function(food) {
|
3334
|
+
* _.findIndex(['apple', 'banana', 'beet'], function(food) {
|
3335
|
+
* return /^b/.test(food);
|
3336
|
+
* });
|
3307
3337
|
* // => 1
|
3308
3338
|
*/
|
3309
|
-
function findIndex(
|
3339
|
+
function findIndex(array, callback, thisArg) {
|
3310
3340
|
var index = -1,
|
3311
|
-
length =
|
3341
|
+
length = array ? array.length : 0;
|
3312
3342
|
|
3313
3343
|
callback = lodash.createCallback(callback, thisArg);
|
3314
3344
|
while (++index < length) {
|
3315
|
-
if (callback(
|
3345
|
+
if (callback(array[index], index, array)) {
|
3316
3346
|
return index;
|
3317
3347
|
}
|
3318
3348
|
}
|
@@ -3414,7 +3444,7 @@
|
|
3414
3444
|
* @static
|
3415
3445
|
* @memberOf _
|
3416
3446
|
* @category Arrays
|
3417
|
-
* @param {Array} array The array to
|
3447
|
+
* @param {Array} array The array to flatten.
|
3418
3448
|
* @param {Boolean} [isShallow=false] A flag to indicate only flattening a single level.
|
3419
3449
|
* @param {Function|Object|String} [callback=identity] The function called per
|
3420
3450
|
* iteration. If a property name or object is passed, it will be used to create
|
@@ -3605,7 +3635,7 @@
|
|
3605
3635
|
cache = { '0': {} },
|
3606
3636
|
index = -1,
|
3607
3637
|
length = array ? array.length : 0,
|
3608
|
-
isLarge = length >=
|
3638
|
+
isLarge = length >= largeArraySize,
|
3609
3639
|
result = [],
|
3610
3640
|
seen = result;
|
3611
3641
|
|
@@ -3613,8 +3643,8 @@
|
|
3613
3643
|
while (++index < length) {
|
3614
3644
|
var value = array[index];
|
3615
3645
|
if (isLarge) {
|
3616
|
-
var key =
|
3617
|
-
var inited =
|
3646
|
+
var key = keyPrefix + value;
|
3647
|
+
var inited = cache[0][key]
|
3618
3648
|
? !(seen = cache[0][key])
|
3619
3649
|
: (seen = cache[0][key] = []);
|
3620
3650
|
}
|
@@ -3624,7 +3654,7 @@
|
|
3624
3654
|
}
|
3625
3655
|
var argsIndex = argsLength;
|
3626
3656
|
while (--argsIndex) {
|
3627
|
-
if (!(cache[argsIndex] || (cache[argsIndex] = cachedContains(args[argsIndex]
|
3657
|
+
if (!(cache[argsIndex] || (cache[argsIndex] = cachedContains(args[argsIndex])))(value)) {
|
3628
3658
|
continue outer;
|
3629
3659
|
}
|
3630
3660
|
}
|
@@ -3885,7 +3915,7 @@
|
|
3885
3915
|
* @static
|
3886
3916
|
* @memberOf _
|
3887
3917
|
* @category Arrays
|
3888
|
-
* @param {Array} array The array to
|
3918
|
+
* @param {Array} array The array to inspect.
|
3889
3919
|
* @param {Mixed} value The value to evaluate.
|
3890
3920
|
* @param {Function|Object|String} [callback=identity] The function called per
|
3891
3921
|
* iteration. If a property name or object is passed, it will be used to create
|
@@ -3948,7 +3978,10 @@
|
|
3948
3978
|
* _.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
|
3949
3979
|
* // => [1, 2, 3, 101, 10]
|
3950
3980
|
*/
|
3951
|
-
function union() {
|
3981
|
+
function union(array) {
|
3982
|
+
if (!isArray(array)) {
|
3983
|
+
arguments[0] = array ? nativeSlice.call(array) : arrayRef;
|
3984
|
+
}
|
3952
3985
|
return uniq(concat.apply(arrayRef, arguments));
|
3953
3986
|
}
|
3954
3987
|
|
@@ -4008,7 +4041,7 @@
|
|
4008
4041
|
isSorted = false;
|
4009
4042
|
}
|
4010
4043
|
// init value cache for large arrays
|
4011
|
-
var isLarge = !isSorted && length >=
|
4044
|
+
var isLarge = !isSorted && length >= largeArraySize;
|
4012
4045
|
if (isLarge) {
|
4013
4046
|
var cache = {};
|
4014
4047
|
}
|
@@ -4021,8 +4054,8 @@
|
|
4021
4054
|
computed = callback ? callback(value, index, array) : value;
|
4022
4055
|
|
4023
4056
|
if (isLarge) {
|
4024
|
-
var key =
|
4025
|
-
var inited =
|
4057
|
+
var key = keyPrefix + computed;
|
4058
|
+
var inited = cache[key]
|
4026
4059
|
? !(seen = cache[key])
|
4027
4060
|
: (seen = cache[key] = []);
|
4028
4061
|
}
|
@@ -4039,6 +4072,37 @@
|
|
4039
4072
|
return result;
|
4040
4073
|
}
|
4041
4074
|
|
4075
|
+
/**
|
4076
|
+
* The inverse of `_.zip`, this method splits groups of elements into arrays
|
4077
|
+
* composed of elements from each group at their corresponding indexes.
|
4078
|
+
*
|
4079
|
+
* @static
|
4080
|
+
* @memberOf _
|
4081
|
+
* @category Arrays
|
4082
|
+
* @param {Array} array The array to process.
|
4083
|
+
* @returns {Array} Returns a new array of the composed arrays.
|
4084
|
+
* @example
|
4085
|
+
*
|
4086
|
+
* _.unzip([['moe', 30, true], ['larry', 40, false]]);
|
4087
|
+
* // => [['moe', 'larry'], [30, 40], [true, false]];
|
4088
|
+
*/
|
4089
|
+
function unzip(array) {
|
4090
|
+
var index = -1,
|
4091
|
+
length = array ? array.length : 0,
|
4092
|
+
tupleLength = length ? max(pluck(array, 'length')) : 0,
|
4093
|
+
result = Array(tupleLength);
|
4094
|
+
|
4095
|
+
while (++index < length) {
|
4096
|
+
var tupleIndex = -1,
|
4097
|
+
tuple = array[index];
|
4098
|
+
|
4099
|
+
while (++tupleIndex < tupleLength) {
|
4100
|
+
(result[tupleIndex] || (result[tupleIndex] = Array(length)))[index] = tuple[tupleIndex];
|
4101
|
+
}
|
4102
|
+
}
|
4103
|
+
return result;
|
4104
|
+
}
|
4105
|
+
|
4042
4106
|
/**
|
4043
4107
|
* Creates an array with all occurrences of the passed values removed using
|
4044
4108
|
* strict equality for comparisons, i.e. `===`.
|
@@ -4055,18 +4119,7 @@
|
|
4055
4119
|
* // => [2, 3, 4]
|
4056
4120
|
*/
|
4057
4121
|
function without(array) {
|
4058
|
-
|
4059
|
-
length = array ? array.length : 0,
|
4060
|
-
contains = cachedContains(arguments, 1, 30),
|
4061
|
-
result = [];
|
4062
|
-
|
4063
|
-
while (++index < length) {
|
4064
|
-
var value = array[index];
|
4065
|
-
if (!contains(value)) {
|
4066
|
-
result.push(value);
|
4067
|
-
}
|
4068
|
-
}
|
4069
|
-
return result;
|
4122
|
+
return difference(array, nativeSlice.call(arguments, 1));
|
4070
4123
|
}
|
4071
4124
|
|
4072
4125
|
/**
|
@@ -4192,7 +4245,7 @@
|
|
4192
4245
|
// (in V8 `Function#bind` is slower except when partially applied)
|
4193
4246
|
return support.fastBind || (nativeBind && arguments.length > 2)
|
4194
4247
|
? nativeBind.call.apply(nativeBind, arguments)
|
4195
|
-
: createBound(func, thisArg,
|
4248
|
+
: createBound(func, thisArg, nativeSlice.call(arguments, 2));
|
4196
4249
|
}
|
4197
4250
|
|
4198
4251
|
/**
|
@@ -4219,8 +4272,8 @@
|
|
4219
4272
|
* // => alerts 'clicked docs', when the button is clicked
|
4220
4273
|
*/
|
4221
4274
|
function bindAll(object) {
|
4222
|
-
var funcs = concat.apply(arrayRef, arguments),
|
4223
|
-
index =
|
4275
|
+
var funcs = arguments.length > 1 ? concat.apply(arrayRef, nativeSlice.call(arguments, 1)) : functions(object),
|
4276
|
+
index = -1,
|
4224
4277
|
length = funcs.length;
|
4225
4278
|
|
4226
4279
|
while (++index < length) {
|
@@ -4265,7 +4318,7 @@
|
|
4265
4318
|
* // => 'hi, moe!'
|
4266
4319
|
*/
|
4267
4320
|
function bindKey(object, key) {
|
4268
|
-
return createBound(object, key,
|
4321
|
+
return createBound(object, key, nativeSlice.call(arguments, 2), indicatorObject);
|
4269
4322
|
}
|
4270
4323
|
|
4271
4324
|
/**
|
@@ -4395,44 +4448,53 @@
|
|
4395
4448
|
/**
|
4396
4449
|
* Creates a function that will delay the execution of `func` until after
|
4397
4450
|
* `wait` milliseconds have elapsed since the last time it was invoked. Pass
|
4398
|
-
* `
|
4399
|
-
*
|
4400
|
-
*
|
4451
|
+
* an `options` object to indicate that `func` should be invoked on the leading
|
4452
|
+
* and/or trailing edge of the `wait` timeout. Subsequent calls to the debounced
|
4453
|
+
* function will return the result of the last `func` call.
|
4401
4454
|
*
|
4402
4455
|
* @static
|
4403
4456
|
* @memberOf _
|
4404
4457
|
* @category Functions
|
4405
4458
|
* @param {Function} func The function to debounce.
|
4406
4459
|
* @param {Number} wait The number of milliseconds to delay.
|
4407
|
-
* @param {
|
4408
|
-
* edge of the timeout.
|
4460
|
+
* @param {Object} options The options object.
|
4461
|
+
* [leading=false] A boolean to specify execution on the leading edge of the timeout.
|
4462
|
+
* [trailing=true] A boolean to specify execution on the trailing edge of the timeout.
|
4409
4463
|
* @returns {Function} Returns the new debounced function.
|
4410
4464
|
* @example
|
4411
4465
|
*
|
4412
4466
|
* var lazyLayout = _.debounce(calculateLayout, 300);
|
4413
4467
|
* jQuery(window).on('resize', lazyLayout);
|
4414
4468
|
*/
|
4415
|
-
function debounce(func, wait,
|
4469
|
+
function debounce(func, wait, options) {
|
4416
4470
|
var args,
|
4417
4471
|
result,
|
4418
4472
|
thisArg,
|
4419
|
-
timeoutId
|
4473
|
+
timeoutId,
|
4474
|
+
trailing = true;
|
4420
4475
|
|
4421
4476
|
function delayed() {
|
4422
4477
|
timeoutId = null;
|
4423
|
-
if (
|
4478
|
+
if (trailing) {
|
4424
4479
|
result = func.apply(thisArg, args);
|
4425
4480
|
}
|
4426
4481
|
}
|
4482
|
+
if (options === true) {
|
4483
|
+
var leading = true;
|
4484
|
+
trailing = false;
|
4485
|
+
} else if (options && objectTypes[typeof options]) {
|
4486
|
+
leading = options.leading;
|
4487
|
+
trailing = 'trailing' in options ? options.trailing : trailing;
|
4488
|
+
}
|
4427
4489
|
return function() {
|
4428
|
-
var
|
4490
|
+
var isLeading = leading && !timeoutId;
|
4429
4491
|
args = arguments;
|
4430
4492
|
thisArg = this;
|
4431
4493
|
|
4432
4494
|
clearTimeout(timeoutId);
|
4433
4495
|
timeoutId = setTimeout(delayed, wait);
|
4434
4496
|
|
4435
|
-
if (
|
4497
|
+
if (isLeading) {
|
4436
4498
|
result = func.apply(thisArg, args);
|
4437
4499
|
}
|
4438
4500
|
return result;
|
@@ -4455,7 +4517,7 @@
|
|
4455
4517
|
* // returns from the function before `alert` is called
|
4456
4518
|
*/
|
4457
4519
|
function defer(func) {
|
4458
|
-
var args =
|
4520
|
+
var args = nativeSlice.call(arguments, 1);
|
4459
4521
|
return setTimeout(function() { func.apply(undefined, args); }, 1);
|
4460
4522
|
}
|
4461
4523
|
// use `setImmediate` if it's available in Node.js
|
@@ -4481,7 +4543,7 @@
|
|
4481
4543
|
* // => 'logged later' (Appears after one second.)
|
4482
4544
|
*/
|
4483
4545
|
function delay(func, wait) {
|
4484
|
-
var args =
|
4546
|
+
var args = nativeSlice.call(arguments, 2);
|
4485
4547
|
return setTimeout(function() { func.apply(undefined, args); }, wait);
|
4486
4548
|
}
|
4487
4549
|
|
@@ -4507,7 +4569,7 @@
|
|
4507
4569
|
function memoize(func, resolver) {
|
4508
4570
|
var cache = {};
|
4509
4571
|
return function() {
|
4510
|
-
var key =
|
4572
|
+
var key = keyPrefix + (resolver ? resolver.apply(this, arguments) : arguments[0]);
|
4511
4573
|
return hasOwnProperty.call(cache, key)
|
4512
4574
|
? cache[key]
|
4513
4575
|
: (cache[key] = func.apply(this, arguments));
|
@@ -4567,7 +4629,7 @@
|
|
4567
4629
|
* // => 'hi moe'
|
4568
4630
|
*/
|
4569
4631
|
function partial(func) {
|
4570
|
-
return createBound(func,
|
4632
|
+
return createBound(func, nativeSlice.call(arguments, 1));
|
4571
4633
|
}
|
4572
4634
|
|
4573
4635
|
/**
|
@@ -4598,43 +4660,61 @@
|
|
4598
4660
|
* // => { '_': _, 'jq': $ }
|
4599
4661
|
*/
|
4600
4662
|
function partialRight(func) {
|
4601
|
-
return createBound(func,
|
4663
|
+
return createBound(func, nativeSlice.call(arguments, 1), null, indicatorObject);
|
4602
4664
|
}
|
4603
4665
|
|
4604
4666
|
/**
|
4605
|
-
* Creates a function that, when executed, will only call the `func`
|
4606
|
-
*
|
4607
|
-
*
|
4608
|
-
*
|
4609
|
-
*
|
4667
|
+
* Creates a function that, when executed, will only call the `func` function
|
4668
|
+
* at most once per every `wait` milliseconds. If the throttled function is
|
4669
|
+
* invoked more than once during the `wait` timeout, `func` will also be called
|
4670
|
+
* on the trailing edge of the timeout. Pass an `options` object to indicate
|
4671
|
+
* that `func` should be invoked on the leading and/or trailing edge of the
|
4672
|
+
* `wait` timeout. Subsequent calls to the throttled function will return
|
4673
|
+
* the result of the last `func` call.
|
4610
4674
|
*
|
4611
4675
|
* @static
|
4612
4676
|
* @memberOf _
|
4613
4677
|
* @category Functions
|
4614
4678
|
* @param {Function} func The function to throttle.
|
4615
4679
|
* @param {Number} wait The number of milliseconds to throttle executions to.
|
4680
|
+
* @param {Object} options The options object.
|
4681
|
+
* [leading=true] A boolean to specify execution on the leading edge of the timeout.
|
4682
|
+
* [trailing=true] A boolean to specify execution on the trailing edge of the timeout.
|
4616
4683
|
* @returns {Function} Returns the new throttled function.
|
4617
4684
|
* @example
|
4618
4685
|
*
|
4619
4686
|
* var throttled = _.throttle(updatePosition, 100);
|
4620
4687
|
* jQuery(window).on('scroll', throttled);
|
4621
4688
|
*/
|
4622
|
-
function throttle(func, wait) {
|
4689
|
+
function throttle(func, wait, options) {
|
4623
4690
|
var args,
|
4624
4691
|
result,
|
4625
4692
|
thisArg,
|
4626
4693
|
timeoutId,
|
4627
|
-
lastCalled = 0
|
4694
|
+
lastCalled = 0,
|
4695
|
+
leading = true,
|
4696
|
+
trailing = true;
|
4628
4697
|
|
4629
4698
|
function trailingCall() {
|
4630
4699
|
lastCalled = new Date;
|
4631
4700
|
timeoutId = null;
|
4632
|
-
|
4701
|
+
|
4702
|
+
if (trailing) {
|
4703
|
+
result = func.apply(thisArg, args);
|
4704
|
+
}
|
4705
|
+
}
|
4706
|
+
if (options === false) {
|
4707
|
+
leading = false;
|
4708
|
+
} else if (options && objectTypes[typeof options]) {
|
4709
|
+
leading = 'leading' in options ? options.leading : leading;
|
4710
|
+
trailing = 'trailing' in options ? options.trailing : trailing;
|
4633
4711
|
}
|
4634
4712
|
return function() {
|
4635
|
-
var now = new Date
|
4636
|
-
|
4637
|
-
|
4713
|
+
var now = new Date;
|
4714
|
+
if (!timeoutId && !leading) {
|
4715
|
+
lastCalled = now;
|
4716
|
+
}
|
4717
|
+
var remaining = wait - (now - lastCalled);
|
4638
4718
|
args = arguments;
|
4639
4719
|
thisArg = this;
|
4640
4720
|
|
@@ -4864,9 +4944,6 @@
|
|
4864
4944
|
* Note: In the development build, `_.template` utilizes sourceURLs for easier
|
4865
4945
|
* debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
|
4866
4946
|
*
|
4867
|
-
* Note: Lo-Dash may be used in Chrome extensions by either creating a `lodash csp`
|
4868
|
-
* build and using precompiled templates, or loading Lo-Dash in a sandbox.
|
4869
|
-
*
|
4870
4947
|
* For more information on precompiling templates see:
|
4871
4948
|
* http://lodash.com/#custom-builds
|
4872
4949
|
*
|
@@ -4877,7 +4954,7 @@
|
|
4877
4954
|
* @memberOf _
|
4878
4955
|
* @category Utilities
|
4879
4956
|
* @param {String} text The template text.
|
4880
|
-
* @param {
|
4957
|
+
* @param {Object} data The data object used to populate the text.
|
4881
4958
|
* @param {Object} options The options object.
|
4882
4959
|
* escape - The "escape" delimiter regexp.
|
4883
4960
|
* evaluate - The "evaluate" delimiter regexp.
|
@@ -5077,7 +5154,7 @@
|
|
5077
5154
|
}
|
5078
5155
|
|
5079
5156
|
/**
|
5080
|
-
* The
|
5157
|
+
* The inverse of `_.escape`, this method converts the HTML entities
|
5081
5158
|
* `&`, `<`, `>`, `"`, and `'` in `string` to their
|
5082
5159
|
* corresponding characters.
|
5083
5160
|
*
|
@@ -5230,6 +5307,7 @@
|
|
5230
5307
|
lodash.toArray = toArray;
|
5231
5308
|
lodash.union = union;
|
5232
5309
|
lodash.uniq = uniq;
|
5310
|
+
lodash.unzip = unzip;
|
5233
5311
|
lodash.values = values;
|
5234
5312
|
lodash.where = where;
|
5235
5313
|
lodash.without = without;
|
@@ -5347,7 +5425,7 @@
|
|
5347
5425
|
* @memberOf _
|
5348
5426
|
* @type String
|
5349
5427
|
*/
|
5350
|
-
lodash.VERSION = '1.
|
5428
|
+
lodash.VERSION = '1.2.0';
|
5351
5429
|
|
5352
5430
|
// add "Chaining" functions to the wrapper
|
5353
5431
|
lodash.prototype.toString = wrapperToString;
|