js-wrench
Version:
JS函数库
35 lines (34 loc) • 1.24 kB
text/typescript
import isArray from './isArray'
import isDate from './isDate';
import isRegExp from './isRegExp';
/**
* @description 对象深拷贝
* 来源Vuex https://github.com/vuejs/vuex/blob/dev/src/util.js 解决了循环引用问题
* 对其深度拷贝进行二次优化, 添加Date其他类型的判断 {time:new Date(), regexp:/\w+/}
* @param {*} obj 要进行拷贝的源数据
* @param {Array<any>} [cache=[]] 利用数组存储已经拷贝过的数据, 每次拷贝会从cache中查询有没有拷贝过
* @return {*} {*} 返回拷贝的数据
* @example deepCopy({age:12, time:new Date(), regexp:/\w+/, fn:function(){}}, [])
*/
const deepCopy = (obj: any, cache: Array<any> = []): any => {
if (obj === null || typeof obj !== 'object') return obj
let hit: any = cache.filter(function (c) {
return c.original === obj
})[0]
if (hit) return hit.copy
let copy:any;
//添加Date和RegExp类型
if(isDate(obj)) copy = new Date(obj);
else if(isRegExp(obj)) copy = new RegExp(obj);
else if (isArray(obj)) copy = []
else copy = {}
cache.push({
original: obj,
copy,
})
Object.keys(obj).forEach((key) => {
copy[key] = deepCopy(obj[key], cache)
})
return copy
}
export default deepCopy