You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1023 B
49 lines
1023 B
'use strict'; |
|
|
|
/** |
|
* Module dependenices |
|
*/ |
|
|
|
const clone = require('shallow-clone'); |
|
const typeOf = require('kind-of'); |
|
const isPlainObject = require('is-plain-object'); |
|
|
|
function cloneDeep(val, instanceClone) { |
|
switch (typeOf(val)) { |
|
case 'object': |
|
return cloneObjectDeep(val, instanceClone); |
|
case 'array': |
|
return cloneArrayDeep(val, instanceClone); |
|
default: { |
|
return clone(val); |
|
} |
|
} |
|
} |
|
|
|
function cloneObjectDeep(val, instanceClone) { |
|
if (typeof instanceClone === 'function') { |
|
return instanceClone(val); |
|
} |
|
if (instanceClone || isPlainObject(val)) { |
|
const res = new val.constructor(); |
|
for (let key in val) { |
|
res[key] = cloneDeep(val[key], instanceClone); |
|
} |
|
return res; |
|
} |
|
return val; |
|
} |
|
|
|
function cloneArrayDeep(val, instanceClone) { |
|
const res = new val.constructor(val.length); |
|
for (let i = 0; i < val.length; i++) { |
|
res[i] = cloneDeep(val[i], instanceClone); |
|
} |
|
return res; |
|
} |
|
|
|
/** |
|
* Expose `cloneDeep` |
|
*/ |
|
|
|
module.exports = cloneDeep;
|
|
|