Awesome add-ons for Underscore.js.
JavaScript CoffeeScript CSS
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
docs Added AMD modules Sep 17, 2012
src Added AMD modules Sep 17, 2012
test Rebuild Nov 25, 2013
LICENSE Update to 1.2.4 Sep 17, 2012
package.json Rebuild Nov 25, 2013
underscore-awesomer.min.js Updated dependent libraries. Added lodash legacy tests. Mar 26, 2013

Build Status

Underscore-Awesomer* provides some (ahem) awesome extensions to the Underscore utility-belt library for JavaScript.

See below for all the awesome stuff you can do and check out my blog for the latest examples:


#Download Latest (1.2.4):

Please see the release notes for upgrade pointers.

###Module Loading

Underscore-Awesomer.js is compatible with RequireJS, CommonJS, Brunch and AMD module loading. Module names:

  • 'underscore-awesomer' - underscore-awesomer.js.



For Docs, License, Tests, and pre-packed downloads of Underscore, see:

*Underscore is already awesome, so something that improves it must make Underscore 'awesomer'!

API Highlights:

Keypaths (_.hasKeypath, _.keypath, _.keypathValueOwner)

Rather than just using simple keys to reference properties, you can use keypaths (dot-delimited strings or arrays of strings) to traverse you object.


_.keypath({hello: {world: ‘!’} }, ‘’); // returns ‘!’
_.keypathValueOwner({hello: {world: ‘!’} }, ‘’); // returns hello

Type Conversions (_.resolveConstructor, _.toType)

_.toType introduces a convention of{SomeType} and complies with underscore’s{SomeType} convention if the constructor name or instanceof don’t find a match. Useful if you wrap a class inside another.


var constructor = _.resolveConstructor(‘SomeNamespace.SomeClass’), instance = new constructor();
var actual_date = _.toType(wrapped_date, ‘Date’);

Removal (_.remove)

Provides many variants on how to remove something from an array or object collection.


var removed = _.remove([2,4,2], 2); _.isEqual(removed, 2);
var removed = _.remove({bob: 1, fred: 3, george: 5}, [‘bob’, ‘george’]); _.isEqual(removed, [1,5]);

JSON serialization (_.toJSON, _.fromJSON)

Note: this functionality has been renamed to JSONS.serialize and JSONS and been moved to:

or you can play with it live on jsfiddle

Object Lifecycle (_.own, _.disown)

Note: this functionality has been renamed to LC.own and LC.disown and been move to:

Compare for the rest of us (

Wraps built in compare with self-evident return types (_.COMPARE_EQUAL, _.COMPARE_ASCENDING, _.COMPARE_DESCENDING) and allows objects to provide custom compare methods.


if (‘x’, ‘y’) === _.COMPARE_ASCENDING) return ‘y’
if (‘こんにちは’, ‘さようなら’, ‘localeCompare’) === _.COMPARE_ASCENDING) return ‘さようなら’;
if (, ‘a string’) === _.COMPARE_ASCENDING) return custom_compare_instance;

Super helpers (.getSuperFunction/.superCall/_.superApply)

Useful if you don’t know what the super class will be ahead of time (To put this in context, take a look at Mixin.js:

local_backbone_collection_mixin { _add: function(model) { if (! = model.cid;); _.superApply(this, ‘_add’, arguments); } };

And more: _.cloneToDepth, _pluck with remove, _.findIndex, .functionExists/.callIfExists, and _.getValue with default if missing, and _.className.

Building, Running and Testing the library


  1. install node.js:
  2. install node packages: 'npm install'


Look at: