UNPKG

js-utils-chs

Version:

自定义工具函数库

83 lines (78 loc) 2.53 kB
/** * 对象深度克隆 * @param {any} target * @param {Map()} map * @returns any */ /** * 测试数据 const obj1 = { a: 1, b: ['e', 'f', 'g'], c: { h: { i: 2 } }, d: function () { } } obj1.b.push(obj1.c) obj1.c.j = obj1.b let datas = deepClone(obj1); */ export function deepClone(target, map = new Map()) { if (target !== null && typeof target === 'object') { // 从缓存容器中读取克隆对象 let cloneTarget = map.get(target) // 如果存在, 返回前面缓存的克隆对象 if (cloneTarget) { return cloneTarget } // 创建克隆对象(可能是{}或者[]) if (target instanceof Array) { cloneTarget = [] // 缓存到map中 map.set(target, cloneTarget) target.forEach((item, index) => { cloneTarget[index] = deepClone(item, map) }) } else { cloneTarget = {} // 缓存到map中 map.set(target, cloneTarget) Object.keys(target).forEach(key => { cloneTarget[key] = deepClone(target[key], map) }) } return cloneTarget } return target } /** * 对象深度合并 * @param {Object} target * @param {Object} soutce */ export function deepMege(target = {}, soutce = {}) { if (typeof target !== 'object' || typeof soutce !== 'object') return false; target = deepClone(target); for (let prop in soutce) { if (!soutce.hasOwnProperty(prop)) continue; if (prop in target) { if (typeof target[prop] !== 'object') { target[prop] = soutce[prop]; } else { if (typeof soutce[prop] !== "object") { target[prop] = soutce[prop]; } else { // 判断是不是数组,是数组就合并数组 if (target[prop].concat && soutce[prop].concat) { target[prop] = target[prop].concat(soutce[prop]) } else { // 如果都是对象,递归合并 target[prop] = deepMege(target[prop], soutce[prop]); } } } } else { target[prop] = soutce[prop] } } return target }