js 拷贝树copytree
希望能摆脱lodash的深拷贝 🐻
const l = console.log;
/**
*
* @param tree 需要克隆的对象
* @param all 是否需要克隆不可枚举属性
*/
export function copytree(tree: any, all: boolean = true) {
const objectTag = "[object Object]";
const arrayTag = "[object Array]";
const _tostring = (value: any): string =>
Object.prototype.toString.call(value);
// 记录所有的对象
const map = new WeakMap();
function copyTree(tree: any, all: boolean = true) {
const treeTag = _tostring(tree);
const res: any =
treeTag === objectTag ? {} : treeTag === arrayTag ? [] : tree;
if (treeTag !== objectTag && treeTag !== arrayTag) return res;
// 判断是否有此对象
if (map.has(tree)) {
// 直接返回
return tree;
} else {
map.set(tree, true);
}
const t = all ? Object.getOwnPropertyNames(tree) : tree;
if (all) {
for (const i in t) {
const k = t[i];
res[k] = copyTree(tree[k], all);
}
} else {
for (const k in t) {
res[k] = copyTree(tree[k], all);
}
}
return res;
}
return copyTree(tree, all);
}
let b: any = {
name: "ajanuw",
age: 12,
obj: {
name: "a"
}
};
b.obj.b = b;
let x = copytree(b);
l(x);
l(b);