Syntax, Parameter and Return Value
Syntax:
_.extendWith(target, ...sources, customizer)
Parameters:
-
target (Object): The destination object.
-
...sources (Object): The source objects.
- customizer (Function): The function used to customize assigned values.
Return Value:
(Object) - Returns the modified target object.
Examples
Customizing Property Assignment:
JavaScript
var _ = require('lodash');
function customizer(objValue, srcValue) {
if (_.isArray(objValue)) {
return objValue.concat(srcValue);
}
}
var object = { 'a': [1], 'b': [2] };
var other = { 'a': [3], 'b': [4] };
_.extendWith(object, other, customizer);
console.log(object);

You can also try this code with Online Javascript Compiler
Run Code
Output:
{ 'a': [1, 3], 'b': [2, 4] }
Demonstrates using a customizer function to concatenate array values from source objects.
Handling Property Conflicts:
JavaScript
var target = { 'prop1': 'value1' };
var source = { 'prop1': 'value2', 'prop2': 'value3' };
_.extendWith(target, source, (objVal, srcVal) => {
return objVal ? objVal : srcVal;
});
console.log(target);

You can also try this code with Online Javascript Compiler
Run Code
Output:
{ 'prop1': 'value1', 'prop2': 'value3' }
Shows how to handle property conflicts by preferring the target object's value.
Transforming Assigned Values:
JavaScript
var target = { 'x': 10, 'y': 20 };
var source = { 'x': 5, 'z': 15 };
_.extendWith(target, source, (objVal, srcVal) => {
return objVal * srcVal;
});
console.log(target);

You can also try this code with Online Javascript Compiler
Run Code
Output:
{ 'x': 50, 'y': 20, 'z': 15 }
An example of transforming values during assignment by multiplying them.
Merging Objects with Priority:
JavaScript
var base = { 'name': 'John', 'age': 30 };
var changes = { 'name': 'Jane', 'age': 25 };
_.extendWith(base, changes, (baseVal, changeVal) => baseVal);
console.log(base);

You can also try this code with Online Javascript Compiler
Run Code
Output:
{ 'name': 'John', 'age': 30 }
Demonstrates prioritizing the base object's properties over changes.
Frequently Asked Questions
How does _.extendWith() differ from _.assignWith()?
While _.assignWith() only copies an object's own properties, _.extendWith() (or _.assignInWith()) copies both own and inherited properties from the prototype chain.
Is _.extendWith() suitable for deep merging of objects?
_.extendWith() performs a shallow merge. For deep merging, a method like _.mergeWith() should be used.
What happens in case of property name conflicts?
If multiple source objects have properties with the same name, _.extendWith() will overwrite the property in the target object with the last source's value for that property, unless the customizer function specifies otherwise.
Conclusion
Lodash's _.extendWith() method is a powerful tool for merging properties from source objects into a target object, including inherited properties, with the added flexibility of a customizer function. It's particularly valuable in complex scenarios where standard object merging is not sufficient and specific rules need to be applied for property assignment.
You can refer to our guided paths on the Coding Ninjas. You can check our course to learn more about DSA, DBMS, Competitive Programming, Python, Java, JavaScript, etc.
Also, check out some of the Guided Paths on topics such as Data Structure and Algorithms, Competitive Programming, Operating Systems, Computer Networks, DBMS, System Design, etc., as well as some Contests, Test Series, and Interview Experiences curated by top Industry Experts.