I know this is a bit of an old issue but the easiest solution in ES2015/ES6 I could come up with was actually quite simple, using Object.assign(),

Hopefully this helps:

/**
 * Simple object check.
 * @param item
 * @returns {boolean}
 */
export function isObject(item) {
  return (item && typeof item === 'object' && !Array.isArray(item));
}

/**
 * Deep merge two objects.
 * @param target
 * @param ...sources
 */
export function mergeDeep(target, ...sources) {
  if (!sources.length) return target;
  const source = sources.shift();

  if (isObject(target) && isObject(source)) {
    for (const key in source) {
      if (isObject(source[key])) {
        if (!target[key]) Object.assign(target, { [key]: {} });
        mergeDeep(target[key], source[key]);
      } else {
        Object.assign(target, { [key]: source[key] });
      }
    }
  }

  return mergeDeep(target, ...sources);
}

Example usage:

mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});  
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }

You'll find an immutable version of this in the answer below.

Note that this will lead to infinite recursion on circular references. There's some great answers on here on how to detect circular references if you think you'd face this issue.

Answer from Salakar on Stack Overflow
🌐
npm
npmjs.com › package › deepmerge
deepmerge - npm
March 16, 2023 - A library for deep (recursive) merging of Javascript objects. Latest version: 4.3.1, last published: 4 years ago. Start using deepmerge in your project by running `npm i deepmerge`. There are 12710 other projects in the npm registry using deepmerge.
      » npm install deepmerge
    
Published: Mar 16, 2023
Version: 4.3.1
🌐
npm
npmjs.com › package › deep-merge
deep-merge - npm
var merge = DeepMerge(function (a, b) { return b · }) var obj = merge([ { a: "a" }, { b: "b" }, { c: { d: "d" } }, { c: { e: "e" } } ]) assert.deepEqual(obj.c, { d: "d", e: "e" }) npm install deep-merge · Raynos · none · npm i deep-merge · github.com/Raynos/deep-merge ·
      » npm install deep-merge
    
Published: Nov 22, 2014
Version: 1.0.0
🌐
npm
npmjs.com › package › deepmerge-ts
deepmerge-ts - npm
August 21, 2026 - Tidelift is working with the maintainers of deepmerge-ts and a growing network of open source maintainers to ensure your open source software supply chain meets enterprise standards now and into the future. Learn more. # Install with npm npm install deepmerge-ts # Install with pnpm pnpm add deepmerge-ts # Install with yarn yarn add deepmerge-ts # Install with bun bun add deepmerge-ts
      » npm install deepmerge-ts
    
Published: Aug 21, 2026
Version: 8.0.2
🌐
GitHub
github.com › TehShrike › deepmerge
GitHub - TehShrike/deepmerge: A library for deep (recursive) merging of Javascript objects · GitHub
npm install deepmerge · deepmerge can be used directly in the browser without the use of package managers/bundlers as well: UMD version from unpkg.com. deepmerge exposes a CommonJS entry point: const merge = require('deepmerge') The ESM entry point was dropped due to a Webpack bug.
🌐
npm
npmjs.com › package › @75lb › deep-merge
@75lb/deep-merge - npm
May 13, 2026 - import deepMerge from './node_modules/@75lb/deep-merge/dist/index.mjs' © 2018-26 Lloyd Brookes <opensource@75lb.com>. merge · deep merge · array · object · merge · options · npm i @75lb/deep-merge · github.com/75lb/deep-merge · github.com/75lb/deep-merge#readme ·
      » npm install @75lb/deep-merge
    
Published: Oct 14, 2026
Version: 1.1.5
🌐
npm
npmjs.com › package › ts-deepmerge
ts-deepmerge - npm
May 22, 2026 - A TypeScript deep merge function.. Latest version: 8.0.0, last published: 4 months ago. Start using ts-deepmerge in your project by running `npm i ts-deepmerge`. There are 369 other projects in the npm registry using ts-deepmerge.
      » npm install ts-deepmerge
    
Published: May 22, 2026
Version: 8.0.0
Top answer
1 of 15
317

I know this is a bit of an old issue but the easiest solution in ES2015/ES6 I could come up with was actually quite simple, using Object.assign(),

Hopefully this helps:

/**
 * Simple object check.
 * @param item
 * @returns {boolean}
 */
export function isObject(item) {
  return (item && typeof item === 'object' && !Array.isArray(item));
}

/**
 * Deep merge two objects.
 * @param target
 * @param ...sources
 */
export function mergeDeep(target, ...sources) {
  if (!sources.length) return target;
  const source = sources.shift();

  if (isObject(target) && isObject(source)) {
    for (const key in source) {
      if (isObject(source[key])) {
        if (!target[key]) Object.assign(target, { [key]: {} });
        mergeDeep(target[key], source[key]);
      } else {
        Object.assign(target, { [key]: source[key] });
      }
    }
  }

  return mergeDeep(target, ...sources);
}

Example usage:

mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});  
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }

You'll find an immutable version of this in the answer below.

Note that this will lead to infinite recursion on circular references. There's some great answers on here on how to detect circular references if you think you'd face this issue.

2 of 15
253

You can use Lodash merge:

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};

var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
};

console.log(_.merge(object, other));
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

🌐
GitHub
github.com › fastify › deepmerge
GitHub - fastify/deepmerge: Merges the enumerable properties of two or more objects deeply. Fastest implementation of deepmerge · GitHub
@fastify/deepmerge: merge regex ... two flat objects x 15,571,029 ops/sec ±0.45% (96 runs sampled) @fastify/deepmerge: merge nested objects x 7,601,328 ops/sec ±0.31% (96 runs sampled) npm run bench:compare - comparison of @fastify/deepmerge with other popular deepmerge ...
🌐
npm
npmjs.com › package › object-deep-merge
object-deep-merge - npm
October 20, 2025 - Strongly-typed deep and recursive object merging. Considers all nested levels of objects, arrays, sets and maps.. Latest version: 2.0.1, last published: 13 hours ago. Start using object-deep-merge in your project by running `npm i object-deep-merge`. There are 5 other projects in the npm registry using object-deep-merge.
      » npm install object-deep-merge
    
Published: May 19, 2026
Version: 2.0.1
Find elsewhere
🌐
npm
npmjs.com › search
deepmerge - npm search
The Gov IE design system deepmerge utility.
🌐
npm
npmjs.com › package › @trojs › deep-merge
@trojs/deep-merge - npm
npm i @trojs/deep-merge · import { deepMerge } from '@hcklrnews/deep-merge'; const obj1 = { a: 1, b: 1, c: { x: 1, y: 1 }, d: [1, 1] } const obj2 = { b: 2, c: { y: 2, z: 2 }, d: [2, 2], e: 2 } const result = deepMerge(obj1, obj2) const expectedResult = { a: 1, b: 2, c: { x: 1, y: 2, z: 2 }, d: [1, 1, 2, 2], e: 2 } object ·
      » npm install @trojs/deep-merge
    
Published: Feb 06, 2026
Version: 1.1.7
🌐
npm
npmjs.com › package › deepmerge-plus
deepmerge-plus - npm
A library for deep (recursive) merging of Javascript objects. Latest version: 3.0.2, last published: 2 years ago. Start using deepmerge-plus in your project by running `npm i deepmerge-plus`. There are 9 other projects in the npm registry using ...
      » npm install deepmerge-plus
    
Published: Nov 16, 2023
Version: 3.0.2
Author: Nick Fisher
🌐
deps.dev
deps.dev › npm › ts-deepmerge
ts-deepmerge | npm
You need to enable JavaScript to run this app
🌐
Open Apps Pro
openapps.pro › packages › deepmerge-npm
@fastify/deepmerge: Fast Deep Object Merging for Node.js
February 19, 2026 - The fastest deepmerge implementation for merging JavaScript objects without mutating the originals. Library · npm · v3.2.1 · 128 stars · MIT License · View Source Visit Website · On This Page · Pre-computed score based on development activity, maintenance, community, maturity, and trend momentum.
🌐
npm
npmjs.com › package › deepmerge-json
deepmerge-json - npm
August 2, 2022 - A library to deep merge json files with array operations. Latest version: 1.5.0, last published: 3 years ago. Start using deepmerge-json in your project by running `npm i deepmerge-json`. There are 22 other projects in the npm registry using ...
      » npm install deepmerge-json
    
Published: Aug 02, 2022
Version: 1.5.0
Author: Kleber Silva
🌐
npm
npmjs.com › package › merge-deep
merge-deep - npm
Recursively merge values in a javascript object.. Latest version: 3.0.3, last published: 6 years ago. Start using merge-deep in your project by running `npm i merge-deep`. There are 331 other projects in the npm registry using merge-deep.
      » npm install merge-deep
    
Published: Jan 11, 2021
Version: 3.0.3
🌐
npm Trends
npmtrends.com › deep-merge-vs-deepmerge-vs-ts-deepmerge
deep-merge vs deepmerge vs ts-deepmerge | npm trends
Comparing trends for deep-merge 1.0.0 which has 829 weekly downloads and 17 GitHub stars vs. deepmerge 4.3.1 which has 89,614,078 weekly downloads and 2,819 GitHub stars vs. ts-deepmerge 8.0.0 which has 3,536,831 weekly downloads and 148 GitHub stars.
🌐
Npm
npm.io › package › deepmerge
Deepmerge NPM | npm.io
Check Deepmerge 4.3.1 package - Last release 4.3.1 with MIT licence at our NPM packages aggregator and search engine.