Toggle navigation
MeasureThat.net
Create a benchmark
Tools
Feedback
FAQ
Register
Log In
lodash vs deepmerge vs deepmerge-ts vs @fasify/deepmerge
(version: 1)
2025 version
Comparing performance of:
lodash vs deepmerge vs deepmerge-ts vs @fasify/deepmerge
Created:
10 months ago
by:
Guest
Jump to the latest result
HTML Preparation code:
<script src='https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.2/lodash.min.js'></script> <script src='https://unpkg.com/deepmerge@4.3.1/dist/umd.js'></script> <script type="module"> import { deepmerge } from 'https://unpkg.com/deepmerge-ts@7.1.5/dist/index.mjs'; window.deepmergeTs = deepmerge; </script>
Script Preparation code:
const JSON_PROTO = Object.getPrototypeOf({}) function defaultIsMergeableObjectFactory () { return function defaultIsMergeableObject (value) { return typeof value === 'object' && value !== null && !(value instanceof RegExp) && !(value instanceof Date) } } function deepmergeConstructor (options) { function isNotPrototypeKey (value) { return ( value !== 'constructor' && value !== 'prototype' && value !== '__proto__' ) } function cloneArray (value) { let i = 0 const il = value.length const result = new Array(il) for (i; i < il; ++i) { result[i] = clone(value[i]) } return result } function cloneObject (target) { const result = {} if (cloneProtoObject && Object.getPrototypeOf(target) !== JSON_PROTO) { return cloneProtoObject(target) } const targetKeys = getKeys(target) let i, il, key for (i = 0, il = targetKeys.length; i < il; ++i) { isNotPrototypeKey(key = targetKeys[i]) && (result[key] = clone(target[key])) } return result } function concatArrays (target, source) { const tl = target.length const sl = source.length let i = 0 const result = new Array(tl + sl) for (i; i < tl; ++i) { result[i] = clone(target[i]) } for (i = 0; i < sl; ++i) { result[i + tl] = clone(source[i]) } return result } const propertyIsEnumerable = Object.prototype.propertyIsEnumerable function getSymbolsAndKeys (value) { const result = Object.keys(value) const keys = Object.getOwnPropertySymbols(value) for (let i = 0, il = keys.length; i < il; ++i) { propertyIsEnumerable.call(value, keys[i]) && result.push(keys[i]) } return result } const getKeys = options?.symbols ? getSymbolsAndKeys : Object.keys const cloneProtoObject = typeof options?.cloneProtoObject === 'function' ? options.cloneProtoObject : undefined const isMergeableObject = typeof options?.isMergeableObject === 'function' ? options.isMergeableObject : defaultIsMergeableObjectFactory() function isPrimitive (value) { return typeof value !== 'object' || value === null } const mergeArray = options && typeof options.mergeArray === 'function' ? options.mergeArray({ clone, deepmerge: _deepmerge, getKeys, isMergeableObject }) : concatArrays function clone (entry) { return isMergeableObject(entry) ? Array.isArray(entry) ? cloneArray(entry) : cloneObject(entry) : entry } function mergeObject (target, source) { const result = {} const targetKeys = getKeys(target) const sourceKeys = getKeys(source) let i, il, key for (i = 0, il = targetKeys.length; i < il; ++i) { isNotPrototypeKey(key = targetKeys[i]) && (sourceKeys.indexOf(key) === -1) && (result[key] = clone(target[key])) } for (i = 0, il = sourceKeys.length; i < il; ++i) { if (!isNotPrototypeKey(key = sourceKeys[i])) { continue } if (key in target) { if (targetKeys.indexOf(key) !== -1) { if (cloneProtoObject && isMergeableObject(source[key]) && Object.getPrototypeOf(source[key]) !== JSON_PROTO) { result[key] = cloneProtoObject(source[key]) } else { result[key] = _deepmerge(target[key], source[key]) } } } else { result[key] = clone(source[key]) } } return result } function _deepmerge (target, source) { const sourceIsArray = Array.isArray(source) const targetIsArray = Array.isArray(target) if (isPrimitive(source)) { return source } else if (!isMergeableObject(target)) { return clone(source) } else if (sourceIsArray && targetIsArray) { return mergeArray(target, source) } else if (sourceIsArray !== targetIsArray) { return clone(source) } else { return mergeObject(target, source) } } function _deepmergeAll () { switch (arguments.length) { case 0: return {} case 1: return clone(arguments[0]) case 2: return _deepmerge(arguments[0], arguments[1]) } let result for (let i = 0, il = arguments.length; i < il; ++i) { result = _deepmerge(result, arguments[i]) } return result } return options?.all ? _deepmergeAll : _deepmerge } window.d1 = deepmergeConstructor
Tests:
lodash
var a = { a: 'oh', b: 'my', c: { a: 'a', b: { c: 'c' } } }; var b = { c: { b: { d: 'a' }, c: { d: 'd' } } }; var c = _.merge({}, a, b); const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } var z = _.merge({}, x, y);
deepmerge
var a = { a: 'oh', b: 'my', c: { a: 'a', b: { c: 'c' } } }; var b = { c: { b: { d: 'a' }, c: { d: 'd' } } }; var c = deepmerge({}, a, b); const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } var z = deepmerge({}, x, y);
deepmerge-ts
var a = { a: 'oh', b: 'my', c: { a: 'a', b: { c: 'c' } } }; var b = { c: { b: { d: 'a' }, c: { d: 'd' } } }; var c = deepmerge({}, a, b); const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } var z = deepmergeTs({}, x, y);
@fasify/deepmerge
var a = { a: 'oh', b: 'my', c: { a: 'a', b: { c: 'c' } } }; var b = { c: { b: { d: 'a' }, c: { d: 'd' } } }; var c = deepmerge({}, a, b); const x = { foo: { bar: 3 }, array: [{ does: 'work', too: [ 1, 2, 3 ] }] } const y = { foo: { baz: 4 }, quux: 5, array: [{ does: 'work', too: [ 4, 5, 6 ] }, { really: 'yes' }] } var z = d1({}, x, y);
Rendered benchmark preparation results:
Suite status:
<idle, ready to run>
Run tests (4)
Previous results
Fork
Test case name
Result
lodash
deepmerge
deepmerge-ts
@fasify/deepmerge
Fastest:
N/A
Slowest:
N/A
Latest run results:
Run details:
(Test run date:
10 months ago
)
User agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Browser/OS:
Chrome 137 on Mac OS X 10.15.7
View result in a separate tab
Embed
Embed Benchmark Result
Test name
Executions per second
lodash
211902.7 Ops/sec
deepmerge
661267.6 Ops/sec
deepmerge-ts
453555.7 Ops/sec
@fasify/deepmerge
1287412.8 Ops/sec
Related benchmarks:
Lodash vs Reduce
Lodash vs Reduce
my vs fast-deep-equal vs lodash
instancetoinstance3
deepclone vs deepfreeze
deepclone vs deepfreeze vs saferdeepclone
deepclone vs deepfreeze vs saferdeepclone2
Dexla - Lodash Merge
JSON.stringify vs structuredClone vs simple deepCopyObject
Comments
Confirm delete:
Do you really want to delete benchmark?