Underscore is a utility-belt library for Javascript that provides a lot of the functional programming support that you would expect in Prototype.js (or Ruby), but without extending any of the built-in Javascript objects. It's the tie to go along with jQuery's tux.
Underscore provides 43-odd functions that support both the usual functional suspects: map, select, invoke — as well as more specialized helpers: function binding, javascript templating, deep equality testing, and so on. It delegates to the built-in functions, if present, so Javascript 1.6 compliant browsers will use the native implementations of forEach, map, filter, every and some.
Underscore includes a complete Test & Benchmark Suite for your perusal.
Collections
each, map,
inject, detect, select, reject, all,
any, include, invoke, pluck, max,
min, sortBy, sortedIndex, toArray,
size
Arrays
first, last,
compact, flatten, without, uniq,
intersect, zip, indexOf
Objects
keys, values,
extend, clone, isEqual, isElement,
isArray, isFunction, isUndefined, toString
Functions
bind, bindAll, delay,
defer, wrap
each_.each(list, iterator, [context])
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.
_.each([1, 2, 3], function(num){ alert(num); });
=> alerts each number in turn...
map_.map(list, iterator, [context])
Produces a new array of values by mapping each value in list
through a transformation function (iterator). If the native
map method exists, it will be used instead.
_.map([1, 2, 3], function(num){ return num * 3 });
=> [3, 6, 9]
inject_.inject(list, memo, iterator, [context])
Also known as reduce and foldl, inject reduces a
list of values into a single value. Memo is the initial state
of the reduction, and each successive step of it should be returned by
iterator.
var sum = _.inject([1, 2, 3], 0, function(memo, num){ return memo + num });
=> 6
detect_.detect(list, iterator, [context])
Looks through each value in the list, returning the first one that
passes a truth test (iterator). The function returns as
soon as it finds the true element, and doesn't continue to traverse
the list.
var even = _.detect([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> 2
select_.select(list, iterator, [context])
Looks through each value in the list, returning an array of all
the values that pass a truth test (iterator). Delegates to the
native filter method, if it exists.
var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
reject_.reject(list, iterator, [context])
Returns the values in list without the elements that the truth
test (iterator) passes. The opposite of select.
var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [1, 3, 5]
all_.(list, [iterator], [context])
Returns true if all of the values in the list pass the iterator
truth test. If an iterator is not provided, the truthy value of
the element will be used instead. Delegates to the native method every, if
present.
_.all([true, 1, null, 'yes']); => false
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
if a true element is found. Delegates to the native method some,
if present.
_.any([null, 0, 'yes', false]); => true
include_.(list, iterator, [context])
invoke_.(list, iterator, [context])
pluck_.(list, iterator, [context])
max_.(list, iterator, [context])
min_.(list, iterator, [context])
sortBy_.(list, iterator, [context])
sortedIndex_.(list, iterator, [context])
toArray_.(list, iterator, [context])
size_.(list, iterator, [context])