0216tool_xiaoye
Version:
叶永洁自定义工具函数库
101 lines (87 loc) • 3.44 kB
JavaScript
/**
* 实现深拷贝
1). 大众乞丐版
问题1: 函数属性会丢失
问题2: 循环引用会出错
2). 面试基础版本
解决问题1: 函数属性还没丢失
3). 面试加强版本
解决问题2: 循环引用正常
思路:
目标:--同一个数组/对象才能被创建一次
创建拷贝对象前:如果拷贝的对象已经存在,直接返回
创建拷贝对象后:保存拷贝的对象
缓存的容器结构 : Map -->key:target,value :cloneTarget
4). 面试加强版本2(优化遍历性能)
数组: while | for | forEach() 优于 for-in | keys()&forEach()
对象: for-in 与 keys()&forEach() 差不多
*/
export function deepClone1 (target){
return JSON.parse(JSON.stringify(target))
}
export function deepClone2 (target){
if ( Array.isArray(target) || ( target !== null && typeof target === 'object' )){
let cloneTarget = Array.isArray(target) ? [] : {}
for (const key in target) {
if ( target.hasOwnProperty(key)) {
cloneTarget[key] = deepClone2(target[key])
}
}
return cloneTarget
}else{
return target
}
}
export function deepClone3 (target,map = new Map()){
if ( Array.isArray(target) || ( target !== null && typeof target === 'object' )){
//从map容器中获取拷贝的对象,如果已经存在,直接结束
let cloneTarget = map.get(target)
if (cloneTarget){
return cloneTarget
}
cloneTarget = Array.isArray(target) ? [] : {}
//将拷贝的对象保存到map容器中
map.set(target,cloneTarget)
for (const key in target) {
if ( target.hasOwnProperty(key)) {
//递归调用的同时,传入map容器,当拷贝过一次的对象就不再重复拷贝!
cloneTarget[key] = deepClone3(target[key],map)
}
}
return cloneTarget
}else{
return target
}
}
export function deepClone4 (target,map = new Map()){
if ( Array.isArray(target) || ( target !== null && typeof target === 'object' )){
//从map容器中获取拷贝的对象,如果已经存在,直接结束
let cloneTarget = map.get(target)
if (cloneTarget){
return
}
if ( Array.isArray(target) ){
//数组->使用forEach效率高
cloneTarget = []
//将拷贝的对象保存到map容器中
map.set(target,cloneTarget)
target.forEach((item,index) => {
cloneTarget[item] = deepClone4(target[item],map)
});
return cloneTarget
}else{
cloneTarget = {}
map.set(target,cloneTarget)
//对象->使用for...in
for (const key in target) {
if ( target.hasOwnProperty(key)) {
//递归调用的同时,传入map容器,当拷贝过一次的对象就不再重复拷贝!
cloneTarget[key] = deepClone4(target[key],map)
}
}
return cloneTarget
}
}else{
return target
}
}