广度优先遍历和深度优先遍历应用——实现对象深拷贝
function getEmpty(obj) {
if (Object.prototype.toString.call(obj) === '[object Object]') {
return {};
} else if (Object.prototype.toString.call(obj) === '[object Array]') {
return [];
}
return obj;
}
function bfsCopy(origin) {
let queue = [];
let map = new Map();
let ans = getEmpty(origin);
if (ans !== origin) {
queue.push([origin, ans]);
map.set(origin, ans);
}
while (queue.length) {
let [ori, ans] = queue.shift();
for (let key in ori) {
if (map.get(ori[key])) {
ans[key] = map.get(ori[key]);
continue;
}
ans[key] = getEmpty(ori[key]);
if (ans[key] !== ori[key]) {
queue.push(ori[key]);
map.set(ori[key], ans[key]);
}
}
}
return ans;
}
dfsCopy1.prototype.map = new Map();
function dfsCopy1(origin) {
let ans = getEmpty(origin);
dfsCopy1.prototype.map.set(origin, ans);
if (ans === origin) {
return ans;
}
for (let key in origin) {
if (dfsCopy1.prototype.map.get(origin[key])) {
ans[key] = dfsCopy1.prototype.map.get(origin[key]);
continue;
}
ans[key] = dfsCopy1(origin[key]);
}
return ans;
}
function dfsCopy2(origin) {
let stack = [];
let map = new Map();
let ans = getEmpty(origin);
if (ans === origin) return ans;
stack.push([origin, ans]);
while (stack.length) {
let [childori, childans] = stack.pop();
for (let key in childori) {
if (map.get(childori[key])) {
childans[key] = childori[key];
continue;
}
childans[key] = getEmpty(childori[key]);
if (childans[key] !== childori[key]) {
stack.push([childori[key], childans[key]]);
map.set(childori[key], childans[key]);
}
}
}
return ans;
}
let obj = {
a: 2,
b: {
c: 3
}
}
obj.b.d = obj;
console.log(bfsCopy(obj.b.d.a));