抽取方法
function getEmpty(o) {
if(Object.prototype.toString.call(o) === '[object Object]'){
return {};
}
if(Object.prototype.toString.call(o) === '[object Array]'){
return [];
}
return o;
}
深度优先
function deepCopyDFS(origin){
var target = getEmpty(origin);
if(target !== origin){
for(let key in origin){
target[key] = deepCopyDFS(origin[key]);
}
}
return target;
}
广度优先
function deepCopyBFS(origin) {
let queue = [];
// let map = new Map();
let target = getEmpty(origin);
if(target !== origin){
queue.push([origin, target]);
// map.set(origin, target)
}
while(queue.length) {
let [ori, tar] = queue.shift();
for(let key in ori) {
//处理环状
// if(map.get(ori[key])){
// tar[key] = map.get(ori[key]);
// continue;
// }
tar[key] = getEmpty(ori[key]);
if(tar[key] !== ori[key]){
queue.push([ori[key], tar[key]]);
// map.set(ori[key], tar[key])
}
}
}
return target;
}
测试代码:
var a = {
reg: /^[a-z][0-9]$/,
fn: () => {
console.log("I am a function");
},
array: [1,2,3,4],
string: 'I am a string'
}
//const b = JSON.parse(JSON.stringify(a)) //存在问题
const b = deepClone(a);
a.array[0] = 6;
console.log(a, b);