deepmerge icon indicating copy to clipboard operation
deepmerge copied to clipboard

When a particular property of the source object is undefined while the target one has a value, the value will be override by undefined

Open PhoenixMenia opened this issue 3 years ago • 2 comments

the below code will get a return value showed in the picture below. I dont want an invalid value to override the value of the target.

var deepmerge = require("deepmerge")

const combineMerge = (target, source, options) => { if (typeof source[0] === 'string') { return source; }

const destination = target.slice()

source.forEach((item, index) => {
    if (typeof destination[index] === 'undefined') {
        destination[index] = options.cloneUnlessOtherwiseSpecified(item, options)
    } else if (options.isMergeableObject(item)) {
        destination[index] = deepmerge(target[index], item, options)
    } else if (target.indexOf(item) === -1) {
        destination.push(item)
    }
})
return destination

}

const options = { arrayMerge: combineMerge, customMerge: (key, options) => { return undefined } }

const alex = { name: { first: 'Alex', last: 'Alexson' }, pets: ['Cat', 'Parrot'] }

const tony = { name: { first: undefined, last: 'Tonison' }, pets: ['Dog'] }

const result = deepmerge(alex, tony, options)

image

PhoenixMenia avatar Jan 19 '22 10:01 PhoenixMenia

I believe this is by design. You'd need to use define a custommerge function if you want to change this behavior.

This is also by design in my library (deepmerge-ts) but this behavior can be overridden. Here's the example of doing that: https://github.com/RebeccaStevens/deepmerge-ts/discussions/25

RebeccaStevens avatar Jan 19 '22 10:01 RebeccaStevens

这是来自QQ邮箱的假期自动回复邮件。   您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

PhoenixMenia avatar Jan 19 '22 10:01 PhoenixMenia