react-universally
Version:
A starter kit for universal react applications.
36 lines (34 loc) • 865 B
JavaScript
import removeNil from '../arrays/removeNil';
/**
* Deeply merges a given set of objects together.
*
* Objects to the right take priority.
*
* @param {...Object} args - The objects to merge.
*
* @return {Object} - The merged object.
*/
export default function mergeDeep(...args) {
const filtered = removeNil(args);
if (filtered.length < 1) {
return {};
}
if (filtered.length === 1) {
return args[0];
}
return filtered.reduce(
(acc, cur) => {
Object.keys(cur).forEach((key) => {
if (typeof acc[key] === 'object' && typeof cur[key] === 'object') {
// eslint-disable-next-line no-param-reassign
acc[key] = mergeDeep(acc[key], cur[key]);
} else {
// eslint-disable-next-line no-param-reassign
acc[key] = cur[key];
}
});
return acc;
},
{},
);
}