UNPKG

@liqd-js/clone

Version:

Object cloning function

62 lines (61 loc) 2.06 kB
'use strict'; 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); }