function deepCopy(obj) {
if (!isObject(obj) && !isMap(obj)) {
return obj;
}
let cloneObj;
if (isMap(obj)) {
cloneObj = new Map();
for (let key of obj.keys()) {
let value = obj.get(key);
if (isMap(value) || isObject(value) || Array.isArray(obj)) {
let copyVal = deepCopy(value);
cloneObj.set(key, copyVal);
} else {
cloneObj.set(key, value);
}
}
} else if (typeof obj === "function") {
cloneObj = obj
} else {
cloneObj = Array.isArray(obj) ? [] : {};
if (obj instanceof HTMLElement) {
cloneObj = obj.cloneNode(true)
} else {
for (let key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
cloneObj[key] =
isMap(obj[key]) || isObject(obj[key])
? deepCopy(obj[key])
: obj[key];
}
}
}
}
return cloneObj;
}
function isObject(o) {
return (
!isMap(o) &&
(typeof o === 'object' || typeof o === 'function') &&
o !== null
);
}
function isMap(obj) {
if (obj instanceof Map) {
return true;
} else {
return false;
}
}