/** * 深度合并代码,思路来自 zepto.js 源代码 * 切记不要对象递归引用,否则会陷入递归跳不出来,导致堆栈溢出 * 作用是会合并 target 和 other 对应位置的值,冲突的会保留 target 的值 */ export function deepMerge(target: any, other: any) { const targetToString = Object.prototype.toString.call(target); const otherToString = Object.prototype.toString.call(target); if ( targetToString === '[object Object]' && otherToString === '[object Object]' ) { for (let [key, val] of Object.entries(other)) { if (!target[key]) { target[key] = val; } else { target[key] = deepMerge(target[key], val); } } } else if ( targetToString === '[object Array]' && otherToString === '[object Array]' ) { for (let [key, val] of Object.entries(other)) { if (target[key]) { target[key] = deepMerge(target[key], val); } else { target.push(val); } } } return target; }