7

Lazy-me is wondering if there a better way to copy the properties in one object (source) over to another object (destination) only if the properties exist in the latter? It does not necessarily have to be using Underscore.

For example,

_.mixin({ assign: function (o, destination, source) { for (var property in source) { if (destination.hasOwnProperty(property)) { destination[property] = source[property]; } } return destination; } }); console.log( _().assign({ a: 1, b: 2, d: 3 }, { a: 4, c: 5 }) ) // a: 4, b: 2, d: 3 
1

2 Answers 2

6

Use Object.assign(obj1, obj2); (if the properties exist in the latter) which is native in ES6 (no underscore.js is required).

The Object.assign() method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object. More info here.

Example:

var o1 = { a: 1 }; var o2 = { b: 2 }; var o3 = { c: 3 }; var obj = Object.assign(o1, o2, o3); console.log(obj);

Alternatively use undescore.js

_.extend(destination, *sources)

or

_.extendOwn(destination, *sources)

Detailated information can be found here: http://underscorejs.org/#extend

Sign up to request clarification or add additional context in comments.

2 Comments

"... only if the properties exist in the latter".
@Vohuman thanks for your comment I have edit a note in my answer for reference.
4

One lazy option is:

_.extend(a, _.pick(b, _.keys(a))); 

_.pick filters the source object by using the .keys of the destination object and the result is used for extending the destination object.

If you don't want to modify the original objects just pass an empty object to the _.extend function.

_.extend({}, a, _.pick(b, _.keys(a))); 

1 Comment

Haha, shorter but ugly.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.