Skip to content


Subversion checkout URL

You can clone with
Download ZIP
JavaScript CoffeeScript CSS
Branch: master
Failed to load latest commit information.
docs Added AMD modules
packages Rebuild
src Added AMD modules
test Rebuild
.gitignore Bower publish
.travis.yml Update CI Updated AMD tests
LICENSE Upgraded to easy-bake, added packaging tests, and re-wrote in CoffeeS… Typo in readme Update to 1.2.4
component.json Bower publish
package.json Rebuild
underscore-awesomer.js Rebuild
underscore-awesomer.min.js Updated dependent libraries. Added lodash legacy tests.

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:

Something went wrong with that request. Please try again.