@liqd-js/clone
Version:
Object cloning function
62 lines (61 loc) • 2.06 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = clone;
//https://github.com/pvorb/clone/blob/master/clone.js
function clonable(obj) {
return (obj && typeof obj === 'object');
}
function clone_object(obj, proto, nodes) {
if (nodes.has(obj)) {
return nodes.get(obj);
}
let clone;
if (Array.isArray(obj)) {
clone = new Array(obj.length);
for (let i = 0; i < obj.length; ++i) {
clone[i] = clonable(obj[i]) ? clone_object(obj[i], proto, nodes) : obj[i];
}
}
else if (obj instanceof Set) {
clone = new Set();
for (let value of obj) {
clone.add(clonable(value) ? clone_object(value, proto, nodes) : value);
}
}
else if (obj instanceof Map) {
clone = new Map();
for (let [key, value] of obj.entries()) {
clone.set(clonable(key) ? clone_object(key, proto, nodes) : key, clonable(value) ? clone_object(value, proto, nodes) : value);
}
}
else if (obj instanceof Date) {
clone = new Date(obj.getTime());
}
else if (obj instanceof RegExp) {
clone = new RegExp(obj.source, obj.flags);
}
else if (obj instanceof ArrayBuffer) {
clone = obj.slice(0);
}
else if (obj instanceof DataView) {
clone = new DataView(obj.buffer.slice(0), obj.byteOffset, obj.byteLength);
}
// TODO instanceof Promise
else {
if (proto || Object.getPrototypeOf(obj) === Object.prototype) {
clone = proto ? Object.create(Object.getPrototypeOf(obj)) : new Object();
for (let [key, value] of Object.entries(obj)) {
clone[key] = clonable(value) ? clone_object(value, proto, nodes) : value;
}
// TODO Object.getOwnPropertySymbols
}
else {
clone = obj;
}
}
nodes.set(obj, clone);
return clone;
}
function clone(value, proto = false) {
return (clonable(value) ? clone_object(value, proto, new Map()) : value);
}
;