A drop-in replacement for Underscore.js, from the devs behind jsPerf.com, that delivers performance improvements, bug fixes, and additional features.
Lo-Dash’s performance is gained by avoiding slower native methods, instead opting for simplified non-ES5 compliant methods optimized for common usage, and by leveraging function compilation to reduce the number of overall function calls.
- Development source
- Production source
- For optimal performance, create a custom build with only the features you need
We’ve got API docs, benchmarks, and unit tests.
For a list of upcoming features, check out our roadmap.
For more information check out these screencasts over Lo-Dash:
- AMD loader support (RequireJS, curl.js, etc.)
- _.bind supports "lazy" binding
- _.debounce’ed functions match _.throttle’ed functions’ return value behavior
- _.forEach is chainable
- _.forIn for iterating over an object’s own and inherited properties
- _.forOwn for iterating over an object’s own properties
- _.groupBy, _.sortedIndex, and _.uniq accept a
thisArgargument - _.indexOf and _.lastIndexOf accept a
fromIndexargument - _.partial for more functional fun
- _.size supports returning the
lengthof string values - _.template utilizes sourceURLs for easier debugging
Lo-Dash has been tested in at least Chrome 5-19, Firefox 1.5-13, IE 6-9, Opera 9.25-11.64, Safari 3.0.4-5.1.3, Node.js 0.4.8-0.6.18, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC3.
Custom builds make it easy to create lightweight versions of Lo-Dash containing only the methods you need. We handle all the method dependency and alias mapping for you.
Mobile builds, with IE bug fixes and method compilation removed, may be created by using the mobile argument.
node build mobileCustom builds may be created in three ways:
- Use the
categoryargument to pass the categories of methods to include in the build.
Valid categories are "arrays", "chaining", "collections", "functions", "objects", and "utilities".
node build category=collections,functions
node build category="collections, functions"
node build mobile category=collections,functions- Use the
includeargument to pass the names of the methods to include in the build.
node build include=each,filter,map
node build include="each, filter, map"
node build mobile include=each,filter,map- Use the
excludeargument to pass the names of the methods to exclude from the build.
node build exclude=union,uniq,zip
node build exclude="union, uniq, zip"
node build mobile exclude=union,uniq,zipCustom builds are saved to lodash.custom.js and lodash.custom.min.js.
In browsers:
<script src="lodash.js"></script>Using npm:
npm install lodashIn Node.js and RingoJS v0.8.0+:
var _ = require('lodash');In Narwhal and RingoJS v0.7.0-:
var _ = require('lodash')._;In Rhino:
load('lodash.js');In an AMD loader like RequireJS:
require({
'paths': {
'underscore': 'path/to/lodash'
}
},
['underscore'], function(_) {
console.log(_.VERSION);
});To clone this repository including all submodules, using Git 1.6.5 or later:
git clone --recursive https://github.com/bestiejs/lodash.git
cd lodash.jsFor older Git versions, just use:
git clone https://github.com/bestiejs/lodash.git
cd lodash
git submodule update --init- Allow iteration of objects with a
lengthproperty [#148, #154, #252, #448, test] - Ensure array-like objects with invalid
lengthproperties are treated like regular objects [test, test, test] - Ensure
_(...)returns passed wrapper instances [test] - Ensure
_.groupByadds values to own, not inherited, properties [test] - Ensure
_.sortedIndexsupports arrays with highlengthvalues [test] - Ensure
_.throttleworks when called in tight loops [#502, test] - Fix Firefox, IE, Opera, and Safari object iteration bugs [#376, test, test, test, test, test, test]
- Handle arrays with
undefinedvalues correctly in IE < 9 [#601] - Methods should work on pages with incorrectly shimmed native methods [#7, test]
- Register as AMD module, but still export to global [#431, test]
_.forEachshould be chainable [#142, test]_isNaN(new Number(NaN))should returntrue[test]_.reduceRightshould pass correct callback arguments when iterating objects [test]_.sizeshould return thelengthof string values [test]
_.bind_.bindAll_.clone_.compact_.contains,_.include_.defaults_.defer_.difference_.each_.escape_.every,_.all_.extend_.filter,_.select_.find,_.detect_.flatten_.forEach,_.each_.functions,_.methods_.groupBy_.indexOf_.intersection_.invoke_.isEmpty_.isEqual_.isFinite_.isObject_.isString_.keys_.lastIndexOf_.map,_.collect_.max_.memoize_.min_.mixin_.pick_.pluck_.reduce,_.foldl,_.inject_.reject_.result_.shuffle_.some,_.any_.sortBy_.sortedIndex_.template_.throttle_.times_.toArray_.union_.uniq,_.unique_.values_.without_.wrap_.zip- plus all
_(...)method wrappers
- Added
categorybuild option - Added
fromIndexargument to_.indexOfand_.lastIndexOf - Added
//@ sourceURLsupport to_.template - Added
thisArgargument to_.sortedIndexand_.uniq - Added
_.forInand_.forOwnmethods - Ensured array-like objects with invalid
lengthproperties are treated like regular objects - Ensured
_.sortedIndexsupports arrays with highlengthvalues - Fixed
prototypeproperty iteration bug in_.keysfor Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1 - Optimized
_.timesandthisbindings in iterator methods
- Added
mobilebuild option - Ensured
_.findreturnsundefinedfor unmatched values - Ensured
_.templateSettings.variableis compatible with Underscore.js - Optimized
_.escape - Reduced dependencies in
_.find
- Adjusted the Lo-Dash export order for r.js
- Ensured
_.groupByvalues are added to own, not inherited, properties - Made
_.bindfollow ES5 spec to support a popular Backbone.js pattern - Removed the alias
intersect - Simplified
_.bind,_.flatten,_.groupBy,_.max, and_.min
- Added custom build options
- Added default
_.templateSettings.variablevalue - Added "lazy bind" support to
_.bind - Added native method overwrite detection to avoid bad native shims
- Added support for more AMD build optimizers and aliasing as the "underscore" module
- Added
thisArgargument to_.groupBy - Added whitespace to compiled strings
- Added
_.partialmethod - Commented the
iterationFactoryoptions object - Ensured
_(...)returns passed wrapper instances - Ensured
_.maxand_.minsupport extremely large arrays - Ensured
_.throttleworks in tight loops - Fixed IE < 9
[DontEnum]bug and Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1’sprototypeproperty iteration bug - Inlined
_.isFunctioncalls. - Made
_.debounce’ed functions match_.throttle’ed functions’ return value behavior - Made
_.escapeno longer translate the ">" character - Fixed
clearTimeouttypo - Simplified all methods in the "Arrays" category
- Optimized
_.debounce,_.escape,_.flatten,_.forEach,_.groupBy,_.intersection,_.invoke,_.isObject,_.max,_.min,_.pick,_.shuffle,_.sortedIndex,_.template,_.throttle,_.union,_.uniq
- Initial release
Lo-Dash is part of the BestieJS "Best in Class" module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.