Created
March 1, 2020 12:14
-
-
Save kwoktung/fac286287df3eb9a9b3c0f1d66051d80 to your computer and use it in GitHub Desktop.
deep Copy Loop
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function deepCopyLoop(obj){ | |
let type = Object.prototype.toString.call(obj) | |
let ret | |
let SrcQuene = []; | |
let DestQuene = []; | |
let m = new WeakMap(); | |
switch (type) { | |
case '[object Null]': | |
case '[object Undefined]': | |
case '[object Number]': | |
case '[object String]': | |
case '[object Function]': | |
case '[object Symbol]': | |
ret = obj; | |
break; | |
case '[object Date]': | |
ret = new Date(obj) | |
break | |
case '[object RegExp]': | |
ret = new RegExp(obj); | |
break | |
case '[object Array]': | |
ret = []; | |
SrcQuene.push(obj); | |
DestQuene.push(ret); | |
m.set(obj, ret) | |
break | |
case '[object Object]': | |
ret = {} | |
SrcQuene.push(obj); | |
DestQuene.push(ret); | |
m.set(obj, ret) | |
break | |
default: | |
ret = obj | |
} | |
while (SrcQuene.length > 0 && DestQuene.length > 0) { | |
src = SrcQuene.shift(); | |
dest = DestQuene.shift(); | |
for (let key in src) { | |
if (src.hasOwnProperty(key)){ | |
let val = src[key] | |
if (m.has(val)) { | |
dest[key] = m.get(val); | |
break | |
} | |
let type = Object.prototype.toString.call(val) | |
switch (type) { | |
case "[object Array]": | |
SrcQuene.push(val); | |
dest[key] = [] | |
DestQuene.push(dest[key]); | |
break; | |
case "[object Object]": | |
SrcQuene.push(val); | |
dest[key] = {}; | |
DestQuene.push(dest[key]); | |
break; | |
case '[object Null]': | |
case '[object Undefined]': | |
case '[object Number]': | |
case '[object String]': | |
case '[object Function]': | |
case '[object Symbol]': | |
case '[object Symbol]': | |
dest[key] = val; | |
break; | |
case '[object Date]': | |
dest[key] = new Date(val) | |
break | |
case '[object RegExp]': | |
dest[key] = new RegExp(val) | |
break | |
default: | |
dest[key] = val | |
} | |
} | |
} | |
} | |
return ret | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment