希望能摆脱lodash的深拷贝
function copytree(tree, all) {
if (all === void 0) { all = true; }
var _tostring = function (value) { return Object.prototype.toString.call(value); };
var emptyp = function (value) {
return JSON.stringify(value).length === 2 ? true : false;
};
var treeTag = _tostring(tree);
var objectTag = '[object Object]';
var arrayTag = '[object Array]';
var res = (function () {
if (treeTag === objectTag) {
return {};
}
else if (treeTag === arrayTag) {
return [];
}
else {
return tree;
}
})();
if (treeTag !== objectTag && treeTag !== arrayTag)
return res;
if (emptyp(tree))
return res;
function copyTree(obj, a) {
var objTag = _tostring(obj);
if (emptyp(obj))
return objTag === objectTag ? {} : [];
var res = objTag === objectTag ? {} : [];
var o = a ? Object.getOwnPropertyNames(obj) : obj;
if (a) {
for (var i in o) {
var k = o[i];
var value = obj[k];
var valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, a);
}
else {
res[k] = value;
}
}
}
else {
for (var k in o) {
var value = obj[k];
var valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, a);
}
else {
res[k] = value;
}
}
}
return res;
}
var t = all ? Object.getOwnPropertyNames(tree) : tree;
if (all) {
for (var i in t) {
var k = t[i];
var value = tree[k];
var valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, all);
}
else {
res[k] = value;
}
}
}
else {
for (var k in t) {
var value = tree[k];
var valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, all);
}
else {
res[k] = value;
}
}
}
return res;
}
调试
import {
log as l
} from 'console';
function copytree(tree: any, all: boolean = true) {
const _tostring = (value: any): string => Object.prototype.toString.call(value);
const emptyp = function (value: any) {
return JSON.stringify(value).length === 2 ? true : false;
}
let treeTag = _tostring(tree);
let objectTag = '[object Object]';
let arrayTag = '[object Array]';
let res: any = (function () {
if (treeTag === objectTag) {
return {};
} else if (treeTag === arrayTag) {
return []
} else {
return tree;
}
})();
if (treeTag !== objectTag && treeTag !== arrayTag) return res;
if (emptyp(tree)) return res;
function copyTree(obj: any, a: boolean): any {
let objTag = _tostring(obj);
if (emptyp(obj)) return objTag === objectTag ? {} : [];
let res: any = objTag === objectTag ? {} : [];
let o = a ? Object.getOwnPropertyNames(obj) : obj;
if (a) {
for (const i in o) {
let k = o[i];
let value = obj[k]
let valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, a);
} else {
res[k] = value;
}
}
} else {
for (const k in o) {
let value = obj[k]
let valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, a);
} else {
res[k] = value;
}
}
}
return res;
}
let t = all ? Object.getOwnPropertyNames(tree) : tree;
if (all) {
for (const i in t) {
let k = t[i];
let value = tree[k]
let valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, all);
} else {
res[k] = value;
}
}
} else {
for (const k in t) {
let value = tree[k]
let valueTag = _tostring(value);
if (valueTag === arrayTag || valueTag === objectTag) {
res[k] = copyTree(value, all);
} else {
res[k] = value;
}
}
}
return res;
}
// let b = {
// name: 'ajanuw',
// age: 14,
// list: [1, 2, 3, {
// name: 'ajanuw',
// users: ['a', 'b']
// }]
// }
// let x = copytree(b)
// l(x)
// l(b)
// l(x === b) // false
// l(b.list === x.list)
// l(b.list[3] === x.list[3])
// l(b.list[3], x.list[3])
let a = [1, 2, 3, { name: 'ajanuw' }]
Object.defineProperty(a, '10', {
value: { age: 14 }
})
let b = copytree(a, false)
l(a)
l(b)
l(a === b)