function deepClone(obj, hash = new WeakMap()) { if(typeof obj !== 'object' || obj === null) { return obj; } if(hash.has(obj)) { return hash.get(obj); } let res = Array.isArray(obj) ? [...obj] : {...obj}; hash.set(obj, res); Reflect.ownKeys(res).forEach(key => { let item = res[key]; res[key] = deepClone(item, hash); }); return res; }