function isPlainObject(value) { if (value == null || typeof value !== 'object') return false return Object.getPrototypeOf(value) === Object.prototype } function copy(obj, key, value) { if (isPlainObject(value)) { obj[key] || (obj[key] = {}) deepExtend(obj[key], value) } else { obj[key] = value } } export function deepExtend(target, source) { if (isPlainObject(source)) { const keys = Object.keys(source) for (let i = 0, len = keys.length; i < len; i++) { copy(target, keys[i], source[keys[i]]) } } return target }