index.js
import _assign from './object-assign-deep';
export default function assign(target, isCloneDeep = false, ...sources) {
if (!isObject(target)) {
throw new Error('target must be a Object');
}
for (const source of sources) {
if (isObject(source)) {
_assign(target, source, isCloneDeep);
}
}
return target;
}
object-assign-deep.js
import { cloneDeep } from 'lodash';
export default function _assign(target, source, isCloneDeep = false) {
if (!isObject(source)) return target;
const keys = Object.keys(target);
for (const key of keys) {
const targetValue = target[key];
const sourceValue = source?.[key];
if (isObject(targetValue)) {
_assign(targetValue, sourceValue);
} else if (Object.hasOwnProperty.call(source, key)) {
target[key] = isCloneDeep ? cloneDeep(sourceValue) : sourceValue;
}
}
return target;
}
isObject.js
export default function isObject(target) {
return {}.toString.call(target) === '[object Object]';
}