-
Notifications
You must be signed in to change notification settings - Fork 7.1k
Migrating
Jordi Salvat i Alabart edited this page Jul 11, 2023
·
9 revisions
When migrating from Underscore to Lodash there are several differences to be aware of.
Below are some of the ones that stand out. For a more thorough guide check out
lodash-codemods,
eslint-plugin-lodash & Underscore to Lodash Converter.
- Underscore
_.any
is Lodash_.some
- Underscore
_.all
is Lodash_.every
- Underscore
_.compose
is Lodash_.flowRight
- Underscore
_.contains
is Lodash_.includes
- Underscore
_.each
doesn’t allow exiting by returningfalse
is Lodash_.forEach
- Underscore
_.escape
escapes backtick characters ('`'), while Lodash does not - Underscore
_.findWhere
is Lodash_.find
- Underscore
_.flatten
is deep by default while Lodash is shallow - Underscore
_.groupBy
's iteratee receives the argumentsvalue
,indexNumber
, andoriginalCollection
, while Lodash_.groupBy
's iteratee receives only the argumentvalue
- Underscore
_.indexOf
with 3rd parameterundefined
is Lodash_.indexOf
- Underscore
_.indexOf
with 3rd parametertrue
is Lodash_.sortedIndexOf
- Underscore
_.indexBy
is Lodash_.keyBy
- Underscore
_.invoke
is Lodash_.invokeMap
- Underscore
_.mapObject
is Lodash_.mapValues
- Underscore
_.max
combines Lodash_.max
&_.maxBy
- Underscore
_.min
combines Lodash_.min
&_.minBy
- Underscore
_.sample
combines Lodash_.sample
&_.sampleSize
- Underscore
_.object
combines Lodash_.fromPairs
and_.zipObject
- Underscore
_.omit
by a predicate is Lodash_.omitBy
- Underscore
_.pairs
is Lodash_.toPairs
- Underscore
_.pick
by a predicate is Lodash_.pickBy
- Underscore
_.pluck
is Lodash_.map
- Underscore
_.sortedIndex
with an iteratee is Lodash_.sortedIndexBy
, which doesn't take a 4th (context) parameter. - Underscore
_.uniq
by aniteratee
is Lodash_.uniqBy
._.uniq
with theisSorted
parameter = true is Lodash_.sortedUniq
(or Lodash_.sortedUniqBy
when using an iteree). - Underscore
_.unique
alias for_.uniq
does not exist in Lodash - Underscore
_.where
is Lodash_.filter
- Underscore
_.isFinite
doesn’t align withNumber.isFinite
(e.g._.isFinite('1')
returnstrue
in Underscore butfalse
in Lodash) - Underscore
_.matches
shorthand doesn’t support deep comparisons
(e.g._.filter(objects, { 'a': { 'b': 'c' } })
) - Underscore ≥ 1.7 & Lodash
_.template
syntax is_.template(string, option)(data)
- Lodash
_.memoize
caches areMap
like 89F4 objects - Lodash doesn’t support a
context
argument for many methods in favor of_.bind
- Lodash supports implicit chaining, lazy chaining, & shortcut fusion
- Lodash split its overloaded
_.head
,_.last
,_.rest
, &_.initial
out into
_.take
,_.takeRight
,_.drop
, &_.dropRight
(i.e._.head(array, 2)
in Underscore is_.take(array, 2)
in Lodash)
Lodash works great with Backbone. It’s even run against Backone’s unit tests on every commit.
You can replace Underscore with Lodash in Backbone by using an AMD loader, browserify, or webpack.
Note: Lodash v4 works with Backbone ≥ v1.3.0.
- Using AMD “paths” configuration
require({
'paths' {
'backbone': 'path/to/backbone',
'jquery': 'path/to/jquery',
'underscore': 'path/to/lodash'
}
}, ['backbone'], function(Backbone) {
// use Backbone
});
- Using the aliasify transform for browserify by adding a section to your package.json
{
"browserify": {
"transform": ["aliasify"]
},
"aliasify": {
"aliases": {
"underscore": "lodash"
}
}
}
and executing browserify with the aliasify
parameter
$ browserify entry.js --global-transform aliasify -o out.js
- Using the resolve.alias configuration in webpack
module.exports = {
'resolve': {
'alias': {
'underscore': 'absolute/path/to/lodash'
}
}
};
Maintained by the core team with help from our contributors.