underscore-source 1.2.2 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
|
|
1
|
-
// Underscore.js 1.2.
|
2
|
-
// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc.
|
1
|
+
// Underscore.js 1.2.3
|
2
|
+
// (c) 2009-2011 Jeremy Ashkenas, DocumentCloud Inc.
|
3
3
|
// Underscore is freely distributable under the MIT license.
|
4
4
|
// Portions of Underscore are inspired or borrowed from Prototype,
|
5
5
|
// Oliver Steele's Functional, and John Resig's Micro-Templating.
|
@@ -25,6 +25,7 @@
|
|
25
25
|
|
26
26
|
// Create quick reference variables for speed access to core prototypes.
|
27
27
|
var slice = ArrayProto.slice,
|
28
|
+
concat = ArrayProto.concat,
|
28
29
|
unshift = ArrayProto.unshift,
|
29
30
|
toString = ObjProto.toString,
|
30
31
|
hasOwnProperty = ObjProto.hasOwnProperty;
|
@@ -67,7 +68,7 @@
|
|
67
68
|
}
|
68
69
|
|
69
70
|
// Current version.
|
70
|
-
_.VERSION = '1.2.
|
71
|
+
_.VERSION = '1.2.3';
|
71
72
|
|
72
73
|
// Collection Functions
|
73
74
|
// --------------------
|
@@ -107,7 +108,7 @@
|
|
107
108
|
// **Reduce** builds up a single result from a list of values, aka `inject`,
|
108
109
|
// or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
|
109
110
|
_.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
|
110
|
-
var initial =
|
111
|
+
var initial = arguments.length > 2;
|
111
112
|
if (obj == null) obj = [];
|
112
113
|
if (nativeReduce && obj.reduce === nativeReduce) {
|
113
114
|
if (context) iterator = _.bind(iterator, context);
|
@@ -121,20 +122,22 @@
|
|
121
122
|
memo = iterator.call(context, memo, value, index, list);
|
122
123
|
}
|
123
124
|
});
|
124
|
-
if (!initial) throw new TypeError(
|
125
|
+
if (!initial) throw new TypeError('Reduce of empty array with no initial value');
|
125
126
|
return memo;
|
126
127
|
};
|
127
128
|
|
128
129
|
// The right-associative version of reduce, also known as `foldr`.
|
129
130
|
// Delegates to **ECMAScript 5**'s native `reduceRight` if available.
|
130
131
|
_.reduceRight = _.foldr = function(obj, iterator, memo, context) {
|
132
|
+
var initial = arguments.length > 2;
|
131
133
|
if (obj == null) obj = [];
|
132
134
|
if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
|
133
135
|
if (context) iterator = _.bind(iterator, context);
|
134
|
-
return
|
136
|
+
return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
|
135
137
|
}
|
136
|
-
var reversed =
|
137
|
-
|
138
|
+
var reversed = _.toArray(obj).reverse();
|
139
|
+
if (context && !initial) iterator = _.bind(iterator, context);
|
140
|
+
return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
|
138
141
|
};
|
139
142
|
|
140
143
|
// Return the first value which passes a truth test. Aliased as `detect`.
|
@@ -189,7 +192,7 @@
|
|
189
192
|
// Delegates to **ECMAScript 5**'s native `some` if available.
|
190
193
|
// Aliased as `any`.
|
191
194
|
var any = _.some = _.any = function(obj, iterator, context) {
|
192
|
-
iterator
|
195
|
+
iterator || (iterator = _.identity);
|
193
196
|
var result = false;
|
194
197
|
if (obj == null) return result;
|
195
198
|
if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
|
@@ -402,10 +405,11 @@
|
|
402
405
|
});
|
403
406
|
};
|
404
407
|
|
405
|
-
// Take the difference between one array and
|
408
|
+
// Take the difference between one array and a number of other arrays.
|
406
409
|
// Only the elements present in just the first array will remain.
|
407
|
-
_.difference = function(array
|
408
|
-
|
410
|
+
_.difference = function(array) {
|
411
|
+
var rest = _.flatten(slice.call(arguments, 1));
|
412
|
+
return _.filter(array, function(value){ return !_.include(rest, value); });
|
409
413
|
};
|
410
414
|
|
411
415
|
// Zip together multiple lists into a single array -- elements that share
|
@@ -432,7 +436,7 @@
|
|
432
436
|
return array[i] === item ? i : -1;
|
433
437
|
}
|
434
438
|
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
435
|
-
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
439
|
+
for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
|
436
440
|
return -1;
|
437
441
|
};
|
438
442
|
|
@@ -441,7 +445,7 @@
|
|
441
445
|
if (array == null) return -1;
|
442
446
|
if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
|
443
447
|
var i = array.length;
|
444
|
-
while (i--) if (array[i] === item) return i;
|
448
|
+
while (i--) if (i in array && array[i] === item) return i;
|
445
449
|
return -1;
|
446
450
|
};
|
447
451
|
|
@@ -579,7 +583,7 @@
|
|
579
583
|
// conditionally execute the original function.
|
580
584
|
_.wrap = function(func, wrapper) {
|
581
585
|
return function() {
|
582
|
-
var args = [func]
|
586
|
+
var args = concat.apply([func], arguments);
|
583
587
|
return wrapper.apply(this, args);
|
584
588
|
};
|
585
589
|
};
|
@@ -587,9 +591,9 @@
|
|
587
591
|
// Returns a function that is the composition of a list of functions, each
|
588
592
|
// consuming the return value of the function that follows.
|
589
593
|
_.compose = function() {
|
590
|
-
var funcs =
|
594
|
+
var funcs = arguments;
|
591
595
|
return function() {
|
592
|
-
var args =
|
596
|
+
var args = arguments;
|
593
597
|
for (var i = funcs.length - 1; i >= 0; i--) {
|
594
598
|
args = [funcs[i].apply(this, args)];
|
595
599
|
}
|
@@ -677,8 +681,8 @@
|
|
677
681
|
if (a._chain) a = a._wrapped;
|
678
682
|
if (b._chain) b = b._wrapped;
|
679
683
|
// Invoke a custom `isEqual` method if one is provided.
|
680
|
-
if (_.isFunction(a.isEqual)) return a.isEqual(b);
|
681
|
-
if (_.isFunction(b.isEqual)) return b.isEqual(a);
|
684
|
+
if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
|
685
|
+
if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
|
682
686
|
// Compare `[[Class]]` names.
|
683
687
|
var className = toString.call(a);
|
684
688
|
if (className != toString.call(b)) return false;
|
@@ -687,13 +691,11 @@
|
|
687
691
|
case '[object String]':
|
688
692
|
// Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
|
689
693
|
// equivalent to `new String("5")`.
|
690
|
-
return
|
694
|
+
return a == String(b);
|
691
695
|
case '[object Number]':
|
692
|
-
a = +a;
|
693
|
-
b = +b;
|
694
696
|
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
|
695
697
|
// other numeric values.
|
696
|
-
return a != a ? b != b : (a == 0 ? 1 / a == 1 / b : a == b);
|
698
|
+
return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
|
697
699
|
case '[object Date]':
|
698
700
|
case '[object Boolean]':
|
699
701
|
// Coerce dates and booleans to numeric primitive values. Dates are compared by their
|
@@ -733,7 +735,7 @@
|
|
733
735
|
}
|
734
736
|
} else {
|
735
737
|
// Objects with different constructors are not equivalent.
|
736
|
-
if (
|
738
|
+
if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
|
737
739
|
// Deep compare objects.
|
738
740
|
for (var key in a) {
|
739
741
|
if (hasOwnProperty.call(a, key)) {
|
@@ -786,11 +788,10 @@
|
|
786
788
|
};
|
787
789
|
|
788
790
|
// Is a given variable an arguments object?
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
} else {
|
791
|
+
_.isArguments = function(obj) {
|
792
|
+
return toString.call(obj) == '[object Arguments]';
|
793
|
+
};
|
794
|
+
if (!_.isArguments(arguments)) {
|
794
795
|
_.isArguments = function(obj) {
|
795
796
|
return !!(obj && hasOwnProperty.call(obj, 'callee'));
|
796
797
|
};
|
@@ -915,7 +916,10 @@
|
|
915
916
|
.replace(/\t/g, '\\t')
|
916
917
|
+ "');}return __p.join('');";
|
917
918
|
var func = new Function('obj', '_', tmpl);
|
918
|
-
|
919
|
+
if (data) return func(data, _);
|
920
|
+
return function(data) {
|
921
|
+
return func.call(this, data, _);
|
922
|
+
};
|
919
923
|
};
|
920
924
|
|
921
925
|
// The OOP Wrapper
|