underscore-source 1.1.6 → 1.1.7

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
1
  module Underscore
2
2
  module Source
3
- VERSION = "1.1.6"
3
+ VERSION = "1.1.7"
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- // Underscore.js 1.1.6
1
+ // Underscore.js 1.1.7
2
2
  // (c) 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,
@@ -55,25 +55,26 @@
55
55
  module.exports = _;
56
56
  _._ = _;
57
57
  } else {
58
- root._ = _;
58
+ // Exported as a string, for Closure Compiler "advanced" mode.
59
+ root['_'] = _;
59
60
  }
60
61
 
61
62
  // Current version.
62
- _.VERSION = '1.1.6';
63
+ _.VERSION = '1.1.7';
63
64
 
64
65
  // Collection Functions
65
66
  // --------------------
66
67
 
67
68
  // The cornerstone, an `each` implementation, aka `forEach`.
68
- // Handles objects implementing `forEach`, arrays, and raw objects.
69
+ // Handles objects with the built-in `forEach`, arrays, and raw objects.
69
70
  // Delegates to **ECMAScript 5**'s native `forEach` if available.
70
71
  var each = _.each = _.forEach = function(obj, iterator, context) {
71
72
  if (obj == null) return;
72
73
  if (nativeForEach && obj.forEach === nativeForEach) {
73
74
  obj.forEach(iterator, context);
74
- } else if (_.isNumber(obj.length)) {
75
+ } else if (obj.length === +obj.length) {
75
76
  for (var i = 0, l = obj.length; i < l; i++) {
76
- if (iterator.call(context, obj[i], i, obj) === breaker) return;
77
+ if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
77
78
  }
78
79
  } else {
79
80
  for (var key in obj) {
@@ -106,7 +107,7 @@
106
107
  return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
107
108
  }
108
109
  each(obj, function(value, index, list) {
109
- if (!initial && index === 0) {
110
+ if (!initial) {
110
111
  memo = value;
111
112
  initial = true;
112
113
  } else {
@@ -181,14 +182,14 @@
181
182
  // Delegates to **ECMAScript 5**'s native `some` if available.
182
183
  // Aliased as `any`.
183
184
  var any = _.some = _.any = function(obj, iterator, context) {
184
- iterator || (iterator = _.identity);
185
+ iterator = iterator || _.identity;
185
186
  var result = false;
186
187
  if (obj == null) return result;
187
188
  if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
188
189
  each(obj, function(value, index, list) {
189
- if (result = iterator.call(context, value, index, list)) return breaker;
190
+ if (result |= iterator.call(context, value, index, list)) return breaker;
190
191
  });
191
- return result;
192
+ return !!result;
192
193
  };
193
194
 
194
195
  // Determine if a given value is included in the array or object using `===`.
@@ -251,6 +252,16 @@
251
252
  }), 'value');
252
253
  };
253
254
 
255
+ // Groups the object's values by a criterion produced by an iterator
256
+ _.groupBy = function(obj, iterator) {
257
+ var result = {};
258
+ each(obj, function(value, index) {
259
+ var key = iterator(value, index);
260
+ (result[key] || (result[key] = [])).push(value);
261
+ });
262
+ return result;
263
+ };
264
+
254
265
  // Use a comparator function to figure out at what index an object should
255
266
  // be inserted so as to maintain order. Uses binary search.
256
267
  _.sortedIndex = function(array, obj, iterator) {
@@ -267,7 +278,7 @@
267
278
  _.toArray = function(iterable) {
268
279
  if (!iterable) return [];
269
280
  if (iterable.toArray) return iterable.toArray();
270
- if (_.isArray(iterable)) return iterable;
281
+ if (_.isArray(iterable)) return slice.call(iterable);
271
282
  if (_.isArguments(iterable)) return slice.call(iterable);
272
283
  return _.values(iterable);
273
284
  };
@@ -316,8 +327,7 @@
316
327
 
317
328
  // Return a version of the array that does not contain the specified value(s).
318
329
  _.without = function(array) {
319
- var values = slice.call(arguments, 1);
320
- return _.filter(array, function(value){ return !_.include(values, value); });
330
+ return _.difference(array, slice.call(arguments, 1));
321
331
  };
322
332
 
323
333
  // Produce a duplicate-free version of the array. If the array has already
@@ -330,9 +340,15 @@
330
340
  }, []);
331
341
  };
332
342
 
343
+ // Produce an array that contains the union: each distinct element from all of
344
+ // the passed-in arrays.
345
+ _.union = function() {
346
+ return _.uniq(_.flatten(arguments));
347
+ };
348
+
333
349
  // Produce an array that contains every item shared between all the
334
- // passed-in arrays.
335
- _.intersect = function(array) {
350
+ // passed-in arrays. (Aliased as "intersect" for back-compat.)
351
+ _.intersection = _.intersect = function(array) {
336
352
  var rest = slice.call(arguments, 1);
337
353
  return _.filter(_.uniq(array), function(item) {
338
354
  return _.every(rest, function(other) {
@@ -341,6 +357,12 @@
341
357
  });
342
358
  };
343
359
 
360
+ // Take the difference between one array and another.
361
+ // Only the elements present in just the first array will remain.
362
+ _.difference = function(array, other) {
363
+ return _.filter(array, function(value){ return !_.include(other, value); });
364
+ };
365
+
344
366
  // Zip together multiple lists into a single array -- elements that share
345
367
  // an index go together.
346
368
  _.zip = function() {
@@ -502,7 +524,7 @@
502
524
  var funcs = slice.call(arguments);
503
525
  return function() {
504
526
  var args = slice.call(arguments);
505
- for (var i=funcs.length-1; i >= 0; i--) {
527
+ for (var i = funcs.length - 1; i >= 0; i--) {
506
528
  args = [funcs[i].apply(this, args)];
507
529
  }
508
530
  return args[0];
@@ -537,7 +559,11 @@
537
559
  // Return a sorted list of the function names available on the object.
538
560
  // Aliased as `methods`
539
561
  _.functions = _.methods = function(obj) {
540
- return _.filter(_.keys(obj), function(key){ return _.isFunction(obj[key]); }).sort();
562
+ var names = [];
563
+ for (var key in obj) {
564
+ if (_.isFunction(obj[key])) names.push(key);
565
+ }
566
+ return names.sort();
541
567
  };
542
568
 
543
569
  // Extend a given object with all the properties in passed-in object(s).
@@ -589,6 +615,7 @@
589
615
  if (b._chain) b = b._wrapped;
590
616
  // One of them implements an isEqual()?
591
617
  if (a.isEqual) return a.isEqual(b);
618
+ if (b.isEqual) return b.isEqual(a);
592
619
  // Check dates' integer values.
593
620
  if (_.isDate(a) && _.isDate(b)) return a.getTime() === b.getTime();
594
621
  // Both are NaN?
@@ -630,6 +657,11 @@
630
657
  return toString.call(obj) === '[object Array]';
631
658
  };
632
659
 
660
+ // Is a given variable an object?
661
+ _.isObject = function(obj) {
662
+ return obj === Object(obj);
663
+ };
664
+
633
665
  // Is a given variable an arguments object?
634
666
  _.isArguments = function(obj) {
635
667
  return !!(obj && hasOwnProperty.call(obj, 'callee'));
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: underscore-source
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.1.6
5
+ version: 1.1.7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel X. Moore