lodash-rails 2.2.1 → 2.3.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 +783 -552
- data/vendor/assets/javascripts/lodash.compat.min.js +54 -52
- data/vendor/assets/javascripts/lodash.js +776 -545
- data/vendor/assets/javascripts/lodash.min.js +51 -50
- data/vendor/assets/javascripts/lodash.underscore.js +553 -439
- data/vendor/assets/javascripts/lodash.underscore.min.js +35 -34
- 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: 609a957fdd98e57cda8ec71991b828b347e1f72b
|
4
|
+
data.tar.gz: ee91615b8dab7e1a09736c0bc29bbf2d39537fd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58cf03aa0a3a6e6fcd79d1184f739e10fd146ab805e01619d2e0e9191962ff5b84d380c4def7dfeb29516df8309d61411c416a448859fb52a232f6736d15b635
|
7
|
+
data.tar.gz: bfadb809b748b42dda8766341b9979f0cbbed08776b399ec55c31ecc3570d17ac4eab3105f407b67c3e714488b566143981255d4407326fc64bd6626dc4ab6ac
|
data/README.md
CHANGED
data/lib/lodash/rails/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/**
|
2
2
|
* @license
|
3
|
-
* Lo-Dash 2.
|
3
|
+
* Lo-Dash 2.3.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.5.2 <http://underscorejs.org/LICENSE>
|
@@ -58,7 +58,7 @@
|
|
58
58
|
var reFlags = /\w*$/;
|
59
59
|
|
60
60
|
/** Used to detected named functions */
|
61
|
-
var reFuncName =
|
61
|
+
var reFuncName = /^\s*function[ \n\r\t]+\w/;
|
62
62
|
|
63
63
|
/** Used to match "interpolate" template delimiters */
|
64
64
|
var reInterpolate = /<%=([\s\S]+?)%>/g;
|
@@ -391,15 +391,6 @@
|
|
391
391
|
return typeof value.toString != 'function' && typeof (value + '') == 'string';
|
392
392
|
}
|
393
393
|
|
394
|
-
/**
|
395
|
-
* A no-operation function.
|
396
|
-
*
|
397
|
-
* @private
|
398
|
-
*/
|
399
|
-
function noop() {
|
400
|
-
// no operation performed
|
401
|
-
}
|
402
|
-
|
403
394
|
/**
|
404
395
|
* Releases the given array back to the array pool.
|
405
396
|
*
|
@@ -505,11 +496,14 @@
|
|
505
496
|
/** Used to restore the original `_` reference in `noConflict` */
|
506
497
|
var oldDash = context._;
|
507
498
|
|
499
|
+
/** Used to resolve the internal [[Class]] of values */
|
500
|
+
var toString = objectProto.toString;
|
501
|
+
|
508
502
|
/** Used to detect if a method is native */
|
509
503
|
var reNative = RegExp('^' +
|
510
|
-
String(
|
504
|
+
String(toString)
|
511
505
|
.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
|
512
|
-
.replace(/
|
506
|
+
.replace(/toString| for [^\]]+/g, '.*?') + '$'
|
513
507
|
);
|
514
508
|
|
515
509
|
/** Native method shortcuts */
|
@@ -522,13 +516,16 @@
|
|
522
516
|
now = reNative.test(now = Date.now) && now || function() { return +new Date; },
|
523
517
|
push = arrayRef.push,
|
524
518
|
propertyIsEnumerable = objectProto.propertyIsEnumerable,
|
525
|
-
setImmediate = context.setImmediate,
|
526
519
|
setTimeout = context.setTimeout,
|
527
|
-
splice = arrayRef.splice
|
528
|
-
|
529
|
-
|
520
|
+
splice = arrayRef.splice;
|
521
|
+
|
522
|
+
/** Used to detect `setImmediate` in Node.js */
|
523
|
+
var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&
|
524
|
+
!reNative.test(setImmediate) && setImmediate;
|
530
525
|
|
526
|
+
/** Used to set meta data on functions */
|
531
527
|
var defineProperty = (function() {
|
528
|
+
// IE 8 only accepts DOM elements
|
532
529
|
try {
|
533
530
|
var o = {},
|
534
531
|
func = reNative.test(func = Object.defineProperty) && func,
|
@@ -538,8 +535,7 @@
|
|
538
535
|
}());
|
539
536
|
|
540
537
|
/* Native method shortcuts for methods with the same name as other `lodash` methods */
|
541
|
-
var
|
542
|
-
nativeCreate = reNative.test(nativeCreate = Object.create) && nativeCreate,
|
538
|
+
var nativeCreate = reNative.test(nativeCreate = Object.create) && nativeCreate,
|
543
539
|
nativeIsArray = reNative.test(nativeIsArray = Array.isArray) && nativeIsArray,
|
544
540
|
nativeIsFinite = context.isFinite,
|
545
541
|
nativeIsNaN = context.isNaN,
|
@@ -547,12 +543,7 @@
|
|
547
543
|
nativeMax = Math.max,
|
548
544
|
nativeMin = Math.min,
|
549
545
|
nativeParseInt = context.parseInt,
|
550
|
-
nativeRandom = Math.random
|
551
|
-
nativeSlice = arrayRef.slice;
|
552
|
-
|
553
|
-
/** Detect various environments */
|
554
|
-
var isIeOpera = reNative.test(context.attachEvent),
|
555
|
-
isV8 = nativeBind && !/\n|true/.test(nativeBind + isIeOpera);
|
546
|
+
nativeRandom = Math.random;
|
556
547
|
|
557
548
|
/** Used to lookup a built-in constructor by [[Class]] */
|
558
549
|
var ctorByClass = {};
|
@@ -575,10 +566,10 @@
|
|
575
566
|
(function() {
|
576
567
|
var length = shadowedProps.length;
|
577
568
|
while (length--) {
|
578
|
-
var
|
569
|
+
var key = shadowedProps[length];
|
579
570
|
for (var className in nonEnumProps) {
|
580
|
-
if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className],
|
581
|
-
nonEnumProps[className][
|
571
|
+
if (hasOwnProperty.call(nonEnumProps, className) && !hasOwnProperty.call(nonEnumProps[className], key)) {
|
572
|
+
nonEnumProps[className][key] = false;
|
582
573
|
}
|
583
574
|
}
|
584
575
|
}
|
@@ -599,15 +590,16 @@
|
|
599
590
|
*
|
600
591
|
* The chainable wrapper functions are:
|
601
592
|
* `after`, `assign`, `bind`, `bindAll`, `bindKey`, `chain`, `compact`,
|
602
|
-
* `compose`, `concat`, `countBy`, `
|
603
|
-
* `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
|
604
|
-
* `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
|
605
|
-
* `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
|
606
|
-
* `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
|
607
|
-
* `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
|
608
|
-
* `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
|
609
|
-
* `
|
610
|
-
* `unzip`, `values`, `where`, `without`, `wrap`,
|
593
|
+
* `compose`, `concat`, `countBy`, `create`, `createCallback`, `curry`,
|
594
|
+
* `debounce`, `defaults`, `defer`, `delay`, `difference`, `filter`, `flatten`,
|
595
|
+
* `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`, `forOwnRight`,
|
596
|
+
* `functions`, `groupBy`, `indexBy`, `initial`, `intersection`, `invert`,
|
597
|
+
* `invoke`, `keys`, `map`, `max`, `memoize`, `merge`, `min`, `object`, `omit`,
|
598
|
+
* `once`, `pairs`, `partial`, `partialRight`, `pick`, `pluck`, `pull`, `push`,
|
599
|
+
* `range`, `reject`, `remove`, `rest`, `reverse`, `shuffle`, `slice`, `sort`,
|
600
|
+
* `sortBy`, `splice`, `tap`, `throttle`, `times`, `toArray`, `transform`,
|
601
|
+
* `union`, `uniq`, `unshift`, `unzip`, `values`, `where`, `without`, `wrap`,
|
602
|
+
* and `zip`
|
611
603
|
*
|
612
604
|
* The non-chainable wrapper functions are:
|
613
605
|
* `clone`, `cloneDeep`, `contains`, `escape`, `every`, `find`, `findIndex`,
|
@@ -687,8 +679,8 @@
|
|
687
679
|
props = [];
|
688
680
|
|
689
681
|
ctor.prototype = { 'valueOf': 1, 'y': 1 };
|
690
|
-
for (var
|
691
|
-
for (
|
682
|
+
for (var key in new ctor) { props.push(key); }
|
683
|
+
for (key in arguments) { }
|
692
684
|
|
693
685
|
/**
|
694
686
|
* Detect if an `arguments` object's [[Class]] is resolvable (all but Firefox < 4, IE < 9).
|
@@ -728,14 +720,6 @@
|
|
728
720
|
*/
|
729
721
|
support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');
|
730
722
|
|
731
|
-
/**
|
732
|
-
* Detect if `Function#bind` exists and is inferred to be fast (all but V8).
|
733
|
-
*
|
734
|
-
* @memberOf _.support
|
735
|
-
* @type boolean
|
736
|
-
*/
|
737
|
-
support.fastBind = nativeBind && !isV8;
|
738
|
-
|
739
723
|
/**
|
740
724
|
* Detect if functions can be decompiled by `Function#toString`
|
741
725
|
* (all but PS3 and older Opera mobile browsers & avoided in Windows 8 apps).
|
@@ -760,7 +744,7 @@
|
|
760
744
|
* @memberOf _.support
|
761
745
|
* @type boolean
|
762
746
|
*/
|
763
|
-
support.nonEnumArgs =
|
747
|
+
support.nonEnumArgs = key != 0;
|
764
748
|
|
765
749
|
/**
|
766
750
|
* Detect if properties shadowing those on `Object.prototype` are non-enumerable.
|
@@ -984,19 +968,53 @@
|
|
984
968
|
|
985
969
|
/*--------------------------------------------------------------------------*/
|
986
970
|
|
971
|
+
/**
|
972
|
+
* The base implementation of `_.bind` that creates the bound function and
|
973
|
+
* sets its meta data.
|
974
|
+
*
|
975
|
+
* @private
|
976
|
+
* @param {Array} bindData The bind data array.
|
977
|
+
* @returns {Function} Returns the new bound function.
|
978
|
+
*/
|
979
|
+
function baseBind(bindData) {
|
980
|
+
var func = bindData[0],
|
981
|
+
partialArgs = bindData[2],
|
982
|
+
thisArg = bindData[4];
|
983
|
+
|
984
|
+
function bound() {
|
985
|
+
// `Function#bind` spec
|
986
|
+
// http://es5.github.io/#x15.3.4.5
|
987
|
+
if (partialArgs) {
|
988
|
+
var args = partialArgs.slice();
|
989
|
+
push.apply(args, arguments);
|
990
|
+
}
|
991
|
+
// mimic the constructor's `return` behavior
|
992
|
+
// http://es5.github.io/#x13.2.2
|
993
|
+
if (this instanceof bound) {
|
994
|
+
// ensure `new bound` is an instance of `func`
|
995
|
+
var thisBinding = baseCreate(func.prototype),
|
996
|
+
result = func.apply(thisBinding, args || arguments);
|
997
|
+
return isObject(result) ? result : thisBinding;
|
998
|
+
}
|
999
|
+
return func.apply(thisArg, args || arguments);
|
1000
|
+
}
|
1001
|
+
setBindData(bound, bindData);
|
1002
|
+
return bound;
|
1003
|
+
}
|
1004
|
+
|
987
1005
|
/**
|
988
1006
|
* The base implementation of `_.clone` without argument juggling or support
|
989
1007
|
* for `thisArg` binding.
|
990
1008
|
*
|
991
1009
|
* @private
|
992
1010
|
* @param {*} value The value to clone.
|
993
|
-
* @param {boolean} [
|
1011
|
+
* @param {boolean} [isDeep=false] Specify a deep clone.
|
994
1012
|
* @param {Function} [callback] The function to customize cloning values.
|
995
1013
|
* @param {Array} [stackA=[]] Tracks traversed source objects.
|
996
1014
|
* @param {Array} [stackB=[]] Associates clones with source counterparts.
|
997
1015
|
* @returns {*} Returns the cloned value.
|
998
1016
|
*/
|
999
|
-
function baseClone(value,
|
1017
|
+
function baseClone(value, isDeep, callback, stackA, stackB) {
|
1000
1018
|
if (callback) {
|
1001
1019
|
var result = callback(value);
|
1002
1020
|
if (typeof result != 'undefined') {
|
@@ -1029,7 +1047,7 @@
|
|
1029
1047
|
return value;
|
1030
1048
|
}
|
1031
1049
|
var isArr = isArray(value);
|
1032
|
-
if (
|
1050
|
+
if (isDeep) {
|
1033
1051
|
// check for circular references and return corresponding clone
|
1034
1052
|
var initedStack = !stackA;
|
1035
1053
|
stackA || (stackA = getArray());
|
@@ -1056,7 +1074,7 @@
|
|
1056
1074
|
}
|
1057
1075
|
}
|
1058
1076
|
// exit for shallow clone
|
1059
|
-
if (!
|
1077
|
+
if (!isDeep) {
|
1060
1078
|
return result;
|
1061
1079
|
}
|
1062
1080
|
// add the source value to the stack of traversed objects
|
@@ -1066,7 +1084,7 @@
|
|
1066
1084
|
|
1067
1085
|
// recursively populate clone (susceptible to call stack limits)
|
1068
1086
|
(isArr ? baseEach : forOwn)(value, function(objValue, key) {
|
1069
|
-
result[key] = baseClone(objValue,
|
1087
|
+
result[key] = baseClone(objValue, isDeep, callback, stackA, stackB);
|
1070
1088
|
});
|
1071
1089
|
|
1072
1090
|
if (initedStack) {
|
@@ -1076,6 +1094,32 @@
|
|
1076
1094
|
return result;
|
1077
1095
|
}
|
1078
1096
|
|
1097
|
+
/**
|
1098
|
+
* The base implementation of `_.create` without support for assigning
|
1099
|
+
* properties to the created object.
|
1100
|
+
*
|
1101
|
+
* @private
|
1102
|
+
* @param {Object} prototype The object to inherit from.
|
1103
|
+
* @returns {Object} Returns the new object.
|
1104
|
+
*/
|
1105
|
+
function baseCreate(prototype, properties) {
|
1106
|
+
return isObject(prototype) ? nativeCreate(prototype) : {};
|
1107
|
+
}
|
1108
|
+
// fallback for browsers without `Object.create`
|
1109
|
+
if (!nativeCreate) {
|
1110
|
+
baseCreate = (function() {
|
1111
|
+
function Object() {}
|
1112
|
+
return function(prototype) {
|
1113
|
+
if (isObject(prototype)) {
|
1114
|
+
Object.prototype = prototype;
|
1115
|
+
var result = new Object;
|
1116
|
+
Object.prototype = null;
|
1117
|
+
}
|
1118
|
+
return result || context.Object();
|
1119
|
+
};
|
1120
|
+
}());
|
1121
|
+
}
|
1122
|
+
|
1079
1123
|
/**
|
1080
1124
|
* The base implementation of `_.createCallback` without support for creating
|
1081
1125
|
* "_.pluck" or "_.where" style callbacks.
|
@@ -1090,24 +1134,30 @@
|
|
1090
1134
|
if (typeof func != 'function') {
|
1091
1135
|
return identity;
|
1092
1136
|
}
|
1093
|
-
// exit early
|
1094
|
-
if (typeof thisArg == 'undefined') {
|
1137
|
+
// exit early for no `thisArg` or already bound by `Function#bind`
|
1138
|
+
if (typeof thisArg == 'undefined' || !('prototype' in func)) {
|
1095
1139
|
return func;
|
1096
1140
|
}
|
1097
|
-
var bindData = func.__bindData__
|
1141
|
+
var bindData = func.__bindData__;
|
1098
1142
|
if (typeof bindData == 'undefined') {
|
1099
|
-
|
1100
|
-
|
1101
|
-
bindData = true;
|
1143
|
+
if (support.funcNames) {
|
1144
|
+
bindData = !func.name;
|
1102
1145
|
}
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1146
|
+
bindData = bindData || !support.funcDecomp;
|
1147
|
+
if (!bindData) {
|
1148
|
+
var source = fnToString.call(func);
|
1149
|
+
if (!support.funcNames) {
|
1150
|
+
bindData = !reFuncName.test(source);
|
1151
|
+
}
|
1152
|
+
if (!bindData) {
|
1153
|
+
// checks if `func` references the `this` keyword and stores the result
|
1154
|
+
bindData = reThis.test(source);
|
1155
|
+
setBindData(func, bindData);
|
1156
|
+
}
|
1107
1157
|
}
|
1108
1158
|
}
|
1109
1159
|
// exit early if there are no `this` references or `func` is bound
|
1110
|
-
if (bindData
|
1160
|
+
if (bindData === false || (bindData !== true && bindData[1] & 1)) {
|
1111
1161
|
return func;
|
1112
1162
|
}
|
1113
1163
|
switch (argCount) {
|
@@ -1127,6 +1177,96 @@
|
|
1127
1177
|
return bind(func, thisArg);
|
1128
1178
|
}
|
1129
1179
|
|
1180
|
+
/**
|
1181
|
+
* The base implementation of `createWrapper` that creates the wrapper and
|
1182
|
+
* sets its meta data.
|
1183
|
+
*
|
1184
|
+
* @private
|
1185
|
+
* @param {Array} bindData The bind data array.
|
1186
|
+
* @returns {Function} Returns the new function.
|
1187
|
+
*/
|
1188
|
+
function baseCreateWrapper(bindData) {
|
1189
|
+
var func = bindData[0],
|
1190
|
+
bitmask = bindData[1],
|
1191
|
+
partialArgs = bindData[2],
|
1192
|
+
partialRightArgs = bindData[3],
|
1193
|
+
thisArg = bindData[4],
|
1194
|
+
arity = bindData[5];
|
1195
|
+
|
1196
|
+
var isBind = bitmask & 1,
|
1197
|
+
isBindKey = bitmask & 2,
|
1198
|
+
isCurry = bitmask & 4,
|
1199
|
+
isCurryBound = bitmask & 8,
|
1200
|
+
key = func;
|
1201
|
+
|
1202
|
+
function bound() {
|
1203
|
+
var thisBinding = isBind ? thisArg : this;
|
1204
|
+
if (partialArgs) {
|
1205
|
+
var args = partialArgs.slice();
|
1206
|
+
push.apply(args, arguments);
|
1207
|
+
}
|
1208
|
+
if (partialRightArgs || isCurry) {
|
1209
|
+
args || (args = slice(arguments));
|
1210
|
+
if (partialRightArgs) {
|
1211
|
+
push.apply(args, partialRightArgs);
|
1212
|
+
}
|
1213
|
+
if (isCurry && args.length < arity) {
|
1214
|
+
bitmask |= 16 & ~32;
|
1215
|
+
return baseCreateWrapper([func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity]);
|
1216
|
+
}
|
1217
|
+
}
|
1218
|
+
args || (args = arguments);
|
1219
|
+
if (isBindKey) {
|
1220
|
+
func = thisBinding[key];
|
1221
|
+
}
|
1222
|
+
if (this instanceof bound) {
|
1223
|
+
thisBinding = baseCreate(func.prototype);
|
1224
|
+
var result = func.apply(thisBinding, args);
|
1225
|
+
return isObject(result) ? result : thisBinding;
|
1226
|
+
}
|
1227
|
+
return func.apply(thisBinding, args);
|
1228
|
+
}
|
1229
|
+
setBindData(bound, bindData);
|
1230
|
+
return bound;
|
1231
|
+
}
|
1232
|
+
|
1233
|
+
/**
|
1234
|
+
* The base implementation of `_.difference` that accepts a single array
|
1235
|
+
* of values to exclude.
|
1236
|
+
*
|
1237
|
+
* @private
|
1238
|
+
* @param {Array} array The array to process.
|
1239
|
+
* @param {Array} [values] The array of values to exclude.
|
1240
|
+
* @returns {Array} Returns a new array of filtered values.
|
1241
|
+
*/
|
1242
|
+
function baseDifference(array, values) {
|
1243
|
+
var index = -1,
|
1244
|
+
indexOf = getIndexOf(),
|
1245
|
+
length = array ? array.length : 0,
|
1246
|
+
isLarge = length >= largeArraySize && indexOf === baseIndexOf,
|
1247
|
+
result = [];
|
1248
|
+
|
1249
|
+
if (isLarge) {
|
1250
|
+
var cache = createCache(values);
|
1251
|
+
if (cache) {
|
1252
|
+
indexOf = cacheIndexOf;
|
1253
|
+
values = cache;
|
1254
|
+
} else {
|
1255
|
+
isLarge = false;
|
1256
|
+
}
|
1257
|
+
}
|
1258
|
+
while (++index < length) {
|
1259
|
+
var value = array[index];
|
1260
|
+
if (indexOf(values, value) < 0) {
|
1261
|
+
result.push(value);
|
1262
|
+
}
|
1263
|
+
}
|
1264
|
+
if (isLarge) {
|
1265
|
+
releaseObject(values);
|
1266
|
+
}
|
1267
|
+
return result;
|
1268
|
+
}
|
1269
|
+
|
1130
1270
|
/**
|
1131
1271
|
* The base implementation of `_.flatten` without support for callback
|
1132
1272
|
* shorthands or `thisArg` binding.
|
@@ -1134,11 +1274,11 @@
|
|
1134
1274
|
* @private
|
1135
1275
|
* @param {Array} array The array to flatten.
|
1136
1276
|
* @param {boolean} [isShallow=false] A flag to restrict flattening to a single level.
|
1137
|
-
* @param {boolean} [
|
1277
|
+
* @param {boolean} [isStrict=false] A flag to restrict flattening to arrays and `arguments` objects.
|
1138
1278
|
* @param {number} [fromIndex=0] The index to start from.
|
1139
1279
|
* @returns {Array} Returns a new flattened array.
|
1140
1280
|
*/
|
1141
|
-
function baseFlatten(array, isShallow,
|
1281
|
+
function baseFlatten(array, isShallow, isStrict, fromIndex) {
|
1142
1282
|
var index = (fromIndex || 0) - 1,
|
1143
1283
|
length = array ? array.length : 0,
|
1144
1284
|
result = [];
|
@@ -1150,7 +1290,7 @@
|
|
1150
1290
|
&& (isArray(value) || isArguments(value))) {
|
1151
1291
|
// recursively flatten arrays (susceptible to call stack limits)
|
1152
1292
|
if (!isShallow) {
|
1153
|
-
value = baseFlatten(value, isShallow,
|
1293
|
+
value = baseFlatten(value, isShallow, isStrict);
|
1154
1294
|
}
|
1155
1295
|
var valIndex = -1,
|
1156
1296
|
valLength = value.length,
|
@@ -1160,7 +1300,7 @@
|
|
1160
1300
|
while (++valIndex < valLength) {
|
1161
1301
|
result[resIndex++] = value[valIndex];
|
1162
1302
|
}
|
1163
|
-
} else if (!
|
1303
|
+
} else if (!isStrict) {
|
1164
1304
|
result.push(value);
|
1165
1305
|
}
|
1166
1306
|
}
|
@@ -1243,8 +1383,11 @@
|
|
1243
1383
|
var isArr = className == arrayClass;
|
1244
1384
|
if (!isArr) {
|
1245
1385
|
// unwrap any `lodash` wrapped values
|
1246
|
-
|
1247
|
-
|
1386
|
+
var aWrapped = hasOwnProperty.call(a, '__wrapped__'),
|
1387
|
+
bWrapped = hasOwnProperty.call(b, '__wrapped__');
|
1388
|
+
|
1389
|
+
if (aWrapped || bWrapped) {
|
1390
|
+
return baseIsEqual(aWrapped ? a.__wrapped__ : a, bWrapped ? b.__wrapped__ : b, callback, isWhere, stackA, stackB);
|
1248
1391
|
}
|
1249
1392
|
// exit for functions and DOM nodes
|
1250
1393
|
if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {
|
@@ -1255,10 +1398,10 @@
|
|
1255
1398
|
ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;
|
1256
1399
|
|
1257
1400
|
// non `Object` object instances with different constructors are not equal
|
1258
|
-
if (ctorA != ctorB &&
|
1259
|
-
isFunction(ctorA) && ctorA instanceof ctorA &&
|
1260
|
-
|
1261
|
-
)
|
1401
|
+
if (ctorA != ctorB &&
|
1402
|
+
!(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&
|
1403
|
+
('constructor' in a && 'constructor' in b)
|
1404
|
+
) {
|
1262
1405
|
return false;
|
1263
1406
|
}
|
1264
1407
|
}
|
@@ -1401,6 +1544,19 @@
|
|
1401
1544
|
});
|
1402
1545
|
}
|
1403
1546
|
|
1547
|
+
/**
|
1548
|
+
* The base implementation of `_.random` without argument juggling or support
|
1549
|
+
* for returning floating-point numbers.
|
1550
|
+
*
|
1551
|
+
* @private
|
1552
|
+
* @param {number} min The minimum possible value.
|
1553
|
+
* @param {number} max The maximum possible value.
|
1554
|
+
* @returns {number} Returns a random number.
|
1555
|
+
*/
|
1556
|
+
function baseRandom(min, max) {
|
1557
|
+
return min + floor(nativeRandom() * (max - min + 1));
|
1558
|
+
}
|
1559
|
+
|
1404
1560
|
/**
|
1405
1561
|
* The base implementation of `_.uniq` without support for callback shorthands
|
1406
1562
|
* or `thisArg` binding.
|
@@ -1505,16 +1661,15 @@
|
|
1505
1661
|
* provided to the new function.
|
1506
1662
|
* @param {*} [thisArg] The `this` binding of `func`.
|
1507
1663
|
* @param {number} [arity] The arity of `func`.
|
1508
|
-
* @returns {Function} Returns the new
|
1664
|
+
* @returns {Function} Returns the new function.
|
1509
1665
|
*/
|
1510
|
-
function
|
1666
|
+
function createWrapper(func, bitmask, partialArgs, partialRightArgs, thisArg, arity) {
|
1511
1667
|
var isBind = bitmask & 1,
|
1512
1668
|
isBindKey = bitmask & 2,
|
1513
1669
|
isCurry = bitmask & 4,
|
1514
1670
|
isCurryBound = bitmask & 8,
|
1515
1671
|
isPartial = bitmask & 16,
|
1516
|
-
isPartialRight = bitmask & 32
|
1517
|
-
key = func;
|
1672
|
+
isPartialRight = bitmask & 32;
|
1518
1673
|
|
1519
1674
|
if (!isBindKey && !isFunction(func)) {
|
1520
1675
|
throw new TypeError;
|
@@ -1528,74 +1683,36 @@
|
|
1528
1683
|
isPartialRight = partialRightArgs = false;
|
1529
1684
|
}
|
1530
1685
|
var bindData = func && func.__bindData__;
|
1531
|
-
if (bindData) {
|
1686
|
+
if (bindData && bindData !== true) {
|
1687
|
+
bindData = bindData.slice();
|
1688
|
+
|
1689
|
+
// set `thisBinding` is not previously bound
|
1532
1690
|
if (isBind && !(bindData[1] & 1)) {
|
1533
1691
|
bindData[4] = thisArg;
|
1534
1692
|
}
|
1693
|
+
// set if previously bound but not currently (subsequent curried functions)
|
1535
1694
|
if (!isBind && bindData[1] & 1) {
|
1536
1695
|
bitmask |= 8;
|
1537
1696
|
}
|
1697
|
+
// set curried arity if not yet set
|
1538
1698
|
if (isCurry && !(bindData[1] & 4)) {
|
1539
1699
|
bindData[5] = arity;
|
1540
1700
|
}
|
1701
|
+
// append partial left arguments
|
1541
1702
|
if (isPartial) {
|
1542
1703
|
push.apply(bindData[2] || (bindData[2] = []), partialArgs);
|
1543
1704
|
}
|
1705
|
+
// append partial right arguments
|
1544
1706
|
if (isPartialRight) {
|
1545
1707
|
push.apply(bindData[3] || (bindData[3] = []), partialRightArgs);
|
1546
1708
|
}
|
1709
|
+
// merge flags
|
1547
1710
|
bindData[1] |= bitmask;
|
1548
|
-
return
|
1549
|
-
}
|
1550
|
-
// use `Function#bind` if it exists and is fast
|
1551
|
-
// (in V8 `Function#bind` is slower except when partially applied)
|
1552
|
-
if (isBind && !(isBindKey || isCurry || isPartialRight) &&
|
1553
|
-
(support.fastBind || (nativeBind && isPartial))) {
|
1554
|
-
if (isPartial) {
|
1555
|
-
var args = [thisArg];
|
1556
|
-
push.apply(args, partialArgs);
|
1557
|
-
}
|
1558
|
-
var bound = isPartial
|
1559
|
-
? nativeBind.apply(func, args)
|
1560
|
-
: nativeBind.call(func, thisArg);
|
1561
|
-
}
|
1562
|
-
else {
|
1563
|
-
bound = function() {
|
1564
|
-
// `Function#bind` spec
|
1565
|
-
// http://es5.github.io/#x15.3.4.5
|
1566
|
-
var args = arguments,
|
1567
|
-
thisBinding = isBind ? thisArg : this;
|
1568
|
-
|
1569
|
-
if (isCurry || isPartial || isPartialRight) {
|
1570
|
-
args = nativeSlice.call(args);
|
1571
|
-
if (isPartial) {
|
1572
|
-
unshift.apply(args, partialArgs);
|
1573
|
-
}
|
1574
|
-
if (isPartialRight) {
|
1575
|
-
push.apply(args, partialRightArgs);
|
1576
|
-
}
|
1577
|
-
if (isCurry && args.length < arity) {
|
1578
|
-
bitmask |= 16 & ~32;
|
1579
|
-
return createBound(func, (isCurryBound ? bitmask : bitmask & ~3), args, null, thisArg, arity);
|
1580
|
-
}
|
1581
|
-
}
|
1582
|
-
if (isBindKey) {
|
1583
|
-
func = thisBinding[key];
|
1584
|
-
}
|
1585
|
-
if (this instanceof bound) {
|
1586
|
-
// ensure `new bound` is an instance of `func`
|
1587
|
-
thisBinding = createObject(func.prototype);
|
1588
|
-
|
1589
|
-
// mimic the constructor's `return` behavior
|
1590
|
-
// http://es5.github.io/#x13.2.2
|
1591
|
-
var result = func.apply(thisBinding, args);
|
1592
|
-
return isObject(result) ? result : thisBinding;
|
1593
|
-
}
|
1594
|
-
return func.apply(thisBinding, args);
|
1595
|
-
};
|
1711
|
+
return createWrapper.apply(null, bindData);
|
1596
1712
|
}
|
1597
|
-
|
1598
|
-
|
1713
|
+
// fast path for `_.bind`
|
1714
|
+
var creater = (bitmask == 1 || bitmask === 17) ? baseBind : baseCreateWrapper;
|
1715
|
+
return creater([func, bitmask, partialArgs, partialRightArgs, thisArg, arity]);
|
1599
1716
|
}
|
1600
1717
|
|
1601
1718
|
/**
|
@@ -1646,28 +1763,6 @@
|
|
1646
1763
|
);
|
1647
1764
|
}
|
1648
1765
|
|
1649
|
-
/**
|
1650
|
-
* Creates a new object with the specified `prototype`.
|
1651
|
-
*
|
1652
|
-
* @private
|
1653
|
-
* @param {Object} prototype The prototype object.
|
1654
|
-
* @returns {Object} Returns the new object.
|
1655
|
-
*/
|
1656
|
-
function createObject(prototype) {
|
1657
|
-
return isObject(prototype) ? nativeCreate(prototype) : {};
|
1658
|
-
}
|
1659
|
-
// fallback for browsers without `Object.create`
|
1660
|
-
if (!nativeCreate) {
|
1661
|
-
createObject = function(prototype) {
|
1662
|
-
if (isObject(prototype)) {
|
1663
|
-
noop.prototype = prototype;
|
1664
|
-
var result = new noop;
|
1665
|
-
noop.prototype = null;
|
1666
|
-
}
|
1667
|
-
return result || {};
|
1668
|
-
};
|
1669
|
-
}
|
1670
|
-
|
1671
1766
|
/**
|
1672
1767
|
* Used by `escape` to convert characters to HTML entities.
|
1673
1768
|
*
|
@@ -1697,7 +1792,7 @@
|
|
1697
1792
|
*
|
1698
1793
|
* @private
|
1699
1794
|
* @param {Function} func The function to set data on.
|
1700
|
-
* @param {
|
1795
|
+
* @param {Array} value The data array to set.
|
1701
1796
|
*/
|
1702
1797
|
var setBindData = !defineProperty ? noop : function(func, value) {
|
1703
1798
|
descriptor.value = value;
|
@@ -1781,7 +1876,7 @@
|
|
1781
1876
|
if (!support.argsClass) {
|
1782
1877
|
isArguments = function(value) {
|
1783
1878
|
return value && typeof value == 'object' && typeof value.length == 'number' &&
|
1784
|
-
hasOwnProperty.call(value, 'callee') || false;
|
1879
|
+
hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee') || false;
|
1785
1880
|
};
|
1786
1881
|
}
|
1787
1882
|
|
@@ -1937,16 +2032,16 @@
|
|
1937
2032
|
* @returns {Object} Returns the destination object.
|
1938
2033
|
* @example
|
1939
2034
|
*
|
1940
|
-
* _.assign({ 'name': '
|
1941
|
-
* // => { 'name': '
|
2035
|
+
* _.assign({ 'name': 'fred' }, { 'employer': 'slate' });
|
2036
|
+
* // => { 'name': 'fred', 'employer': 'slate' }
|
1942
2037
|
*
|
1943
2038
|
* var defaults = _.partialRight(_.assign, function(a, b) {
|
1944
2039
|
* return typeof a == 'undefined' ? b : a;
|
1945
2040
|
* });
|
1946
2041
|
*
|
1947
|
-
* var
|
1948
|
-
* defaults(
|
1949
|
-
* // => { 'name': '
|
2042
|
+
* var object = { 'name': 'barney' };
|
2043
|
+
* defaults(object, { 'name': 'fred', 'employer': 'slate' });
|
2044
|
+
* // => { 'name': 'barney', 'employer': 'slate' }
|
1950
2045
|
*/
|
1951
2046
|
var assign = createIterator(defaultsIteratorOptions, {
|
1952
2047
|
'top':
|
@@ -1962,7 +2057,7 @@
|
|
1962
2057
|
});
|
1963
2058
|
|
1964
2059
|
/**
|
1965
|
-
* Creates a clone of `value`. If `
|
2060
|
+
* Creates a clone of `value`. If `isDeep` is `true` nested objects will also
|
1966
2061
|
* be cloned, otherwise they will be assigned by reference. If a callback
|
1967
2062
|
* is provided it will be executed to produce the cloned values. If the
|
1968
2063
|
* callback returns `undefined` cloning will be handled by the method instead.
|
@@ -1972,23 +2067,23 @@
|
|
1972
2067
|
* @memberOf _
|
1973
2068
|
* @category Objects
|
1974
2069
|
* @param {*} value The value to clone.
|
1975
|
-
* @param {boolean} [
|
2070
|
+
* @param {boolean} [isDeep=false] Specify a deep clone.
|
1976
2071
|
* @param {Function} [callback] The function to customize cloning values.
|
1977
2072
|
* @param {*} [thisArg] The `this` binding of `callback`.
|
1978
2073
|
* @returns {*} Returns the cloned value.
|
1979
2074
|
* @example
|
1980
2075
|
*
|
1981
|
-
* var
|
1982
|
-
* { 'name': '
|
1983
|
-
* { 'name': '
|
2076
|
+
* var characters = [
|
2077
|
+
* { 'name': 'barney', 'age': 36 },
|
2078
|
+
* { 'name': 'fred', 'age': 40 }
|
1984
2079
|
* ];
|
1985
2080
|
*
|
1986
|
-
* var shallow = _.clone(
|
1987
|
-
* shallow[0] ===
|
2081
|
+
* var shallow = _.clone(characters);
|
2082
|
+
* shallow[0] === characters[0];
|
1988
2083
|
* // => true
|
1989
2084
|
*
|
1990
|
-
* var deep = _.clone(
|
1991
|
-
* deep[0] ===
|
2085
|
+
* var deep = _.clone(characters, true);
|
2086
|
+
* deep[0] === characters[0];
|
1992
2087
|
* // => false
|
1993
2088
|
*
|
1994
2089
|
* _.mixin({
|
@@ -2001,15 +2096,15 @@
|
|
2001
2096
|
* clone.childNodes.length;
|
2002
2097
|
* // => 0
|
2003
2098
|
*/
|
2004
|
-
function clone(value,
|
2099
|
+
function clone(value, isDeep, callback, thisArg) {
|
2005
2100
|
// allows working with "Collections" methods without using their `index`
|
2006
|
-
// and `collection` arguments for `
|
2007
|
-
if (typeof
|
2101
|
+
// and `collection` arguments for `isDeep` and `callback`
|
2102
|
+
if (typeof isDeep != 'boolean' && isDeep != null) {
|
2008
2103
|
thisArg = callback;
|
2009
|
-
callback =
|
2010
|
-
|
2104
|
+
callback = isDeep;
|
2105
|
+
isDeep = false;
|
2011
2106
|
}
|
2012
|
-
return baseClone(value,
|
2107
|
+
return baseClone(value, isDeep, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
|
2013
2108
|
}
|
2014
2109
|
|
2015
2110
|
/**
|
@@ -2032,13 +2127,13 @@
|
|
2032
2127
|
* @returns {*} Returns the deep cloned value.
|
2033
2128
|
* @example
|
2034
2129
|
*
|
2035
|
-
* var
|
2036
|
-
* { 'name': '
|
2037
|
-
* { 'name': '
|
2130
|
+
* var characters = [
|
2131
|
+
* { 'name': 'barney', 'age': 36 },
|
2132
|
+
* { 'name': 'fred', 'age': 40 }
|
2038
2133
|
* ];
|
2039
2134
|
*
|
2040
|
-
* var deep = _.cloneDeep(
|
2041
|
-
* deep[0] ===
|
2135
|
+
* var deep = _.cloneDeep(characters);
|
2136
|
+
* deep[0] === characters[0];
|
2042
2137
|
* // => false
|
2043
2138
|
*
|
2044
2139
|
* var view = {
|
@@ -2057,6 +2152,42 @@
|
|
2057
2152
|
return baseClone(value, true, typeof callback == 'function' && baseCreateCallback(callback, thisArg, 1));
|
2058
2153
|
}
|
2059
2154
|
|
2155
|
+
/**
|
2156
|
+
* Creates an object that inherits from the given `prototype` object. If a
|
2157
|
+
* `properties` object is provided its own enumerable properties are assigned
|
2158
|
+
* to the created object.
|
2159
|
+
*
|
2160
|
+
* @static
|
2161
|
+
* @memberOf _
|
2162
|
+
* @category Objects
|
2163
|
+
* @param {Object} prototype The object to inherit from.
|
2164
|
+
* @param {Object} [properties] The properties to assign to the object.
|
2165
|
+
* @returns {Object} Returns the new object.
|
2166
|
+
* @example
|
2167
|
+
*
|
2168
|
+
* function Shape() {
|
2169
|
+
* this.x = 0;
|
2170
|
+
* this.y = 0;
|
2171
|
+
* }
|
2172
|
+
*
|
2173
|
+
* function Circle() {
|
2174
|
+
* Shape.call(this);
|
2175
|
+
* }
|
2176
|
+
*
|
2177
|
+
* Circle.prototype = _.create(Shape.prototype, { 'constructor': Circle });
|
2178
|
+
*
|
2179
|
+
* var circle = new Circle;
|
2180
|
+
* circle instanceof Circle;
|
2181
|
+
* // => true
|
2182
|
+
*
|
2183
|
+
* circle instanceof Shape;
|
2184
|
+
* // => true
|
2185
|
+
*/
|
2186
|
+
function create(prototype, properties) {
|
2187
|
+
var result = baseCreate(prototype);
|
2188
|
+
return properties ? assign(result, properties) : result;
|
2189
|
+
}
|
2190
|
+
|
2060
2191
|
/**
|
2061
2192
|
* Assigns own enumerable properties of source object(s) to the destination
|
2062
2193
|
* object for all destination properties that resolve to `undefined`. Once a
|
@@ -2073,9 +2204,9 @@
|
|
2073
2204
|
* @returns {Object} Returns the destination object.
|
2074
2205
|
* @example
|
2075
2206
|
*
|
2076
|
-
* var
|
2077
|
-
* _.defaults(
|
2078
|
-
* // => { 'name': '
|
2207
|
+
* var object = { 'name': 'barney' };
|
2208
|
+
* _.defaults(object, { 'name': 'fred', 'employer': 'slate' });
|
2209
|
+
* // => { 'name': 'barney', 'employer': 'slate' }
|
2079
2210
|
*/
|
2080
2211
|
var defaults = createIterator(defaultsIteratorOptions);
|
2081
2212
|
|
@@ -2083,6 +2214,13 @@
|
|
2083
2214
|
* This method is like `_.findIndex` except that it returns the key of the
|
2084
2215
|
* first element that passes the callback check, instead of the element itself.
|
2085
2216
|
*
|
2217
|
+
* If a property name is provided for `callback` the created "_.pluck" style
|
2218
|
+
* callback will return the property value of the given element.
|
2219
|
+
*
|
2220
|
+
* If an object is provided for `callback` the created "_.where" style callback
|
2221
|
+
* will return `true` for elements that have the properties of the given object,
|
2222
|
+
* else `false`.
|
2223
|
+
*
|
2086
2224
|
* @static
|
2087
2225
|
* @memberOf _
|
2088
2226
|
* @category Objects
|
@@ -2094,10 +2232,24 @@
|
|
2094
2232
|
* @returns {string|undefined} Returns the key of the found element, else `undefined`.
|
2095
2233
|
* @example
|
2096
2234
|
*
|
2097
|
-
*
|
2098
|
-
*
|
2235
|
+
* var characters = {
|
2236
|
+
* 'barney': { 'age': 36, 'blocked': false },
|
2237
|
+
* 'fred': { 'age': 40, 'blocked': true },
|
2238
|
+
* 'pebbles': { 'age': 1, 'blocked': false }
|
2239
|
+
* };
|
2240
|
+
*
|
2241
|
+
* _.findKey(characters, function(chr) {
|
2242
|
+
* return chr.age < 40;
|
2099
2243
|
* });
|
2100
|
-
* // => '
|
2244
|
+
* // => 'barney' (property order is not guaranteed across environments)
|
2245
|
+
*
|
2246
|
+
* // using "_.where" callback shorthand
|
2247
|
+
* _.findKey(characters, { 'age': 1 });
|
2248
|
+
* // => 'pebbles'
|
2249
|
+
*
|
2250
|
+
* // using "_.pluck" callback shorthand
|
2251
|
+
* _.findKey(characters, 'blocked');
|
2252
|
+
* // => 'fred'
|
2101
2253
|
*/
|
2102
2254
|
function findKey(object, callback, thisArg) {
|
2103
2255
|
var result;
|
@@ -2115,6 +2267,13 @@
|
|
2115
2267
|
* This method is like `_.findKey` except that it iterates over elements
|
2116
2268
|
* of a `collection` in the opposite order.
|
2117
2269
|
*
|
2270
|
+
* If a property name is provided for `callback` the created "_.pluck" style
|
2271
|
+
* callback will return the property value of the given element.
|
2272
|
+
*
|
2273
|
+
* If an object is provided for `callback` the created "_.where" style callback
|
2274
|
+
* will return `true` for elements that have the properties of the given object,
|
2275
|
+
* else `false`.
|
2276
|
+
*
|
2118
2277
|
* @static
|
2119
2278
|
* @memberOf _
|
2120
2279
|
* @category Objects
|
@@ -2126,10 +2285,24 @@
|
|
2126
2285
|
* @returns {string|undefined} Returns the key of the found element, else `undefined`.
|
2127
2286
|
* @example
|
2128
2287
|
*
|
2129
|
-
*
|
2130
|
-
*
|
2288
|
+
* var characters = {
|
2289
|
+
* 'barney': { 'age': 36, 'blocked': true },
|
2290
|
+
* 'fred': { 'age': 40, 'blocked': false },
|
2291
|
+
* 'pebbles': { 'age': 1, 'blocked': true }
|
2292
|
+
* };
|
2293
|
+
*
|
2294
|
+
* _.findLastKey(characters, function(chr) {
|
2295
|
+
* return chr.age < 40;
|
2131
2296
|
* });
|
2132
|
-
* // => returns `
|
2297
|
+
* // => returns `pebbles`, assuming `_.findKey` returns `barney`
|
2298
|
+
*
|
2299
|
+
* // using "_.where" callback shorthand
|
2300
|
+
* _.findLastKey(characters, { 'age': 40 });
|
2301
|
+
* // => 'fred'
|
2302
|
+
*
|
2303
|
+
* // using "_.pluck" callback shorthand
|
2304
|
+
* _.findLastKey(characters, 'blocked');
|
2305
|
+
* // => 'pebbles'
|
2133
2306
|
*/
|
2134
2307
|
function findLastKey(object, callback, thisArg) {
|
2135
2308
|
var result;
|
@@ -2159,18 +2332,20 @@
|
|
2159
2332
|
* @returns {Object} Returns `object`.
|
2160
2333
|
* @example
|
2161
2334
|
*
|
2162
|
-
* function
|
2163
|
-
* this.
|
2335
|
+
* function Shape() {
|
2336
|
+
* this.x = 0;
|
2337
|
+
* this.y = 0;
|
2164
2338
|
* }
|
2165
2339
|
*
|
2166
|
-
*
|
2167
|
-
*
|
2340
|
+
* Shape.prototype.move = function(x, y) {
|
2341
|
+
* this.x += x;
|
2342
|
+
* this.y += y;
|
2168
2343
|
* };
|
2169
2344
|
*
|
2170
|
-
* _.forIn(new
|
2345
|
+
* _.forIn(new Shape, function(value, key) {
|
2171
2346
|
* console.log(key);
|
2172
2347
|
* });
|
2173
|
-
* // => logs '
|
2348
|
+
* // => logs 'x', 'y', and 'move' (property order is not guaranteed across environments)
|
2174
2349
|
*/
|
2175
2350
|
var forIn = createIterator(eachIteratorOptions, forOwnIteratorOptions, {
|
2176
2351
|
'useHas': false
|
@@ -2189,18 +2364,20 @@
|
|
2189
2364
|
* @returns {Object} Returns `object`.
|
2190
2365
|
* @example
|
2191
2366
|
*
|
2192
|
-
* function
|
2193
|
-
* this.
|
2367
|
+
* function Shape() {
|
2368
|
+
* this.x = 0;
|
2369
|
+
* this.y = 0;
|
2194
2370
|
* }
|
2195
2371
|
*
|
2196
|
-
*
|
2197
|
-
*
|
2372
|
+
* Shape.prototype.move = function(x, y) {
|
2373
|
+
* this.x += x;
|
2374
|
+
* this.y += y;
|
2198
2375
|
* };
|
2199
2376
|
*
|
2200
|
-
* _.forInRight(new
|
2377
|
+
* _.forInRight(new Shape, function(value, key) {
|
2201
2378
|
* console.log(key);
|
2202
2379
|
* });
|
2203
|
-
* // => logs '
|
2380
|
+
* // => logs 'move', 'y', and 'x' assuming `_.forIn ` logs 'x', 'y', and 'move'
|
2204
2381
|
*/
|
2205
2382
|
function forInRight(object, callback, thisArg) {
|
2206
2383
|
var pairs = [];
|
@@ -2328,8 +2505,8 @@
|
|
2328
2505
|
* @returns {Object} Returns the created inverted object.
|
2329
2506
|
* @example
|
2330
2507
|
*
|
2331
|
-
* _.invert({ 'first': '
|
2332
|
-
* // => { '
|
2508
|
+
* _.invert({ 'first': 'fred', 'second': 'barney' });
|
2509
|
+
* // => { 'fred': 'first', 'barney': 'second' }
|
2333
2510
|
*/
|
2334
2511
|
function invert(object) {
|
2335
2512
|
var index = -1,
|
@@ -2358,7 +2535,8 @@
|
|
2358
2535
|
* // => false
|
2359
2536
|
*/
|
2360
2537
|
function isBoolean(value) {
|
2361
|
-
return value === true || value === false ||
|
2538
|
+
return value === true || value === false ||
|
2539
|
+
value && typeof value == 'object' && toString.call(value) == boolClass || false;
|
2362
2540
|
}
|
2363
2541
|
|
2364
2542
|
/**
|
@@ -2375,7 +2553,7 @@
|
|
2375
2553
|
* // => true
|
2376
2554
|
*/
|
2377
2555
|
function isDate(value) {
|
2378
|
-
return value
|
2556
|
+
return value && typeof value == 'object' && toString.call(value) == dateClass || false;
|
2379
2557
|
}
|
2380
2558
|
|
2381
2559
|
/**
|
@@ -2392,7 +2570,7 @@
|
|
2392
2570
|
* // => true
|
2393
2571
|
*/
|
2394
2572
|
function isElement(value) {
|
2395
|
-
return value
|
2573
|
+
return value && value.nodeType === 1 || false;
|
2396
2574
|
}
|
2397
2575
|
|
2398
2576
|
/**
|
@@ -2452,13 +2630,13 @@
|
|
2452
2630
|
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
|
2453
2631
|
* @example
|
2454
2632
|
*
|
2455
|
-
* var
|
2456
|
-
* var copy = { 'name': '
|
2633
|
+
* var object = { 'name': 'fred' };
|
2634
|
+
* var copy = { 'name': 'fred' };
|
2457
2635
|
*
|
2458
|
-
*
|
2636
|
+
* object == copy;
|
2459
2637
|
* // => false
|
2460
2638
|
*
|
2461
|
-
* _.isEqual(
|
2639
|
+
* _.isEqual(object, copy);
|
2462
2640
|
* // => true
|
2463
2641
|
*
|
2464
2642
|
* var words = ['hello', 'goodbye'];
|
@@ -2627,7 +2805,8 @@
|
|
2627
2805
|
* // => true
|
2628
2806
|
*/
|
2629
2807
|
function isNumber(value) {
|
2630
|
-
return typeof value == 'number' ||
|
2808
|
+
return typeof value == 'number' ||
|
2809
|
+
value && typeof value == 'object' && toString.call(value) == numberClass || false;
|
2631
2810
|
}
|
2632
2811
|
|
2633
2812
|
/**
|
@@ -2640,18 +2819,18 @@
|
|
2640
2819
|
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
|
2641
2820
|
* @example
|
2642
2821
|
*
|
2643
|
-
* function
|
2644
|
-
* this.
|
2645
|
-
* this.
|
2822
|
+
* function Shape() {
|
2823
|
+
* this.x = 0;
|
2824
|
+
* this.y = 0;
|
2646
2825
|
* }
|
2647
2826
|
*
|
2648
|
-
* _.isPlainObject(new
|
2827
|
+
* _.isPlainObject(new Shape);
|
2649
2828
|
* // => false
|
2650
2829
|
*
|
2651
2830
|
* _.isPlainObject([1, 2, 3]);
|
2652
2831
|
* // => false
|
2653
2832
|
*
|
2654
|
-
* _.isPlainObject({ '
|
2833
|
+
* _.isPlainObject({ 'x': 0, 'y': 0 });
|
2655
2834
|
* // => true
|
2656
2835
|
*/
|
2657
2836
|
var isPlainObject = !getPrototypeOf ? shimIsPlainObject : function(value) {
|
@@ -2676,11 +2855,11 @@
|
|
2676
2855
|
* @returns {boolean} Returns `true` if the `value` is a regular expression, else `false`.
|
2677
2856
|
* @example
|
2678
2857
|
*
|
2679
|
-
* _.isRegExp(/
|
2858
|
+
* _.isRegExp(/fred/);
|
2680
2859
|
* // => true
|
2681
2860
|
*/
|
2682
2861
|
function isRegExp(value) {
|
2683
|
-
return
|
2862
|
+
return value && objectTypes[typeof value] && toString.call(value) == regexpClass || false;
|
2684
2863
|
}
|
2685
2864
|
|
2686
2865
|
/**
|
@@ -2693,11 +2872,12 @@
|
|
2693
2872
|
* @returns {boolean} Returns `true` if the `value` is a string, else `false`.
|
2694
2873
|
* @example
|
2695
2874
|
*
|
2696
|
-
* _.isString('
|
2875
|
+
* _.isString('fred');
|
2697
2876
|
* // => true
|
2698
2877
|
*/
|
2699
2878
|
function isString(value) {
|
2700
|
-
return typeof value == 'string' ||
|
2879
|
+
return typeof value == 'string' ||
|
2880
|
+
value && typeof value == 'object' && toString.call(value) == stringClass || false;
|
2701
2881
|
}
|
2702
2882
|
|
2703
2883
|
/**
|
@@ -2737,21 +2917,21 @@
|
|
2737
2917
|
* @example
|
2738
2918
|
*
|
2739
2919
|
* var names = {
|
2740
|
-
* '
|
2741
|
-
* { 'name': '
|
2742
|
-
* { 'name': '
|
2920
|
+
* 'characters': [
|
2921
|
+
* { 'name': 'barney' },
|
2922
|
+
* { 'name': 'fred' }
|
2743
2923
|
* ]
|
2744
2924
|
* };
|
2745
2925
|
*
|
2746
2926
|
* var ages = {
|
2747
|
-
* '
|
2748
|
-
* { 'age':
|
2749
|
-
* { 'age':
|
2927
|
+
* 'characters': [
|
2928
|
+
* { 'age': 36 },
|
2929
|
+
* { 'age': 40 }
|
2750
2930
|
* ]
|
2751
2931
|
* };
|
2752
2932
|
*
|
2753
2933
|
* _.merge(names, ages);
|
2754
|
-
* // => { '
|
2934
|
+
* // => { 'characters': [{ 'name': 'barney', 'age': 36 }, { 'name': 'fred', 'age': 40 }] }
|
2755
2935
|
*
|
2756
2936
|
* var food = {
|
2757
2937
|
* 'fruits': ['apple'],
|
@@ -2775,6 +2955,7 @@
|
|
2775
2955
|
if (!isObject(object)) {
|
2776
2956
|
return object;
|
2777
2957
|
}
|
2958
|
+
|
2778
2959
|
// allows working with `_.reduce` and `_.reduceRight` without using
|
2779
2960
|
// their `index` and `collection` arguments
|
2780
2961
|
if (typeof args[2] != 'number') {
|
@@ -2785,7 +2966,7 @@
|
|
2785
2966
|
} else if (length > 2 && typeof args[length - 1] == 'function') {
|
2786
2967
|
callback = args[--length];
|
2787
2968
|
}
|
2788
|
-
var sources =
|
2969
|
+
var sources = slice(arguments, 1, length),
|
2789
2970
|
index = -1,
|
2790
2971
|
stackA = getArray(),
|
2791
2972
|
stackB = getArray();
|
@@ -2816,32 +2997,38 @@
|
|
2816
2997
|
* @returns {Object} Returns an object without the omitted properties.
|
2817
2998
|
* @example
|
2818
2999
|
*
|
2819
|
-
* _.omit({ 'name': '
|
2820
|
-
* // => { 'name': '
|
3000
|
+
* _.omit({ 'name': 'fred', 'age': 40 }, 'age');
|
3001
|
+
* // => { 'name': 'fred' }
|
2821
3002
|
*
|
2822
|
-
* _.omit({ 'name': '
|
3003
|
+
* _.omit({ 'name': 'fred', 'age': 40 }, function(value) {
|
2823
3004
|
* return typeof value == 'number';
|
2824
3005
|
* });
|
2825
|
-
* // => { 'name': '
|
3006
|
+
* // => { 'name': 'fred' }
|
2826
3007
|
*/
|
2827
3008
|
function omit(object, callback, thisArg) {
|
2828
|
-
var
|
2829
|
-
|
2830
|
-
|
3009
|
+
var result = {};
|
3010
|
+
if (typeof callback != 'function') {
|
3011
|
+
var props = [];
|
3012
|
+
forIn(object, function(value, key) {
|
3013
|
+
props.push(key);
|
3014
|
+
});
|
3015
|
+
props = baseDifference(props, baseFlatten(arguments, true, false, 1));
|
2831
3016
|
|
2832
|
-
|
2833
|
-
|
3017
|
+
var index = -1,
|
3018
|
+
length = props.length;
|
3019
|
+
|
3020
|
+
while (++index < length) {
|
3021
|
+
var key = props[index];
|
3022
|
+
result[key] = object[key];
|
3023
|
+
}
|
2834
3024
|
} else {
|
2835
|
-
|
3025
|
+
callback = lodash.createCallback(callback, thisArg, 3);
|
3026
|
+
forIn(object, function(value, key, object) {
|
3027
|
+
if (!callback(value, key, object)) {
|
3028
|
+
result[key] = value;
|
3029
|
+
}
|
3030
|
+
});
|
2836
3031
|
}
|
2837
|
-
forIn(object, function(value, key, object) {
|
2838
|
-
if (isFunc
|
2839
|
-
? !callback(value, key, object)
|
2840
|
-
: indexOf(props, key) < 0
|
2841
|
-
) {
|
2842
|
-
result[key] = value;
|
2843
|
-
}
|
2844
|
-
});
|
2845
3032
|
return result;
|
2846
3033
|
}
|
2847
3034
|
|
@@ -2856,8 +3043,8 @@
|
|
2856
3043
|
* @returns {Array} Returns new array of key-value pairs.
|
2857
3044
|
* @example
|
2858
3045
|
*
|
2859
|
-
* _.pairs({ '
|
2860
|
-
* // => [['
|
3046
|
+
* _.pairs({ 'barney': 36, 'fred': 40 });
|
3047
|
+
* // => [['barney', 36], ['fred', 40]] (property order is not guaranteed across environments)
|
2861
3048
|
*/
|
2862
3049
|
function pairs(object) {
|
2863
3050
|
var index = -1,
|
@@ -2891,13 +3078,13 @@
|
|
2891
3078
|
* @returns {Object} Returns an object composed of the picked properties.
|
2892
3079
|
* @example
|
2893
3080
|
*
|
2894
|
-
* _.pick({ 'name': '
|
2895
|
-
* // => { 'name': '
|
3081
|
+
* _.pick({ 'name': 'fred', '_userid': 'fred1' }, 'name');
|
3082
|
+
* // => { 'name': 'fred' }
|
2896
3083
|
*
|
2897
|
-
* _.pick({ 'name': '
|
3084
|
+
* _.pick({ 'name': 'fred', '_userid': 'fred1' }, function(value, key) {
|
2898
3085
|
* return key.charAt(0) != '_';
|
2899
3086
|
* });
|
2900
|
-
* // => { 'name': '
|
3087
|
+
* // => { 'name': 'fred' }
|
2901
3088
|
*/
|
2902
3089
|
function pick(object, callback, thisArg) {
|
2903
3090
|
var result = {};
|
@@ -2934,7 +3121,7 @@
|
|
2934
3121
|
* @static
|
2935
3122
|
* @memberOf _
|
2936
3123
|
* @category Objects
|
2937
|
-
* @param {Array|Object}
|
3124
|
+
* @param {Array|Object} object The object to iterate over.
|
2938
3125
|
* @param {Function} [callback=identity] The function called per iteration.
|
2939
3126
|
* @param {*} [accumulator] The custom accumulator value.
|
2940
3127
|
* @param {*} [thisArg] The `this` binding of `callback`.
|
@@ -2956,8 +3143,6 @@
|
|
2956
3143
|
*/
|
2957
3144
|
function transform(object, callback, accumulator, thisArg) {
|
2958
3145
|
var isArr = isArray(object);
|
2959
|
-
callback = baseCreateCallback(callback, thisArg, 4);
|
2960
|
-
|
2961
3146
|
if (accumulator == null) {
|
2962
3147
|
if (isArr) {
|
2963
3148
|
accumulator = [];
|
@@ -2965,12 +3150,15 @@
|
|
2965
3150
|
var ctor = object && object.constructor,
|
2966
3151
|
proto = ctor && ctor.prototype;
|
2967
3152
|
|
2968
|
-
accumulator =
|
3153
|
+
accumulator = baseCreate(proto);
|
2969
3154
|
}
|
2970
3155
|
}
|
2971
|
-
|
2972
|
-
|
2973
|
-
|
3156
|
+
if (callback) {
|
3157
|
+
callback = lodash.createCallback(callback, thisArg, 4);
|
3158
|
+
(isArr ? baseEach : forOwn)(object, function(value, index, object) {
|
3159
|
+
return callback(accumulator, value, index, object);
|
3160
|
+
});
|
3161
|
+
}
|
2974
3162
|
return accumulator;
|
2975
3163
|
}
|
2976
3164
|
|
@@ -3019,8 +3207,8 @@
|
|
3019
3207
|
* _.at(['a', 'b', 'c', 'd', 'e'], [0, 2, 4]);
|
3020
3208
|
* // => ['a', 'c', 'e']
|
3021
3209
|
*
|
3022
|
-
* _.at(['
|
3023
|
-
* // => ['
|
3210
|
+
* _.at(['fred', 'barney', 'pebbles'], 0, 2);
|
3211
|
+
* // => ['fred', 'pebbles']
|
3024
3212
|
*/
|
3025
3213
|
function at(collection) {
|
3026
3214
|
var args = arguments,
|
@@ -3059,10 +3247,10 @@
|
|
3059
3247
|
* _.contains([1, 2, 3], 1, 2);
|
3060
3248
|
* // => false
|
3061
3249
|
*
|
3062
|
-
* _.contains({ 'name': '
|
3250
|
+
* _.contains({ 'name': 'fred', 'age': 40 }, 'fred');
|
3063
3251
|
* // => true
|
3064
3252
|
*
|
3065
|
-
* _.contains('
|
3253
|
+
* _.contains('pebbles', 'eb');
|
3066
3254
|
* // => true
|
3067
3255
|
*/
|
3068
3256
|
function contains(collection, target, fromIndex) {
|
@@ -3149,20 +3337,20 @@
|
|
3149
3337
|
* else `false`.
|
3150
3338
|
* @example
|
3151
3339
|
*
|
3152
|
-
* _.every([true, 1, null, 'yes']
|
3340
|
+
* _.every([true, 1, null, 'yes']);
|
3153
3341
|
* // => false
|
3154
3342
|
*
|
3155
|
-
* var
|
3156
|
-
* { 'name': '
|
3157
|
-
* { 'name': '
|
3343
|
+
* var characters = [
|
3344
|
+
* { 'name': 'barney', 'age': 36 },
|
3345
|
+
* { 'name': 'fred', 'age': 40 }
|
3158
3346
|
* ];
|
3159
3347
|
*
|
3160
3348
|
* // using "_.pluck" callback shorthand
|
3161
|
-
* _.every(
|
3349
|
+
* _.every(characters, 'age');
|
3162
3350
|
* // => true
|
3163
3351
|
*
|
3164
3352
|
* // using "_.where" callback shorthand
|
3165
|
-
* _.every(
|
3353
|
+
* _.every(characters, { 'age': 36 });
|
3166
3354
|
* // => false
|
3167
3355
|
*/
|
3168
3356
|
function every(collection, callback, thisArg) {
|
@@ -3213,18 +3401,18 @@
|
|
3213
3401
|
* var evens = _.filter([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
|
3214
3402
|
* // => [2, 4, 6]
|
3215
3403
|
*
|
3216
|
-
* var
|
3217
|
-
* { 'name': '
|
3218
|
-
* { 'name': '
|
3404
|
+
* var characters = [
|
3405
|
+
* { 'name': 'barney', 'age': 36, 'blocked': false },
|
3406
|
+
* { 'name': 'fred', 'age': 40, 'blocked': true }
|
3219
3407
|
* ];
|
3220
3408
|
*
|
3221
3409
|
* // using "_.pluck" callback shorthand
|
3222
|
-
* _.filter(
|
3223
|
-
* // => [{ 'name': '
|
3410
|
+
* _.filter(characters, 'blocked');
|
3411
|
+
* // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
|
3224
3412
|
*
|
3225
3413
|
* // using "_.where" callback shorthand
|
3226
|
-
* _.filter(
|
3227
|
-
* // => [{ 'name': '
|
3414
|
+
* _.filter(characters, { 'age': 36 });
|
3415
|
+
* // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
|
3228
3416
|
*/
|
3229
3417
|
function filter(collection, callback, thisArg) {
|
3230
3418
|
var result = [];
|
@@ -3274,24 +3462,24 @@
|
|
3274
3462
|
* @returns {*} Returns the found element, else `undefined`.
|
3275
3463
|
* @example
|
3276
3464
|
*
|
3277
|
-
*
|
3278
|
-
*
|
3279
|
-
* }
|
3280
|
-
*
|
3281
|
-
*
|
3282
|
-
* var food = [
|
3283
|
-
* { 'name': 'apple', 'organic': false, 'type': 'fruit' },
|
3284
|
-
* { 'name': 'banana', 'organic': true, 'type': 'fruit' },
|
3285
|
-
* { 'name': 'beet', 'organic': false, 'type': 'vegetable' }
|
3465
|
+
* var characters = [
|
3466
|
+
* { 'name': 'barney', 'age': 36, 'blocked': false },
|
3467
|
+
* { 'name': 'fred', 'age': 40, 'blocked': true },
|
3468
|
+
* { 'name': 'pebbles', 'age': 1, 'blocked': false }
|
3286
3469
|
* ];
|
3287
3470
|
*
|
3471
|
+
* _.find(characters, function(chr) {
|
3472
|
+
* return chr.age < 40;
|
3473
|
+
* });
|
3474
|
+
* // => { 'name': 'barney', 'age': 36, 'blocked': false }
|
3475
|
+
*
|
3288
3476
|
* // using "_.where" callback shorthand
|
3289
|
-
* _.find(
|
3290
|
-
* // =>
|
3477
|
+
* _.find(characters, { 'age': 1 });
|
3478
|
+
* // => { 'name': 'pebbles', 'age': 1, 'blocked': false }
|
3291
3479
|
*
|
3292
3480
|
* // using "_.pluck" callback shorthand
|
3293
|
-
* _.find(
|
3294
|
-
* // => { 'name': '
|
3481
|
+
* _.find(characters, 'blocked');
|
3482
|
+
* // => { 'name': 'fred', 'age': 40, 'blocked': true }
|
3295
3483
|
*/
|
3296
3484
|
function find(collection, callback, thisArg) {
|
3297
3485
|
callback = lodash.createCallback(callback, thisArg, 3);
|
@@ -3356,6 +3544,10 @@
|
|
3356
3544
|
* (value, index|key, collection). Callbacks may exit iteration early by
|
3357
3545
|
* explicitly returning `false`.
|
3358
3546
|
*
|
3547
|
+
* Note: As with other "Collections" methods, objects with a `length` property
|
3548
|
+
* are iterated like arrays. To avoid this behavior `_.forIn` or `_.forOwn`
|
3549
|
+
* may be used for object iteration.
|
3550
|
+
*
|
3359
3551
|
* @static
|
3360
3552
|
* @memberOf _
|
3361
3553
|
* @alias each
|
@@ -3506,7 +3698,7 @@
|
|
3506
3698
|
* _.indexBy(keys, function(key) { return String.fromCharCode(key.code); });
|
3507
3699
|
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
|
3508
3700
|
*
|
3509
|
-
* _.indexBy(
|
3701
|
+
* _.indexBy(characters, function(key) { this.fromCharCode(key.code); }, String);
|
3510
3702
|
* // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
|
3511
3703
|
*/
|
3512
3704
|
var indexBy = createAggregator(function(result, value, key) {
|
@@ -3536,7 +3728,7 @@
|
|
3536
3728
|
* // => [['1', '2', '3'], ['4', '5', '6']]
|
3537
3729
|
*/
|
3538
3730
|
function invoke(collection, methodName) {
|
3539
|
-
var args =
|
3731
|
+
var args = slice(arguments, 2),
|
3540
3732
|
index = -1,
|
3541
3733
|
isFunc = typeof methodName == 'function',
|
3542
3734
|
length = collection ? collection.length : 0,
|
@@ -3578,14 +3770,14 @@
|
|
3578
3770
|
* _.map({ 'one': 1, 'two': 2, 'three': 3 }, function(num) { return num * 3; });
|
3579
3771
|
* // => [3, 6, 9] (property order is not guaranteed across environments)
|
3580
3772
|
*
|
3581
|
-
* var
|
3582
|
-
* { 'name': '
|
3583
|
-
* { 'name': '
|
3773
|
+
* var characters = [
|
3774
|
+
* { 'name': 'barney', 'age': 36 },
|
3775
|
+
* { 'name': 'fred', 'age': 40 }
|
3584
3776
|
* ];
|
3585
3777
|
*
|
3586
3778
|
* // using "_.pluck" callback shorthand
|
3587
|
-
* _.map(
|
3588
|
-
* // => ['
|
3779
|
+
* _.map(characters, 'name');
|
3780
|
+
* // => ['barney', 'fred']
|
3589
3781
|
*/
|
3590
3782
|
function map(collection, callback, thisArg) {
|
3591
3783
|
var index = -1,
|
@@ -3633,23 +3825,28 @@
|
|
3633
3825
|
* _.max([4, 2, 8, 6]);
|
3634
3826
|
* // => 8
|
3635
3827
|
*
|
3636
|
-
* var
|
3637
|
-
* { 'name': '
|
3638
|
-
* { 'name': '
|
3828
|
+
* var characters = [
|
3829
|
+
* { 'name': 'barney', 'age': 36 },
|
3830
|
+
* { 'name': 'fred', 'age': 40 }
|
3639
3831
|
* ];
|
3640
3832
|
*
|
3641
|
-
* _.max(
|
3642
|
-
* // => { 'name': '
|
3833
|
+
* _.max(characters, function(chr) { return chr.age; });
|
3834
|
+
* // => { 'name': 'fred', 'age': 40 };
|
3643
3835
|
*
|
3644
3836
|
* // using "_.pluck" callback shorthand
|
3645
|
-
* _.max(
|
3646
|
-
* // => { 'name': '
|
3837
|
+
* _.max(characters, 'age');
|
3838
|
+
* // => { 'name': 'fred', 'age': 40 };
|
3647
3839
|
*/
|
3648
3840
|
function max(collection, callback, thisArg) {
|
3649
3841
|
var computed = -Infinity,
|
3650
3842
|
result = computed;
|
3651
3843
|
|
3652
|
-
|
3844
|
+
// allows working with functions like `_.map` without using
|
3845
|
+
// their `index` argument as a callback
|
3846
|
+
if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
|
3847
|
+
callback = null;
|
3848
|
+
}
|
3849
|
+
if (callback == null && isArray(collection)) {
|
3653
3850
|
var index = -1,
|
3654
3851
|
length = collection.length;
|
3655
3852
|
|
@@ -3660,7 +3857,7 @@
|
|
3660
3857
|
}
|
3661
3858
|
}
|
3662
3859
|
} else {
|
3663
|
-
callback = (
|
3860
|
+
callback = (callback == null && isString(collection))
|
3664
3861
|
? charAtCallback
|
3665
3862
|
: lodash.createCallback(callback, thisArg, 3);
|
3666
3863
|
|
@@ -3703,23 +3900,28 @@
|
|
3703
3900
|
* _.min([4, 2, 8, 6]);
|
3704
3901
|
* // => 2
|
3705
3902
|
*
|
3706
|
-
* var
|
3707
|
-
* { 'name': '
|
3708
|
-
* { 'name': '
|
3903
|
+
* var characters = [
|
3904
|
+
* { 'name': 'barney', 'age': 36 },
|
3905
|
+
* { 'name': 'fred', 'age': 40 }
|
3709
3906
|
* ];
|
3710
3907
|
*
|
3711
|
-
* _.min(
|
3712
|
-
* // => { 'name': '
|
3908
|
+
* _.min(characters, function(chr) { return chr.age; });
|
3909
|
+
* // => { 'name': 'barney', 'age': 36 };
|
3713
3910
|
*
|
3714
3911
|
* // using "_.pluck" callback shorthand
|
3715
|
-
* _.min(
|
3716
|
-
* // => { 'name': '
|
3912
|
+
* _.min(characters, 'age');
|
3913
|
+
* // => { 'name': 'barney', 'age': 36 };
|
3717
3914
|
*/
|
3718
3915
|
function min(collection, callback, thisArg) {
|
3719
3916
|
var computed = Infinity,
|
3720
3917
|
result = computed;
|
3721
3918
|
|
3722
|
-
|
3919
|
+
// allows working with functions like `_.map` without using
|
3920
|
+
// their `index` argument as a callback
|
3921
|
+
if (typeof callback != 'function' && thisArg && thisArg[callback] === collection) {
|
3922
|
+
callback = null;
|
3923
|
+
}
|
3924
|
+
if (callback == null && isArray(collection)) {
|
3723
3925
|
var index = -1,
|
3724
3926
|
length = collection.length;
|
3725
3927
|
|
@@ -3730,7 +3932,7 @@
|
|
3730
3932
|
}
|
3731
3933
|
}
|
3732
3934
|
} else {
|
3733
|
-
callback = (
|
3935
|
+
callback = (callback == null && isString(collection))
|
3734
3936
|
? charAtCallback
|
3735
3937
|
: lodash.createCallback(callback, thisArg, 3);
|
3736
3938
|
|
@@ -3746,7 +3948,7 @@
|
|
3746
3948
|
}
|
3747
3949
|
|
3748
3950
|
/**
|
3749
|
-
* Retrieves the value of a specified property from all elements in the
|
3951
|
+
* Retrieves the value of a specified property from all elements in the collection.
|
3750
3952
|
*
|
3751
3953
|
* @static
|
3752
3954
|
* @memberOf _
|
@@ -3757,13 +3959,13 @@
|
|
3757
3959
|
* @returns {Array} Returns a new array of property values.
|
3758
3960
|
* @example
|
3759
3961
|
*
|
3760
|
-
* var
|
3761
|
-
* { 'name': '
|
3762
|
-
* { 'name': '
|
3962
|
+
* var characters = [
|
3963
|
+
* { 'name': 'barney', 'age': 36 },
|
3964
|
+
* { 'name': 'fred', 'age': 40 }
|
3763
3965
|
* ];
|
3764
3966
|
*
|
3765
|
-
* _.pluck(
|
3766
|
-
* // => ['
|
3967
|
+
* _.pluck(characters, 'name');
|
3968
|
+
* // => ['barney', 'fred']
|
3767
3969
|
*/
|
3768
3970
|
var pluck = map;
|
3769
3971
|
|
@@ -3799,7 +4001,7 @@
|
|
3799
4001
|
*/
|
3800
4002
|
function reduce(collection, callback, accumulator, thisArg) {
|
3801
4003
|
var noaccum = arguments.length < 3;
|
3802
|
-
callback =
|
4004
|
+
callback = lodash.createCallback(callback, thisArg, 4);
|
3803
4005
|
|
3804
4006
|
if (isArray(collection)) {
|
3805
4007
|
var index = -1,
|
@@ -3842,7 +4044,7 @@
|
|
3842
4044
|
*/
|
3843
4045
|
function reduceRight(collection, callback, accumulator, thisArg) {
|
3844
4046
|
var noaccum = arguments.length < 3;
|
3845
|
-
callback =
|
4047
|
+
callback = lodash.createCallback(callback, thisArg, 4);
|
3846
4048
|
forEachRight(collection, function(value, index, collection) {
|
3847
4049
|
accumulator = noaccum
|
3848
4050
|
? (noaccum = false, value)
|
@@ -3876,18 +4078,18 @@
|
|
3876
4078
|
* var odds = _.reject([1, 2, 3, 4, 5, 6], function(num) { return num % 2 == 0; });
|
3877
4079
|
* // => [1, 3, 5]
|
3878
4080
|
*
|
3879
|
-
* var
|
3880
|
-
* { 'name': '
|
3881
|
-
* { 'name': '
|
4081
|
+
* var characters = [
|
4082
|
+
* { 'name': 'barney', 'age': 36, 'blocked': false },
|
4083
|
+
* { 'name': 'fred', 'age': 40, 'blocked': true }
|
3882
4084
|
* ];
|
3883
4085
|
*
|
3884
4086
|
* // using "_.pluck" callback shorthand
|
3885
|
-
* _.reject(
|
3886
|
-
* // => [{ 'name': '
|
4087
|
+
* _.reject(characters, 'blocked');
|
4088
|
+
* // => [{ 'name': 'barney', 'age': 36, 'blocked': false }]
|
3887
4089
|
*
|
3888
4090
|
* // using "_.where" callback shorthand
|
3889
|
-
* _.reject(
|
3890
|
-
* // => [{ 'name': '
|
4091
|
+
* _.reject(characters, { 'age': 36 });
|
4092
|
+
* // => [{ 'name': 'fred', 'age': 40, 'blocked': true }]
|
3891
4093
|
*/
|
3892
4094
|
function reject(collection, callback, thisArg) {
|
3893
4095
|
callback = lodash.createCallback(callback, thisArg, 3);
|
@@ -3904,8 +4106,8 @@
|
|
3904
4106
|
* @category Collections
|
3905
4107
|
* @param {Array|Object|string} collection The collection to sample.
|
3906
4108
|
* @param {number} [n] The number of elements to sample.
|
3907
|
-
* @param- {Object} [guard] Allows working with functions
|
3908
|
-
* without using their `
|
4109
|
+
* @param- {Object} [guard] Allows working with functions like `_.map`
|
4110
|
+
* without using their `index` arguments as `n`.
|
3909
4111
|
* @returns {Array} Returns the random sample(s) of `collection`.
|
3910
4112
|
* @example
|
3911
4113
|
*
|
@@ -3916,14 +4118,13 @@
|
|
3916
4118
|
* // => [3, 1]
|
3917
4119
|
*/
|
3918
4120
|
function sample(collection, n, guard) {
|
3919
|
-
|
3920
|
-
if (typeof length != 'number') {
|
4121
|
+
if (collection && typeof collection.length != 'number') {
|
3921
4122
|
collection = values(collection);
|
3922
4123
|
} else if (support.unindexedChars && isString(collection)) {
|
3923
4124
|
collection = collection.split('');
|
3924
4125
|
}
|
3925
4126
|
if (n == null || guard) {
|
3926
|
-
return collection ? collection[
|
4127
|
+
return collection ? collection[baseRandom(0, collection.length - 1)] : undefined;
|
3927
4128
|
}
|
3928
4129
|
var result = shuffle(collection);
|
3929
4130
|
result.length = nativeMin(nativeMax(0, n), result.length);
|
@@ -3950,7 +4151,7 @@
|
|
3950
4151
|
result = Array(typeof length == 'number' ? length : 0);
|
3951
4152
|
|
3952
4153
|
forEach(collection, function(value) {
|
3953
|
-
var rand =
|
4154
|
+
var rand = baseRandom(0, ++index);
|
3954
4155
|
result[index] = result[rand];
|
3955
4156
|
result[rand] = value;
|
3956
4157
|
});
|
@@ -3974,7 +4175,7 @@
|
|
3974
4175
|
* _.size({ 'one': 1, 'two': 2, 'three': 3 });
|
3975
4176
|
* // => 3
|
3976
4177
|
*
|
3977
|
-
* _.size('
|
4178
|
+
* _.size('pebbles');
|
3978
4179
|
* // => 5
|
3979
4180
|
*/
|
3980
4181
|
function size(collection) {
|
@@ -4011,17 +4212,17 @@
|
|
4011
4212
|
* _.some([null, 0, 'yes', false], Boolean);
|
4012
4213
|
* // => true
|
4013
4214
|
*
|
4014
|
-
* var
|
4015
|
-
* { 'name': '
|
4016
|
-
* { 'name': '
|
4215
|
+
* var characters = [
|
4216
|
+
* { 'name': 'barney', 'age': 36, 'blocked': false },
|
4217
|
+
* { 'name': 'fred', 'age': 40, 'blocked': true }
|
4017
4218
|
* ];
|
4018
4219
|
*
|
4019
4220
|
* // using "_.pluck" callback shorthand
|
4020
|
-
* _.some(
|
4221
|
+
* _.some(characters, 'blocked');
|
4021
4222
|
* // => true
|
4022
4223
|
*
|
4023
4224
|
* // using "_.where" callback shorthand
|
4024
|
-
* _.some(
|
4225
|
+
* _.some(characters, { 'age': 1 });
|
4025
4226
|
* // => false
|
4026
4227
|
*/
|
4027
4228
|
function some(collection, callback, thisArg) {
|
@@ -4139,16 +4340,16 @@
|
|
4139
4340
|
* @returns {Array} Returns a new array of elements that have the given properties.
|
4140
4341
|
* @example
|
4141
4342
|
*
|
4142
|
-
* var
|
4143
|
-
* { 'name': '
|
4144
|
-
* { 'name': '
|
4343
|
+
* var characters = [
|
4344
|
+
* { 'name': 'barney', 'age': 36, 'pets': ['hoppy'] },
|
4345
|
+
* { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
|
4145
4346
|
* ];
|
4146
4347
|
*
|
4147
|
-
* _.where(
|
4148
|
-
* // => [{ 'name': '
|
4348
|
+
* _.where(characters, { 'age': 36 });
|
4349
|
+
* // => [{ 'name': 'barney', 'age': 36, 'pets': ['hoppy'] }]
|
4149
4350
|
*
|
4150
|
-
* _.where(
|
4151
|
-
* // => [{ 'name': '
|
4351
|
+
* _.where(characters, { 'pets': ['dino'] });
|
4352
|
+
* // => [{ 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }]
|
4152
4353
|
*/
|
4153
4354
|
var where = filter;
|
4154
4355
|
|
@@ -4190,7 +4391,7 @@
|
|
4190
4391
|
* @memberOf _
|
4191
4392
|
* @category Arrays
|
4192
4393
|
* @param {Array} array The array to process.
|
4193
|
-
* @param {...Array} [
|
4394
|
+
* @param {...Array} [values] The arrays of values to exclude.
|
4194
4395
|
* @returns {Array} Returns a new array of filtered values.
|
4195
4396
|
* @example
|
4196
4397
|
*
|
@@ -4198,39 +4399,20 @@
|
|
4198
4399
|
* // => [1, 3, 4]
|
4199
4400
|
*/
|
4200
4401
|
function difference(array) {
|
4201
|
-
|
4202
|
-
indexOf = getIndexOf(),
|
4203
|
-
length = array ? array.length : 0,
|
4204
|
-
seen = baseFlatten(arguments, true, true, 1),
|
4205
|
-
result = [];
|
4206
|
-
|
4207
|
-
var isLarge = length >= largeArraySize && indexOf === baseIndexOf;
|
4208
|
-
|
4209
|
-
if (isLarge) {
|
4210
|
-
var cache = createCache(seen);
|
4211
|
-
if (cache) {
|
4212
|
-
indexOf = cacheIndexOf;
|
4213
|
-
seen = cache;
|
4214
|
-
} else {
|
4215
|
-
isLarge = false;
|
4216
|
-
}
|
4217
|
-
}
|
4218
|
-
while (++index < length) {
|
4219
|
-
var value = array[index];
|
4220
|
-
if (indexOf(seen, value) < 0) {
|
4221
|
-
result.push(value);
|
4222
|
-
}
|
4223
|
-
}
|
4224
|
-
if (isLarge) {
|
4225
|
-
releaseObject(seen);
|
4226
|
-
}
|
4227
|
-
return result;
|
4402
|
+
return baseDifference(array, baseFlatten(arguments, true, true, 1));
|
4228
4403
|
}
|
4229
4404
|
|
4230
4405
|
/**
|
4231
4406
|
* This method is like `_.find` except that it returns the index of the first
|
4232
4407
|
* element that passes the callback check, instead of the element itself.
|
4233
4408
|
*
|
4409
|
+
* If a property name is provided for `callback` the created "_.pluck" style
|
4410
|
+
* callback will return the property value of the given element.
|
4411
|
+
*
|
4412
|
+
* If an object is provided for `callback` the created "_.where" style callback
|
4413
|
+
* will return `true` for elements that have the properties of the given object,
|
4414
|
+
* else `false`.
|
4415
|
+
*
|
4234
4416
|
* @static
|
4235
4417
|
* @memberOf _
|
4236
4418
|
* @category Arrays
|
@@ -4242,9 +4424,23 @@
|
|
4242
4424
|
* @returns {number} Returns the index of the found element, else `-1`.
|
4243
4425
|
* @example
|
4244
4426
|
*
|
4245
|
-
*
|
4246
|
-
*
|
4427
|
+
* var characters = [
|
4428
|
+
* { 'name': 'barney', 'age': 36, 'blocked': false },
|
4429
|
+
* { 'name': 'fred', 'age': 40, 'blocked': true },
|
4430
|
+
* { 'name': 'pebbles', 'age': 1, 'blocked': false }
|
4431
|
+
* ];
|
4432
|
+
*
|
4433
|
+
* _.findIndex(characters, function(chr) {
|
4434
|
+
* return chr.age < 20;
|
4247
4435
|
* });
|
4436
|
+
* // => 2
|
4437
|
+
*
|
4438
|
+
* // using "_.where" callback shorthand
|
4439
|
+
* _.findIndex(characters, { 'age': 36 });
|
4440
|
+
* // => 0
|
4441
|
+
*
|
4442
|
+
* // using "_.pluck" callback shorthand
|
4443
|
+
* _.findIndex(characters, 'blocked');
|
4248
4444
|
* // => 1
|
4249
4445
|
*/
|
4250
4446
|
function findIndex(array, callback, thisArg) {
|
@@ -4264,6 +4460,13 @@
|
|
4264
4460
|
* This method is like `_.findIndex` except that it iterates over elements
|
4265
4461
|
* of a `collection` from right to left.
|
4266
4462
|
*
|
4463
|
+
* If a property name is provided for `callback` the created "_.pluck" style
|
4464
|
+
* callback will return the property value of the given element.
|
4465
|
+
*
|
4466
|
+
* If an object is provided for `callback` the created "_.where" style callback
|
4467
|
+
* will return `true` for elements that have the properties of the given object,
|
4468
|
+
* else `false`.
|
4469
|
+
*
|
4267
4470
|
* @static
|
4268
4471
|
* @memberOf _
|
4269
4472
|
* @category Arrays
|
@@ -4275,9 +4478,23 @@
|
|
4275
4478
|
* @returns {number} Returns the index of the found element, else `-1`.
|
4276
4479
|
* @example
|
4277
4480
|
*
|
4278
|
-
*
|
4279
|
-
*
|
4481
|
+
* var characters = [
|
4482
|
+
* { 'name': 'barney', 'age': 36, 'blocked': true },
|
4483
|
+
* { 'name': 'fred', 'age': 40, 'blocked': false },
|
4484
|
+
* { 'name': 'pebbles', 'age': 1, 'blocked': true }
|
4485
|
+
* ];
|
4486
|
+
*
|
4487
|
+
* _.findLastIndex(characters, function(chr) {
|
4488
|
+
* return chr.age > 30;
|
4280
4489
|
* });
|
4490
|
+
* // => 1
|
4491
|
+
*
|
4492
|
+
* // using "_.where" callback shorthand
|
4493
|
+
* _.findLastIndex(characters, { 'age': 36 });
|
4494
|
+
* // => 0
|
4495
|
+
*
|
4496
|
+
* // using "_.pluck" callback shorthand
|
4497
|
+
* _.findLastIndex(characters, 'blocked');
|
4281
4498
|
* // => 2
|
4282
4499
|
*/
|
4283
4500
|
function findLastIndex(array, callback, thisArg) {
|
@@ -4328,24 +4545,19 @@
|
|
4328
4545
|
* });
|
4329
4546
|
* // => [1, 2]
|
4330
4547
|
*
|
4331
|
-
* var
|
4332
|
-
* { 'name': '
|
4333
|
-
* { 'name': '
|
4548
|
+
* var characters = [
|
4549
|
+
* { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
|
4550
|
+
* { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
|
4551
|
+
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
|
4334
4552
|
* ];
|
4335
4553
|
*
|
4336
4554
|
* // using "_.pluck" callback shorthand
|
4337
|
-
* _.first(
|
4338
|
-
* // => [{ 'name': '
|
4339
|
-
*
|
4340
|
-
* var food = [
|
4341
|
-
* { 'name': 'apple', 'type': 'fruit' },
|
4342
|
-
* { 'name': 'banana', 'type': 'fruit' },
|
4343
|
-
* { 'name': 'beet', 'type': 'vegetable' }
|
4344
|
-
* ];
|
4555
|
+
* _.first(characters, 'blocked');
|
4556
|
+
* // => [{ 'name': 'barney', 'blocked': true, 'employer': 'slate' }]
|
4345
4557
|
*
|
4346
4558
|
* // using "_.where" callback shorthand
|
4347
|
-
* _.first(
|
4348
|
-
* // => [
|
4559
|
+
* _.pluck(_.first(characters, { 'employer': 'slate' }), 'name');
|
4560
|
+
* // => ['barney', 'fred']
|
4349
4561
|
*/
|
4350
4562
|
function first(array, callback, thisArg) {
|
4351
4563
|
var n = 0,
|
@@ -4398,20 +4610,20 @@
|
|
4398
4610
|
* _.flatten([1, [2], [3, [[4]]]], true);
|
4399
4611
|
* // => [1, 2, 3, [[4]]];
|
4400
4612
|
*
|
4401
|
-
* var
|
4402
|
-
* { 'name': '
|
4403
|
-
* { 'name': '
|
4613
|
+
* var characters = [
|
4614
|
+
* { 'name': 'barney', 'age': 30, 'pets': ['hoppy'] },
|
4615
|
+
* { 'name': 'fred', 'age': 40, 'pets': ['baby puss', 'dino'] }
|
4404
4616
|
* ];
|
4405
4617
|
*
|
4406
4618
|
* // using "_.pluck" callback shorthand
|
4407
|
-
* _.flatten(
|
4408
|
-
* // => ['
|
4619
|
+
* _.flatten(characters, 'pets');
|
4620
|
+
* // => ['hoppy', 'baby puss', 'dino']
|
4409
4621
|
*/
|
4410
4622
|
function flatten(array, isShallow, callback, thisArg) {
|
4411
4623
|
// juggle arguments
|
4412
4624
|
if (typeof isShallow != 'boolean' && isShallow != null) {
|
4413
4625
|
thisArg = callback;
|
4414
|
-
callback =
|
4626
|
+
callback = (typeof isShallow != 'function' && thisArg && thisArg[isShallow] === array) ? null : isShallow;
|
4415
4627
|
isShallow = false;
|
4416
4628
|
}
|
4417
4629
|
if (callback != null) {
|
@@ -4491,24 +4703,19 @@
|
|
4491
4703
|
* });
|
4492
4704
|
* // => [1]
|
4493
4705
|
*
|
4494
|
-
* var
|
4495
|
-
* { 'name': '
|
4496
|
-
* { 'name': '
|
4706
|
+
* var characters = [
|
4707
|
+
* { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
|
4708
|
+
* { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
|
4709
|
+
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
|
4497
4710
|
* ];
|
4498
4711
|
*
|
4499
4712
|
* // using "_.pluck" callback shorthand
|
4500
|
-
* _.initial(
|
4501
|
-
* // => [{ 'name': '
|
4502
|
-
*
|
4503
|
-
* var food = [
|
4504
|
-
* { 'name': 'banana', 'type': 'fruit' },
|
4505
|
-
* { 'name': 'beet', 'type': 'vegetable' },
|
4506
|
-
* { 'name': 'carrot', 'type': 'vegetable' }
|
4507
|
-
* ];
|
4713
|
+
* _.initial(characters, 'blocked');
|
4714
|
+
* // => [{ 'name': 'barney', 'blocked': false, 'employer': 'slate' }]
|
4508
4715
|
*
|
4509
4716
|
* // using "_.where" callback shorthand
|
4510
|
-
* _.initial(
|
4511
|
-
* // => [
|
4717
|
+
* _.pluck(_.initial(characters, { 'employer': 'na' }), 'name');
|
4718
|
+
* // => ['barney', 'fred']
|
4512
4719
|
*/
|
4513
4720
|
function initial(array, callback, thisArg) {
|
4514
4721
|
var n = 0,
|
@@ -4621,24 +4828,19 @@
|
|
4621
4828
|
* });
|
4622
4829
|
* // => [2, 3]
|
4623
4830
|
*
|
4624
|
-
* var
|
4625
|
-
* { 'name': '
|
4626
|
-
* { 'name': '
|
4831
|
+
* var characters = [
|
4832
|
+
* { 'name': 'barney', 'blocked': false, 'employer': 'slate' },
|
4833
|
+
* { 'name': 'fred', 'blocked': true, 'employer': 'slate' },
|
4834
|
+
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
|
4627
4835
|
* ];
|
4628
4836
|
*
|
4629
4837
|
* // using "_.pluck" callback shorthand
|
4630
|
-
* _.last(
|
4631
|
-
* // => [
|
4632
|
-
*
|
4633
|
-
* var food = [
|
4634
|
-
* { 'name': 'banana', 'type': 'fruit' },
|
4635
|
-
* { 'name': 'beet', 'type': 'vegetable' },
|
4636
|
-
* { 'name': 'carrot', 'type': 'vegetable' }
|
4637
|
-
* ];
|
4838
|
+
* _.pluck(_.last(characters, 'blocked'), 'name');
|
4839
|
+
* // => ['fred', 'pebbles']
|
4638
4840
|
*
|
4639
4841
|
* // using "_.where" callback shorthand
|
4640
|
-
* _.last(
|
4641
|
-
* // => [{ 'name': '
|
4842
|
+
* _.last(characters, { 'employer': 'na' });
|
4843
|
+
* // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
|
4642
4844
|
*/
|
4643
4845
|
function last(array, callback, thisArg) {
|
4644
4846
|
var n = 0,
|
@@ -4664,6 +4866,13 @@
|
|
4664
4866
|
* equality for comparisons, i.e. `===`. If `fromIndex` is negative, it is used
|
4665
4867
|
* as the offset from the end of the collection.
|
4666
4868
|
*
|
4869
|
+
* If a property name is provided for `callback` the created "_.pluck" style
|
4870
|
+
* callback will return the property value of the given element.
|
4871
|
+
*
|
4872
|
+
* If an object is provided for `callback` the created "_.where" style callback
|
4873
|
+
* will return `true` for elements that have the properties of the given object,
|
4874
|
+
* else `false`.
|
4875
|
+
*
|
4667
4876
|
* @static
|
4668
4877
|
* @memberOf _
|
4669
4878
|
* @category Arrays
|
@@ -4742,17 +4951,17 @@
|
|
4742
4951
|
* @returns {Array} Returns a new range array.
|
4743
4952
|
* @example
|
4744
4953
|
*
|
4745
|
-
* _.range(
|
4746
|
-
* // => [0, 1, 2, 3
|
4954
|
+
* _.range(4);
|
4955
|
+
* // => [0, 1, 2, 3]
|
4747
4956
|
*
|
4748
|
-
* _.range(1,
|
4749
|
-
* // => [1, 2, 3, 4
|
4957
|
+
* _.range(1, 5);
|
4958
|
+
* // => [1, 2, 3, 4]
|
4750
4959
|
*
|
4751
|
-
* _.range(0,
|
4752
|
-
* // => [0, 5, 10, 15
|
4960
|
+
* _.range(0, 20, 5);
|
4961
|
+
* // => [0, 5, 10, 15]
|
4753
4962
|
*
|
4754
|
-
* _.range(0, -
|
4755
|
-
* // => [0, -1, -2, -3
|
4963
|
+
* _.range(0, -4, -1);
|
4964
|
+
* // => [0, -1, -2, -3]
|
4756
4965
|
*
|
4757
4966
|
* _.range(1, 4, 0);
|
4758
4967
|
* // => [1, 1, 1]
|
@@ -4768,7 +4977,7 @@
|
|
4768
4977
|
end = start;
|
4769
4978
|
start = 0;
|
4770
4979
|
}
|
4771
|
-
// use `Array(length)` so engines
|
4980
|
+
// use `Array(length)` so engines like Chakra and V8 avoid slower modes
|
4772
4981
|
// http://youtu.be/XAqIpGU8ZZk#t=17m25s
|
4773
4982
|
var index = -1,
|
4774
4983
|
length = nativeMax(0, ceil((end - start) / (step || 1))),
|
@@ -4868,24 +5077,19 @@
|
|
4868
5077
|
* });
|
4869
5078
|
* // => [3]
|
4870
5079
|
*
|
4871
|
-
* var
|
4872
|
-
* { 'name': '
|
4873
|
-
* { 'name': '
|
5080
|
+
* var characters = [
|
5081
|
+
* { 'name': 'barney', 'blocked': true, 'employer': 'slate' },
|
5082
|
+
* { 'name': 'fred', 'blocked': false, 'employer': 'slate' },
|
5083
|
+
* { 'name': 'pebbles', 'blocked': true, 'employer': 'na' }
|
4874
5084
|
* ];
|
4875
5085
|
*
|
4876
5086
|
* // using "_.pluck" callback shorthand
|
4877
|
-
* _.rest(
|
4878
|
-
* // => [
|
4879
|
-
*
|
4880
|
-
* var food = [
|
4881
|
-
* { 'name': 'apple', 'type': 'fruit' },
|
4882
|
-
* { 'name': 'banana', 'type': 'fruit' },
|
4883
|
-
* { 'name': 'beet', 'type': 'vegetable' }
|
4884
|
-
* ];
|
5087
|
+
* _.pluck(_.rest(characters, 'blocked'), 'name');
|
5088
|
+
* // => ['fred', 'pebbles']
|
4885
5089
|
*
|
4886
5090
|
* // using "_.where" callback shorthand
|
4887
|
-
* _.rest(
|
4888
|
-
* // => [{ 'name': '
|
5091
|
+
* _.rest(characters, { 'employer': 'slate' });
|
5092
|
+
* // => [{ 'name': 'pebbles', 'blocked': true, 'employer': 'na' }]
|
4889
5093
|
*/
|
4890
5094
|
function rest(array, callback, thisArg) {
|
4891
5095
|
if (typeof callback != 'number' && callback != null) {
|
@@ -5034,7 +5238,7 @@
|
|
5034
5238
|
// juggle arguments
|
5035
5239
|
if (typeof isSorted != 'boolean' && isSorted != null) {
|
5036
5240
|
thisArg = callback;
|
5037
|
-
callback =
|
5241
|
+
callback = (typeof isSorted != 'function' && thisArg && thisArg[isSorted] === array) ? null : isSorted;
|
5038
5242
|
isSorted = false;
|
5039
5243
|
}
|
5040
5244
|
if (callback != null) {
|
@@ -5059,7 +5263,7 @@
|
|
5059
5263
|
* // => [2, 3, 4]
|
5060
5264
|
*/
|
5061
5265
|
function without(array) {
|
5062
|
-
return
|
5266
|
+
return baseDifference(array, slice(arguments, 1));
|
5063
5267
|
}
|
5064
5268
|
|
5065
5269
|
/**
|
@@ -5075,8 +5279,8 @@
|
|
5075
5279
|
* @returns {Array} Returns a new array of grouped elements.
|
5076
5280
|
* @example
|
5077
5281
|
*
|
5078
|
-
* _.zip(['
|
5079
|
-
* // => [['
|
5282
|
+
* _.zip(['fred', 'barney'], [30, 40], [true, false]);
|
5283
|
+
* // => [['fred', 30, true], ['barney', 40, false]]
|
5080
5284
|
*/
|
5081
5285
|
function zip() {
|
5082
5286
|
var array = arguments.length > 1 ? arguments : arguments[0],
|
@@ -5105,8 +5309,8 @@
|
|
5105
5309
|
* corresponding values.
|
5106
5310
|
* @example
|
5107
5311
|
*
|
5108
|
-
* _.zipObject(['
|
5109
|
-
* // => { '
|
5312
|
+
* _.zipObject(['fred', 'barney'], [30, 40]);
|
5313
|
+
* // => { 'fred': 30, 'barney': 40 }
|
5110
5314
|
*/
|
5111
5315
|
function zipObject(keys, values) {
|
5112
5316
|
var index = -1,
|
@@ -5179,14 +5383,14 @@
|
|
5179
5383
|
* return greeting + ' ' + this.name;
|
5180
5384
|
* };
|
5181
5385
|
*
|
5182
|
-
* func = _.bind(func, { 'name': '
|
5386
|
+
* func = _.bind(func, { 'name': 'fred' }, 'hi');
|
5183
5387
|
* func();
|
5184
|
-
* // => 'hi
|
5388
|
+
* // => 'hi fred'
|
5185
5389
|
*/
|
5186
5390
|
function bind(func, thisArg) {
|
5187
5391
|
return arguments.length > 2
|
5188
|
-
?
|
5189
|
-
:
|
5392
|
+
? createWrapper(func, 17, slice(arguments, 2), null, thisArg)
|
5393
|
+
: createWrapper(func, 1, null, null, thisArg);
|
5190
5394
|
}
|
5191
5395
|
|
5192
5396
|
/**
|
@@ -5220,7 +5424,7 @@
|
|
5220
5424
|
|
5221
5425
|
while (++index < length) {
|
5222
5426
|
var key = funcs[index];
|
5223
|
-
object[key] =
|
5427
|
+
object[key] = createWrapper(object[key], 1, null, null, object);
|
5224
5428
|
}
|
5225
5429
|
return object;
|
5226
5430
|
}
|
@@ -5242,7 +5446,7 @@
|
|
5242
5446
|
* @example
|
5243
5447
|
*
|
5244
5448
|
* var object = {
|
5245
|
-
* 'name': '
|
5449
|
+
* 'name': 'fred',
|
5246
5450
|
* 'greet': function(greeting) {
|
5247
5451
|
* return greeting + ' ' + this.name;
|
5248
5452
|
* }
|
@@ -5250,19 +5454,19 @@
|
|
5250
5454
|
*
|
5251
5455
|
* var func = _.bindKey(object, 'greet', 'hi');
|
5252
5456
|
* func();
|
5253
|
-
* // => 'hi
|
5457
|
+
* // => 'hi fred'
|
5254
5458
|
*
|
5255
5459
|
* object.greet = function(greeting) {
|
5256
|
-
* return greeting + '
|
5460
|
+
* return greeting + 'ya ' + this.name + '!';
|
5257
5461
|
* };
|
5258
5462
|
*
|
5259
5463
|
* func();
|
5260
|
-
* // => '
|
5464
|
+
* // => 'hiya fred!'
|
5261
5465
|
*/
|
5262
5466
|
function bindKey(object, key) {
|
5263
5467
|
return arguments.length > 2
|
5264
|
-
?
|
5265
|
-
:
|
5468
|
+
? createWrapper(key, 19, slice(arguments, 2), null, object)
|
5469
|
+
: createWrapper(key, 3, null, null, object);
|
5266
5470
|
}
|
5267
5471
|
|
5268
5472
|
/**
|
@@ -5279,7 +5483,7 @@
|
|
5279
5483
|
* @example
|
5280
5484
|
*
|
5281
5485
|
* var realNameMap = {
|
5282
|
-
* '
|
5486
|
+
* 'pebbles': 'penelope'
|
5283
5487
|
* };
|
5284
5488
|
*
|
5285
5489
|
* var format = function(name) {
|
@@ -5292,8 +5496,8 @@
|
|
5292
5496
|
* };
|
5293
5497
|
*
|
5294
5498
|
* var welcome = _.compose(greet, format);
|
5295
|
-
* welcome('
|
5296
|
-
* // => 'Hiya
|
5499
|
+
* welcome('pebbles');
|
5500
|
+
* // => 'Hiya Penelope!'
|
5297
5501
|
*/
|
5298
5502
|
function compose() {
|
5299
5503
|
var funcs = arguments,
|
@@ -5330,9 +5534,9 @@
|
|
5330
5534
|
* @returns {Function} Returns a callback function.
|
5331
5535
|
* @example
|
5332
5536
|
*
|
5333
|
-
* var
|
5334
|
-
* { 'name': '
|
5335
|
-
* { 'name': '
|
5537
|
+
* var characters = [
|
5538
|
+
* { 'name': 'barney', 'age': 36 },
|
5539
|
+
* { 'name': 'fred', 'age': 40 }
|
5336
5540
|
* ];
|
5337
5541
|
*
|
5338
5542
|
* // wrap to create custom callback shorthands
|
@@ -5343,8 +5547,8 @@
|
|
5343
5547
|
* };
|
5344
5548
|
* });
|
5345
5549
|
*
|
5346
|
-
* _.filter(
|
5347
|
-
* // => [{ 'name': '
|
5550
|
+
* _.filter(characters, 'age__gt38');
|
5551
|
+
* // => [{ 'name': 'fred', 'age': 40 }]
|
5348
5552
|
*/
|
5349
5553
|
function createCallback(func, thisArg, argCount) {
|
5350
5554
|
var type = typeof func;
|
@@ -5413,7 +5617,7 @@
|
|
5413
5617
|
*/
|
5414
5618
|
function curry(func, arity) {
|
5415
5619
|
arity = typeof arity == 'number' ? arity : (+arity || func.length);
|
5416
|
-
return
|
5620
|
+
return createWrapper(func, 4, null, null, null, arity);
|
5417
5621
|
}
|
5418
5622
|
|
5419
5623
|
/**
|
@@ -5490,6 +5694,9 @@
|
|
5490
5694
|
if (isCalled) {
|
5491
5695
|
lastCalled = now();
|
5492
5696
|
result = func.apply(thisArg, args);
|
5697
|
+
if (!timeoutId && !maxTimeoutId) {
|
5698
|
+
args = thisArg = null;
|
5699
|
+
}
|
5493
5700
|
}
|
5494
5701
|
} else {
|
5495
5702
|
timeoutId = setTimeout(delayed, remaining);
|
@@ -5504,6 +5711,9 @@
|
|
5504
5711
|
if (trailing || (maxWait !== wait)) {
|
5505
5712
|
lastCalled = now();
|
5506
5713
|
result = func.apply(thisArg, args);
|
5714
|
+
if (!timeoutId && !maxTimeoutId) {
|
5715
|
+
args = thisArg = null;
|
5716
|
+
}
|
5507
5717
|
}
|
5508
5718
|
};
|
5509
5719
|
|
@@ -5519,8 +5729,10 @@
|
|
5519
5729
|
if (!maxTimeoutId && !leading) {
|
5520
5730
|
lastCalled = stamp;
|
5521
5731
|
}
|
5522
|
-
var remaining = maxWait - (stamp - lastCalled)
|
5523
|
-
|
5732
|
+
var remaining = maxWait - (stamp - lastCalled),
|
5733
|
+
isCalled = remaining <= 0;
|
5734
|
+
|
5735
|
+
if (isCalled) {
|
5524
5736
|
if (maxTimeoutId) {
|
5525
5737
|
maxTimeoutId = clearTimeout(maxTimeoutId);
|
5526
5738
|
}
|
@@ -5531,12 +5743,19 @@
|
|
5531
5743
|
maxTimeoutId = setTimeout(maxDelayed, remaining);
|
5532
5744
|
}
|
5533
5745
|
}
|
5534
|
-
if (
|
5746
|
+
if (isCalled && timeoutId) {
|
5747
|
+
timeoutId = clearTimeout(timeoutId);
|
5748
|
+
}
|
5749
|
+
else if (!timeoutId && wait !== maxWait) {
|
5535
5750
|
timeoutId = setTimeout(delayed, wait);
|
5536
5751
|
}
|
5537
5752
|
if (leadingCall) {
|
5753
|
+
isCalled = true;
|
5538
5754
|
result = func.apply(thisArg, args);
|
5539
5755
|
}
|
5756
|
+
if (isCalled && !timeoutId && !maxTimeoutId) {
|
5757
|
+
args = thisArg = null;
|
5758
|
+
}
|
5540
5759
|
return result;
|
5541
5760
|
};
|
5542
5761
|
}
|
@@ -5560,11 +5779,11 @@
|
|
5560
5779
|
if (!isFunction(func)) {
|
5561
5780
|
throw new TypeError;
|
5562
5781
|
}
|
5563
|
-
var args =
|
5782
|
+
var args = slice(arguments, 1);
|
5564
5783
|
return setTimeout(function() { func.apply(undefined, args); }, 1);
|
5565
5784
|
}
|
5566
5785
|
// use `setImmediate` if available in Node.js
|
5567
|
-
if (
|
5786
|
+
if (setImmediate) {
|
5568
5787
|
defer = function(func) {
|
5569
5788
|
if (!isFunction(func)) {
|
5570
5789
|
throw new TypeError;
|
@@ -5594,7 +5813,7 @@
|
|
5594
5813
|
if (!isFunction(func)) {
|
5595
5814
|
throw new TypeError;
|
5596
5815
|
}
|
5597
|
-
var args =
|
5816
|
+
var args = slice(arguments, 2);
|
5598
5817
|
return setTimeout(function() { func.apply(undefined, args); }, wait);
|
5599
5818
|
}
|
5600
5819
|
|
@@ -5618,19 +5837,22 @@
|
|
5618
5837
|
* return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
|
5619
5838
|
* });
|
5620
5839
|
*
|
5840
|
+
* fibonacci(9)
|
5841
|
+
* // => 34
|
5842
|
+
*
|
5621
5843
|
* var data = {
|
5622
|
-
* '
|
5623
|
-
* '
|
5844
|
+
* 'fred': { 'name': 'fred', 'age': 40 },
|
5845
|
+
* 'pebbles': { 'name': 'pebbles', 'age': 1 }
|
5624
5846
|
* };
|
5625
5847
|
*
|
5626
5848
|
* // modifying the result cache
|
5627
|
-
* var
|
5628
|
-
*
|
5629
|
-
* // => { 'name': '
|
5849
|
+
* var get = _.memoize(function(name) { return data[name]; }, _.identity);
|
5850
|
+
* get('pebbles');
|
5851
|
+
* // => { 'name': 'pebbles', 'age': 1 }
|
5630
5852
|
*
|
5631
|
-
*
|
5632
|
-
*
|
5633
|
-
* // => { 'name': '
|
5853
|
+
* get.cache.pebbles.name = 'penelope';
|
5854
|
+
* get('pebbles');
|
5855
|
+
* // => { 'name': 'penelope', 'age': 1 }
|
5634
5856
|
*/
|
5635
5857
|
function memoize(func, resolver) {
|
5636
5858
|
if (!isFunction(func)) {
|
@@ -5700,11 +5922,11 @@
|
|
5700
5922
|
*
|
5701
5923
|
* var greet = function(greeting, name) { return greeting + ' ' + name; };
|
5702
5924
|
* var hi = _.partial(greet, 'hi');
|
5703
|
-
* hi('
|
5704
|
-
* // => 'hi
|
5925
|
+
* hi('fred');
|
5926
|
+
* // => 'hi fred'
|
5705
5927
|
*/
|
5706
5928
|
function partial(func) {
|
5707
|
-
return
|
5929
|
+
return createWrapper(func, 16, slice(arguments, 1));
|
5708
5930
|
}
|
5709
5931
|
|
5710
5932
|
/**
|
@@ -5735,7 +5957,7 @@
|
|
5735
5957
|
* // => { '_': _, 'jq': $ }
|
5736
5958
|
*/
|
5737
5959
|
function partialRight(func) {
|
5738
|
-
return
|
5960
|
+
return createWrapper(func, 32, null, slice(arguments, 1));
|
5739
5961
|
}
|
5740
5962
|
|
5741
5963
|
/**
|
@@ -5786,8 +6008,7 @@
|
|
5786
6008
|
debounceOptions.maxWait = wait;
|
5787
6009
|
debounceOptions.trailing = trailing;
|
5788
6010
|
|
5789
|
-
|
5790
|
-
return result;
|
6011
|
+
return debounce(func, wait, debounceOptions);
|
5791
6012
|
}
|
5792
6013
|
|
5793
6014
|
/**
|
@@ -5804,22 +6025,15 @@
|
|
5804
6025
|
* @returns {Function} Returns the new function.
|
5805
6026
|
* @example
|
5806
6027
|
*
|
5807
|
-
* var
|
5808
|
-
*
|
5809
|
-
* return 'before, ' + func('moe') + ', after';
|
6028
|
+
* var p = _.wrap(_.escape, function(func, text) {
|
6029
|
+
* return '<p>' + func(text) + '</p>';
|
5810
6030
|
* });
|
5811
|
-
*
|
5812
|
-
*
|
6031
|
+
*
|
6032
|
+
* p('Fred, Wilma, & Pebbles');
|
6033
|
+
* // => '<p>Fred, Wilma, & Pebbles</p>'
|
5813
6034
|
*/
|
5814
6035
|
function wrap(value, wrapper) {
|
5815
|
-
|
5816
|
-
throw new TypeError;
|
5817
|
-
}
|
5818
|
-
return function() {
|
5819
|
-
var args = [value];
|
5820
|
-
push.apply(args, arguments);
|
5821
|
-
return wrapper.apply(this, args);
|
5822
|
-
};
|
6036
|
+
return createWrapper(wrapper, 16, [value]);
|
5823
6037
|
}
|
5824
6038
|
|
5825
6039
|
/*--------------------------------------------------------------------------*/
|
@@ -5835,8 +6049,8 @@
|
|
5835
6049
|
* @returns {string} Returns the escaped string.
|
5836
6050
|
* @example
|
5837
6051
|
*
|
5838
|
-
* _.escape('
|
5839
|
-
* // => '
|
6052
|
+
* _.escape('Fred, Wilma, & Pebbles');
|
6053
|
+
* // => 'Fred, Wilma, & Pebbles'
|
5840
6054
|
*/
|
5841
6055
|
function escape(string) {
|
5842
6056
|
return string == null ? '' : String(string).replace(reUnescapedHtml, escapeHtmlChar);
|
@@ -5852,8 +6066,8 @@
|
|
5852
6066
|
* @returns {*} Returns `value`.
|
5853
6067
|
* @example
|
5854
6068
|
*
|
5855
|
-
* var
|
5856
|
-
*
|
6069
|
+
* var object = { 'name': 'fred' };
|
6070
|
+
* _.identity(object) === object;
|
5857
6071
|
* // => true
|
5858
6072
|
*/
|
5859
6073
|
function identity(value) {
|
@@ -5877,11 +6091,11 @@
|
|
5877
6091
|
* }
|
5878
6092
|
* });
|
5879
6093
|
*
|
5880
|
-
* _.capitalize('
|
5881
|
-
* // => '
|
6094
|
+
* _.capitalize('fred');
|
6095
|
+
* // => 'Fred'
|
5882
6096
|
*
|
5883
|
-
* _('
|
5884
|
-
* // => '
|
6097
|
+
* _('fred').capitalize();
|
6098
|
+
* // => 'Fred'
|
5885
6099
|
*/
|
5886
6100
|
function mixin(object, source) {
|
5887
6101
|
var ctor = object,
|
@@ -5929,6 +6143,22 @@
|
|
5929
6143
|
return this;
|
5930
6144
|
}
|
5931
6145
|
|
6146
|
+
/**
|
6147
|
+
* A no-operation function.
|
6148
|
+
*
|
6149
|
+
* @static
|
6150
|
+
* @memberOf _
|
6151
|
+
* @category Utilities
|
6152
|
+
* @example
|
6153
|
+
*
|
6154
|
+
* var object = { 'name': 'fred' };
|
6155
|
+
* _.noop(object) === undefined;
|
6156
|
+
* // => true
|
6157
|
+
*/
|
6158
|
+
function noop() {
|
6159
|
+
// no operation performed
|
6160
|
+
}
|
6161
|
+
|
5932
6162
|
/**
|
5933
6163
|
* Converts the given value into an integer of the specified radix.
|
5934
6164
|
* If `radix` is `undefined` or `0` a `radix` of `10` is used unless the
|
@@ -5949,7 +6179,7 @@
|
|
5949
6179
|
* // => 8
|
5950
6180
|
*/
|
5951
6181
|
var parseInt = nativeParseInt(whitespace + '08') == 8 ? nativeParseInt : function(value, radix) {
|
5952
|
-
// Firefox and Opera
|
6182
|
+
// Firefox < 21 and Opera < 15 follow the ES3 specified implementation of `parseInt`
|
5953
6183
|
return nativeParseInt(isString(value) ? value.replace(reLeadingSpacesAndZeros, '') : value, radix || 0);
|
5954
6184
|
};
|
5955
6185
|
|
@@ -6004,10 +6234,11 @@
|
|
6004
6234
|
} else {
|
6005
6235
|
max = +max || 0;
|
6006
6236
|
}
|
6007
|
-
|
6008
|
-
|
6009
|
-
|
6010
|
-
|
6237
|
+
if (floating || min % 1 || max % 1) {
|
6238
|
+
var rand = nativeRandom();
|
6239
|
+
return nativeMin(min + (rand * (max - min + parseFloat('1e-' + ((rand +'').length - 1)))), max);
|
6240
|
+
}
|
6241
|
+
return baseRandom(min, max);
|
6011
6242
|
}
|
6012
6243
|
|
6013
6244
|
/**
|
@@ -6052,7 +6283,7 @@
|
|
6052
6283
|
* debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl
|
6053
6284
|
*
|
6054
6285
|
* For more information on precompiling templates see:
|
6055
|
-
* http://lodash.com
|
6286
|
+
* http://lodash.com/custom-builds
|
6056
6287
|
*
|
6057
6288
|
* For more information on Chrome extension sandboxes see:
|
6058
6289
|
* http://developer.chrome.com/stable/extensions/sandboxingEval.html
|
@@ -6075,8 +6306,8 @@
|
|
6075
6306
|
*
|
6076
6307
|
* // using the "interpolate" delimiter to create a compiled template
|
6077
6308
|
* var compiled = _.template('hello <%= name %>');
|
6078
|
-
* compiled({ 'name': '
|
6079
|
-
* // => 'hello
|
6309
|
+
* compiled({ 'name': 'fred' });
|
6310
|
+
* // => 'hello fred'
|
6080
6311
|
*
|
6081
6312
|
* // using the "escape" delimiter to escape HTML in data property values
|
6082
6313
|
* _.template('<b><%- value %></b>', { 'value': '<script>' });
|
@@ -6084,16 +6315,16 @@
|
|
6084
6315
|
*
|
6085
6316
|
* // using the "evaluate" delimiter to generate HTML
|
6086
6317
|
* var list = '<% _.forEach(people, function(name) { %><li><%- name %></li><% }); %>';
|
6087
|
-
* _.template(list, { 'people': ['
|
6088
|
-
* // => '<li>
|
6318
|
+
* _.template(list, { 'people': ['fred', 'barney'] });
|
6319
|
+
* // => '<li>fred</li><li>barney</li>'
|
6089
6320
|
*
|
6090
6321
|
* // using the ES6 delimiter as an alternative to the default "interpolate" delimiter
|
6091
|
-
* _.template('hello ${ name }', { 'name': '
|
6092
|
-
* // => 'hello
|
6322
|
+
* _.template('hello ${ name }', { 'name': 'pebbles' });
|
6323
|
+
* // => 'hello pebbles'
|
6093
6324
|
*
|
6094
6325
|
* // using the internal `print` function in "evaluate" delimiters
|
6095
|
-
* _.template('<% print("hello " + name); %>!', { 'name': '
|
6096
|
-
* // => 'hello
|
6326
|
+
* _.template('<% print("hello " + name); %>!', { 'name': 'barney' });
|
6327
|
+
* // => 'hello barney!'
|
6097
6328
|
*
|
6098
6329
|
* // using a custom template delimiters
|
6099
6330
|
* _.templateSettings = {
|
@@ -6105,8 +6336,8 @@
|
|
6105
6336
|
*
|
6106
6337
|
* // using the `imports` option to import jQuery
|
6107
6338
|
* var list = '<% $.each(people, function(name) { %><li><%- name %></li><% }); %>';
|
6108
|
-
* _.template(list, { 'people': ['
|
6109
|
-
* // => '<li>
|
6339
|
+
* _.template(list, { 'people': ['fred', 'barney'] }, { 'imports': { '$': jQuery } });
|
6340
|
+
* // => '<li>fred</li><li>barney</li>'
|
6110
6341
|
*
|
6111
6342
|
* // using the `sourceURL` option to specify a custom sourceURL for the template
|
6112
6343
|
* var compiled = _.template('hello <%= name %>', null, { 'sourceURL': '/basic/greeting.jst' });
|
@@ -6136,7 +6367,7 @@
|
|
6136
6367
|
// and Laura Doktorova's doT.js
|
6137
6368
|
// https://github.com/olado/doT
|
6138
6369
|
var settings = lodash.templateSettings;
|
6139
|
-
text
|
6370
|
+
text = String(text || '');
|
6140
6371
|
|
6141
6372
|
// avoid missing dependencies when `iteratorTemplate` is not defined
|
6142
6373
|
options = defaults({}, options, settings);
|
@@ -6277,8 +6508,8 @@
|
|
6277
6508
|
* @returns {string} Returns the unescaped string.
|
6278
6509
|
* @example
|
6279
6510
|
*
|
6280
|
-
* _.unescape('
|
6281
|
-
* // => '
|
6511
|
+
* _.unescape('Fred, Barney & Pebbles');
|
6512
|
+
* // => 'Fred, Barney & Pebbles'
|
6282
6513
|
*/
|
6283
6514
|
function unescape(string) {
|
6284
6515
|
return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar);
|
@@ -6318,18 +6549,18 @@
|
|
6318
6549
|
* @returns {Object} Returns the wrapper object.
|
6319
6550
|
* @example
|
6320
6551
|
*
|
6321
|
-
* var
|
6322
|
-
* { 'name': '
|
6323
|
-
* { 'name': '
|
6324
|
-
* { 'name': '
|
6552
|
+
* var characters = [
|
6553
|
+
* { 'name': 'barney', 'age': 36 },
|
6554
|
+
* { 'name': 'fred', 'age': 40 },
|
6555
|
+
* { 'name': 'pebbles', 'age': 1 }
|
6325
6556
|
* ];
|
6326
6557
|
*
|
6327
|
-
* var youngest = _.chain(
|
6558
|
+
* var youngest = _.chain(characters)
|
6328
6559
|
* .sortBy('age')
|
6329
|
-
* .map(function(
|
6560
|
+
* .map(function(chr) { return chr.name + ' is ' + chr.age; })
|
6330
6561
|
* .first()
|
6331
6562
|
* .value();
|
6332
|
-
* // => '
|
6563
|
+
* // => 'pebbles is 1'
|
6333
6564
|
*/
|
6334
6565
|
function chain(value) {
|
6335
6566
|
value = new lodashWrapper(value);
|
@@ -6352,12 +6583,10 @@
|
|
6352
6583
|
* @example
|
6353
6584
|
*
|
6354
6585
|
* _([1, 2, 3, 4])
|
6355
|
-
* .
|
6356
|
-
* .
|
6357
|
-
* .map(function(num) { return num * num; })
|
6586
|
+
* .tap(function(array) { array.pop(); })
|
6587
|
+
* .reverse()
|
6358
6588
|
* .value();
|
6359
|
-
* // =>
|
6360
|
-
* // => [4, 16]
|
6589
|
+
* // => [3, 2, 1]
|
6361
6590
|
*/
|
6362
6591
|
function tap(value, interceptor) {
|
6363
6592
|
interceptor(value);
|
@@ -6373,21 +6602,21 @@
|
|
6373
6602
|
* @returns {*} Returns the wrapper object.
|
6374
6603
|
* @example
|
6375
6604
|
*
|
6376
|
-
* var
|
6377
|
-
* { 'name': '
|
6378
|
-
* { 'name': '
|
6605
|
+
* var characters = [
|
6606
|
+
* { 'name': 'barney', 'age': 36 },
|
6607
|
+
* { 'name': 'fred', 'age': 40 }
|
6379
6608
|
* ];
|
6380
6609
|
*
|
6381
6610
|
* // without explicit chaining
|
6382
|
-
* _(
|
6383
|
-
* // => { 'name': '
|
6611
|
+
* _(characters).first();
|
6612
|
+
* // => { 'name': 'barney', 'age': 36 }
|
6384
6613
|
*
|
6385
6614
|
* // with explicit chaining
|
6386
|
-
* _(
|
6615
|
+
* _(characters).chain()
|
6387
6616
|
* .first()
|
6388
6617
|
* .pick('age')
|
6389
6618
|
* .value()
|
6390
|
-
* // => { 'age':
|
6619
|
+
* // => { 'age': 36 }
|
6391
6620
|
*/
|
6392
6621
|
function wrapperChain() {
|
6393
6622
|
this.__chain__ = true;
|
@@ -6440,6 +6669,7 @@
|
|
6440
6669
|
lodash.compact = compact;
|
6441
6670
|
lodash.compose = compose;
|
6442
6671
|
lodash.countBy = countBy;
|
6672
|
+
lodash.create = create;
|
6443
6673
|
lodash.createCallback = createCallback;
|
6444
6674
|
lodash.curry = curry;
|
6445
6675
|
lodash.debounce = debounce;
|
@@ -6549,6 +6779,7 @@
|
|
6549
6779
|
lodash.lastIndexOf = lastIndexOf;
|
6550
6780
|
lodash.mixin = mixin;
|
6551
6781
|
lodash.noConflict = noConflict;
|
6782
|
+
lodash.noop = noop;
|
6552
6783
|
lodash.parseInt = parseInt;
|
6553
6784
|
lodash.random = random;
|
6554
6785
|
lodash.reduce = reduce;
|
@@ -6621,7 +6852,7 @@
|
|
6621
6852
|
* @memberOf _
|
6622
6853
|
* @type string
|
6623
6854
|
*/
|
6624
|
-
lodash.VERSION = '2.
|
6855
|
+
lodash.VERSION = '2.3.0';
|
6625
6856
|
|
6626
6857
|
// add "Chaining" functions to the wrapper
|
6627
6858
|
lodash.prototype.chain = wrapperChain;
|
@@ -6689,7 +6920,7 @@
|
|
6689
6920
|
// expose Lo-Dash
|
6690
6921
|
var _ = runInContext();
|
6691
6922
|
|
6692
|
-
// some AMD build optimizers
|
6923
|
+
// some AMD build optimizers like r.js check for condition patterns like the following:
|
6693
6924
|
if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
|
6694
6925
|
// Expose Lo-Dash to the global object even when an AMD loader is present in
|
6695
6926
|
// case Lo-Dash was injected by a third-party script and not intended to be
|