lodash-rails 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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;
|