Search code examples
javascriptecmascript-6lodashbabeljsecmascript-2016

(_.merge in ES6/ES7)Object.assign without overriding undefined values


There is _.merge functionality in lodash. I want to achieve the same thing in ES6 or ES7.

Having this snippet:

Object.assign({}, {key: 2}, {key: undefined})

I want to receive {key: 2}. Currently I receive {key: undefined}

This is NOT a deep merge.

Is it possible? If yes then how to achieve that?


Solution

  • You can't achieve that with a straight usage of Object.assign, because each next object will rewrite the same keys for prev merge. The only way, to filter your incoming objects with some hand-crafted function.

    function filterObject(obj) {
        const ret = {};
        Object.keys(obj)
            .filter((key) => obj[key] !== undefined)
            .forEach((key) => ret[key] = obj[key]);
        return ret;
    }