Lo-Dash v0.5.0
A drop-in replacement* for Underscore.js, from the devs behind jsPerf.com, delivering performance, 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.
Download
- Development source
- Production source
- CDN copies of ≤ v0.4.2 are available on cdnjs thanks to CloudFlare
- For optimal performance, create a custom build with only the features you need
Dive in
We’ve got API docs, benchmarks, and unit tests.
Create your own benchmarks at jsPerf, or search for existing ones.
For a list of upcoming features, check out our roadmap.
Screencasts
For more information check out these screencasts over Lo-Dash:
- Introducing Lo-Dash
- Lo-Dash optimizations and custom builds
- Lo-Dash’s origin and why it’s a better utility belt
- Unit testing in Lo-Dash
Features
- AMD loader support (RequireJS, curl.js, etc.)
- _.bind supports "lazy" binding
- _.clone supports "deep" cloning
- _.countBy as a compainion function for _.groupBy and _.sortBy
- _.debounce’ed functions match _.throttle’ed functions’ return value behavior
- _.drop for the inverse functionality of _.pick
- _.forEach is chainable and supports exiting iteration early
- _.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
thisArg
argument - _.indexOf and _.lastIndexOf accept a
fromIndex
argument - _.merge for a "deep" _.extend
- _.partial for partial application without
this
binding - _.template utilizes sourceURLs for easier debugging
- _.where for filtering collections by contained properties
- _.zipObject for composing objects
- _.contains, _.size, _.toArray, and more… accept strings
Support
Lo-Dash has been tested in at least Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.4.8-0.8.7, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
Custom builds
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.
- Backbone builds, containing all methods required by Backbone, may be created using the
backbone
modifier argument.
lodash backbone
- CSP builds, supporting default Content Security Policy restrictions, may be created using the
csp
modifier argument.
lodash csp
- Legacy builds, tailored for older browsers without ES5 support, may be created using the
legacy
modifier argument.
lodash legacy
- Mobile builds, with IE < 9 bug fixes and method compilation removed, may be created using the
mobile
modifier argument.
lodash mobile
- Strict builds, with
_.bindAll
,_.defaults
, and_.extend
in strict mode, may be created using thestrict
modifier argument.
lodash strict
- Underscore builds, containing only methods included in Underscore, may be created using the
underscore
modifier argument.
lodash underscore
Custom builds may be created in three ways:
- Use the
category
argument to pass the categories of methods to include in the build.
Valid categories are "arrays", "chaining", "collections", "functions", "objects", and "utilities".
lodash category=collections,functions
lodash category="collections, functions"
- Use the
exclude
argument to pass the names of methods to exclude from the build.
lodash exclude=union,uniq,zip
lodash exclude="union, uniq, zip"
- Use the
include
argument to pass the names of methods to include in the build.
lodash include=each,filter,map
lodash include="each, filter, map"
All arguments, except backbone
with underscore
, exclude
with include
, and legacy
with csp
/mobile
, may be combined.
lodash backbone legacy category=utilities exclude=first,last
lodash underscore mobile strict category=functions include=pick,uniq
The lodash
command-line utility is available when Lo-Dash is installed as a global package (i.e. npm install -g lodash
).
Custom builds are saved to lodash.custom.js
and lodash.custom.min.js
.
Installation and usage
In browsers:
<script src="lodash.js"></script>
Using npm:
npm install lodash
npm install -g lodash
In Node.js and RingoJS v0.8.0+:
var _ = require('lodash');
In 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);
});
Resolved Underscore.js issues (20+)
- Allow iteration of objects with a
length
property [#148, #154, #252, #448, #659, test] - Ensure array-like objects with invalid
length
properties are treated like regular objects [test] - Ensure "Arrays" methods allow falsey
array
arguments [test] - Ensure "Collections" methods allow string
collection
arguments [#247, #276, #561, test] - Ensure templates compiled with errors are inspectable [#666, test]
- Fix cross-browser object iteration bugs [#60, #376, test]
- Handle arrays with
undefined
values correctly in IE < 9 [#601] - Methods should work on pages with incorrectly shimmed native methods [#7, test]
- Register as an AMD module, but still export to global [#431, test]
_(…)
should return passed wrapper instances [test]_.clone
should allowdeep
cloning [#595, test]_.contains
should work with strings [#667, test]_.escape
should return an empty string when passednull
orundefined
[#427, test]_.extend
should recursively extend objects [#379, test]_.forEach
should be chainable [#142, test]_.forEach
should allow exiting iteration early [#211, test]_.groupBy
should add values to own, not inherited, properties [test]_.isEmpty
and_.size
should support jQuery/MooTools DOM query collections [#690, test]_.isEqual
should returntrue
for like-objects from different documents [test]_.isObject
should avoid V8 bug #2291 [#605, test]_.isNaN(new Number(NaN))
should returntrue
[test]_.keys
and_.size
should work witharguments
objects cross-browser [#396, #653, test]_.once
should free the given function for garbage collection [#693]_.range
should coerce arguments to numbers [#634, #683, test]_.reduceRight
should pass correct callback arguments when iterating objects [test]_.size
should return thelength
of string values [test]_.size
shouldn’t error on falsey values [#650, test]_.sortedIndex
should support arrays with highlength
values [test]_.template
should not augment theoptions
object [test]_.throttle
should work when called in a loop [#502, test]_.zipObject
should accept less than two arguments [test]
Optimized methods (50+)
_.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
_.isArguments
_.isDate
_.isEmpty
_.isFinite
_.isFunction
_.isObject
_.isNumber
_.isRegExp
_.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
Release Notes
v0.5.0
- Added _.countBy, _.drop, _.merge, and _.where
- Added
csp
(Content Security Policy) andunderscore
build options - Added
deep
cloning support to_.clone
- Added Jam package support
- Added support for exiting
_.forEach
,_.forIn
, and_.forOwn
early by returningfalse
in thecallback
- Added support for jQuery/MooTools DOM query collections to
_.isEmpty
and_.size
- Ensured development build works with IE conditional compilation enabled
- Ensured
_.clone
doesn't clone functions, DOM nodes,arguments
objects, and objects created by constructors other thanObject
- Ensured
_.filter
’scallback
can't modify result values - Ensured
_.isEmpty
,_.isEquals
, and_.size
supportarguments
objects - Ensured
_.isEqual
doesn't inspect DOM nodes, works with objects from other documents, and calls customisEqual
methods before checking strict equality - Ensured
_.once
frees the given function for garbage collection - Ensured
_.sortBy
performs a stable sort - Ensured
reEvaluateDelimiter
is assigned when_.templateSettings.evaluate
is undefined - Made
_.range
coerce arguments to numbers - Optimized
_.isFunction
The full changelog is available here.
BestieJS
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.