diff --git a/index.html b/index.html index fef1bc7eb..4fa43925c 100644 --- a/index.html +++ b/index.html @@ -19,7 +19,7 @@ width: 550px; } #documentation p { - margin-bottom: 8px; + margin-bottom: 4px; } a, a:visited { padding: 0 2px; @@ -34,7 +34,7 @@ h1, h2, h3, h4, h5, h6 { margin-top: 35px; } - code, pre { + code, pre, tt { font-family: Monaco, Consolas, "Lucida Console", monospace; font-size: 12px; line-height: 18px; @@ -45,7 +45,7 @@ } pre { font-size: 12px; - padding-left: 12px; + padding: 2px 0 2px 12px; border-left: 6px solid #aaaa99; margin: 0px 0 35px; } @@ -104,6 +104,13 @@ intersect, zip, indexOf

+

+ Functions +
+ bind, bindAll, delay, + defer, wrap +

+

Objects
@@ -113,13 +120,6 @@

-

- Functions -
- bind, bindAll, delay, - defer, wrap -

-

Utility
@@ -127,7 +127,8 @@

-

Collections

+ +

Collection Functions (Arrays or Objects)

each_.each(list, iterator, [context]) @@ -135,8 +136,9 @@ Iterates over a list of elements, yielding each in turn to an iterator function. The iterator is bound to the context object, if one is passed. If list is a Javascript object, a pair with key - and value properties will be yielded. Delegates to the native - forEach method if it exists. + and value properties will be yielded. If the list has an each + method of its own defined, it will be used. Delegates to the native + forEach function if it exists.

 _.each([1, 2, 3], function(num){ alert(num); });
@@ -216,7 +218,7 @@ _.all([true, 1, null, 'yes']);
 

- any_.any(list, iterator, [context]) + any_.any(list, [iterator], [context])
Returns true if any of the values in the list pass the iterator truth test. Short-circuits and stops traversing the list @@ -241,7 +243,7 @@ _.include([1, 2, 3], 3);

- invoke_.invoke(list, methodName) + invoke_.invoke(list, methodName, [*arguments])
Calls the method named by methodName on each value in the list. Any extra arguments passed to invoke will be forwarded on to the @@ -314,21 +316,318 @@ _.sortedIndex([10, 20, 30, 40, 50], 35); => 3 -

- toArray_.(list, iterator, [context]) +

+ toArray_.toArray(list)
+ Converts the list (anything that can be iterated over), into a + real Array. Useful for transmuting the arguments object. +

+
+(function(){ return _.toArray(arguments).slice(0); })(1, 2, 3);
+=> [1, 2, 3]
+
+

+ size_.size(list) +
+ Return the number of values in the list. +

+
+_.size({one : 1, two : 2, three : 3});
+=> 3
+
+ +

Array Functions

+ +

+ first_.first(array) +
+ Convenience to return the first element of an array (identical to array[0]). +

+
+_.first([3, 2, 1]);
+=> 3
+
+ +

+ last_.last(array) +
+ Returns the last element of an array. +

+
+_.last([3, 2, 1]);
+=> 1
+
+ +

+ compact_.compact(array) +
+ Returns a copy of the array with all falsy values removed. + In Javascript, false, null, 0, "", + undefined and NaN are all falsy. +

+
+_.compact([0, 1, false, 2, '', 3]);
+=> [1, 2, 3]
+
+ +

+ flatten_.flatten(array) +
+ Flattens a nested array (the nesting can be to any depth). +

+
+_.flatten([1, [2], [3, [[[4]]]]]);
+=> [1, 2, 3, 4];
+
+ +

+ without_.without(array, [*values]) +
+ Returns a copy of the array with all instances of the values + removed. == is used for the equality test. +

+
+_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
+=> [2, 3, 4]
+
+ +

+ uniq_.uniq(array, [isSorted]) +
+ Produces a duplicate-free version of the array, using == to test + object equality. If you know in advance that the array is sorted, + passing true for isSorted will run a much faster algorithm. +

+
+_.uniq([1, 2, 1, 3, 1, 4]);
+=> [1, 2, 3, 4]
+
+ +

+ intersect_.intersect(*arrays) +
+ Computes the list of values that are the intersection of all the arrays. + Each value in the result is present in each of the arrays. +

+
+_.intersect([1, 2, 3], [101, 2, 1, 10], [2, 1]);
+=> [1, 2]
+
+ +

+ zip_.zip(*arrays) +
+ Merges together the values of each of the arrays with the + values at the corresponding position. Useful when you have separate + data sources that are coordinated through matching array indexes. +

+
+_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
+=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
+
+ +

+ indexOf_.indexOf(array, value) +
+ Returns the index at which value can be found in the array, + or -1 if value is not present in the array. Uses the native + indexOf function unless it's missing. +

+
+_.indexOf([1, 2, 3], 2);
+=> 1
+
+ +

Function (uh, ahem) Functions

+ +

+ bind_.bind(function, context, [*arguments]) +
+ Bind a function to a context object, meaning that whenever + the function is called, the value of this will be the context. + Optionally, bind arguments to the function to pre-fill them, + also known as currying. +

+
+var func = function(greeting){ return greeting + ': ' + this.name };
+func = _.bind(func, {name : 'moe'}, 'hi');
+func();
+=> 'hi: moe'
+
+ +

+ bindAll_.bindAll(*methodNames, context) +
+ Binds a number of methods on the context object, specified by + methodNames, to be run in the context of that object whenever they + are invoked. Very handy for binding functions that are going to be used + as event handlers, which would otherwise be invoked with a fairly useless + this. +

+
+var buttonView = {
+  label   : 'underscore', 
+  onClick : function(){ alert('clicked: ' + this.label); },
+  onHover : function(){ console.log('hovering: ' + this.label); }
+};
+_.bindAll('onClick', 'onHover', buttonView);
+jQuery('#underscore_button').bind('click', buttonView.onClick);
+=> When the button is clicked, this.label will have the correct value...
+
+ +

+ delay_.delay(function, wait, [*arguments]) +
+ Much like setTimeout, invokes function after wait + milliseconds. If you pass the optional arguments, they will be + forwarded on to the function when it is invoked. +

+
+var log = _.bind(console.log, console);
+_.delay(log, 1000, 'logged later');
+=> 'logged later' // Appears after one second.
+
+ +

+ defer_.defer(function) +
+ Defers invoking the function until the current call stack has cleared, + similar to using setTimeout with a delay of 0. Useful for performing + expensive computations or HTML rendering in chunks without blocking the UI thread + from updating. +

+
+_.defer(function(){ alert('deferred'); });
+// Returns from the function before the alert runs.
+
+ +

+ wrap_.wrap(function, wrapper) +
+ Wraps the first function inside of the wrapper function, + passing it as the first argument. This allows the wrapper to + execute code before and after the function runs, adjust the arguments, + and execute it conditionally. +

+
+var hello = function(name) { return "hello: " + name; };
+hello = _.wrap(hello, function(func) {
+  return "before, " + func("moe") + ", after";
+});
+hello();
+=> before, hello: moe, after
+
+ +

Object Functions

+ +

+ keys_.keys(object) +
+ Retrieve all the names of the object's properties. +

+
+_.keys({one : 1, two : 2, three : 3});
+=> ["one", "two", "three"]
+
+ +

+ values_.values(object) +
+ Return all of the values of the object's properties. +

+
+_.values({one : 1, two : 2, three : 3});
+=> [1, 2, 3]
+
+ +

+ extend_.extend(destination, source) +
+ Copy all of the properties in the source object over to the + destination object. +

+
+_.extend({name : 'moe'}, {age : 50});
+=> {name : 'moe', age : 50}
+
+ +

+ clone_.clone(object) +
+ Create a shallow-copied clone of the object. Any nested objects + or arrays will be copied by reference, not duplicated. +

+
+_.clone({name : 'moe'});
+=> {name : 'moe'};
+
+ +

+ isEqual_.isEqual(object, other) +
+ Performs an optimized deep comparison between the two objects, to determine + if they should be considered equal. +

+
+var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
+var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
+moe == clone;
+=> false
+_.isEqual(moe, clone);
+=> true
+
+ +

+ isElement_.() +

 

- size_.(list, iterator, [context]) + isArray_.()
-

 
+ +

+ isFunction_.() +
+

+
+
+ +

+ isUndefined_.() +
+

+
+
+ +

+ toString_.() +
+

+
+
+ +

Utility Functions

+ +

+ uniqueId_.() +
+

+
+
+ +

+ template_.() +
+

+
+
diff --git a/test/test.html b/test/test.html index aa2ca7a12..67415345d 100644 --- a/test/test.html +++ b/test/test.html @@ -9,8 +9,8 @@ - + diff --git a/underscore.js b/underscore.js index 2f7a58d30..7a42cbb12 100644 --- a/underscore.js +++ b/underscore.js @@ -227,17 +227,21 @@ window._ = { // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. - uniq : function(array, sorted) { + uniq : function(array, isSorted) { return _.inject(array, [], function(memo, el, i) { - if (0 == i || (sorted ? _.last(memo) != el : !_.include(memo, el))) memo.push(el); + if (0 == i || (isSorted ? _.last(memo) != el : !_.include(memo, el))) memo.push(el); return memo; }); }, - // Produce an array that contains every item shared between two given arrays. - intersect : function(array1, array2) { - return _.select(_.uniq(array1), function(item1) { - return _.detect(array2, function(item2) { return item1 === item2; }); + // Produce an array that contains every item shared between all the + // passed-in arrays. + intersect : function(array) { + var rest = _.toArray(arguments).slice(1); + return _.select(_.uniq(array), function(item1) { + return _.all(rest, function(other) { + return _.detect(other, function(item2){ return item1 === item2; }); + }); }); },