Skip to content

Instantly share code, notes, and snippets.

@ambar
Last active January 29, 2021 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ambar/4ba1fef4b18e8aba48e96be305242c03 to your computer and use it in GitHub Desktop.
Save ambar/4ba1fef4b18e8aba48e96be305242c03 to your computer and use it in GitHub Desktop.
deep merge

Comparison

name immutable concat dedupe clone multiple parameters recommended
merge-deep@3.0.2 true true true true yes yes
deepmerge@3.0.0 true true false false(option) no
lodash/mege false false false true yes
lodash/megeWith false false false true yes yes

Usage

merge-deep:

mergeDeep(...objects)

deepmerge:

deepmerge(a, b, {clone: false})
deepmerge.all([a, b, c], {clone: false})

lodash:

const concatMerge = (...args) => mergeWith({}, ...args, (dest, src) => {
  if (Array.isArray(dest)) {
    return dest.concat(src)
  }
})
const mergeDeep = require('merge-deep')
const deepMerge = require('deepmerge')
const merge = require('lodash/merge')
const mergeWith = require('lodash/mergeWith')
const partialRight = require('lodash/partialRight')
const concatMerge = partialRight(mergeWith, (prev, next) => {
if (Array.isArray(prev)) {
return prev.concat(next)
}
})
class Plugin {
constructor(props) {
Object.assign(this, props)
}
}
const test = (merge, name) => {
const dest = {foo: [1, 2], plugins: [new Plugin({a: 1})]}
const src = {foo: [1, 3], plugins: [new Plugin({a: 2})]}
const result = merge(dest, src)
const immutable = result !== dest
return {
name,
immutable,
concat: result.foo.length >= 3,
dedupe: result.foo.length === 3,
clone: result.plugins.every(plugin => plugin instanceof Plugin),
result: JSON.stringify(result),
}
}
console.info([
test(mergeDeep, 'mergeDeep'),
test(deepMerge, 'deepMerge'),
test(merge, 'lodash/merge'),
test(mergeWith, 'lodash/mergeWith'),
// custom
test(concatMerge, 'lodash/mergeWith --concat'),
test((...args) => deepMerge(...args, {clone: false}), 'deepMerge --no-clone'),
])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment