@leapond/utilities
Version:
A set of JavaScript utilities for on-demand using.
42 lines (38 loc) • 1.18 kB
JavaScript
import {getMergeType} from "./common";
/**
* Object, Array, Set, Map supported deep copy.
* @param target
* @param {number} [depthMax]
* @return {Map<any, any>|Set<any>|*[]|*}
*/
export default function deepCopy(target, depthMax = Infinity) {
if (!target) return target
let args = arguments, typeTarget = args[2], depthCurrent = args[3] || 0, aLoops = args[4], dest, v
if (!(typeTarget > -1)) typeTarget = getMergeType(target)
if (!typeTarget || depthCurrent >= depthMax) return target
depthCurrent++
aLoops = aLoops ? [...aLoops, target] : [target]
switch (typeTarget) {
case 1:
case 2:
dest = typeTarget === 1 ? {} : []
Object.keys(target).forEach(k => {
v = target[k]
dest[k] = aLoops.includes(v) ? v : deepCopy(v, depthMax, -1, depthCurrent, aLoops)
})
return dest
case 3:
dest = new Set;
target.forEach(v => {
dest.add(deepCopy(v, depthMax, -1, depthCurrent, aLoops))
})
return dest
case 4:
dest = new Map;
target.forEach((v, k) => {
dest.set(k, deepCopy(v, depthMax, -1, depthCurrent, aLoops))
})
return dest
}
return target
}