node package manager
Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org »


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 it 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: