index.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. 'use strict';
  2. /**
  3. * Module dependenices
  4. */
  5. var isObject = require('is-plain-object');
  6. var clone = require('shallow-clone');
  7. var typeOf = require('kind-of');
  8. var forOwn = require('for-own');
  9. /**
  10. * Recursively clone native types.
  11. */
  12. function cloneDeep(val, instanceClone) {
  13. switch (typeOf(val)) {
  14. case 'object':
  15. return cloneObjectDeep(val, instanceClone);
  16. case 'array':
  17. return cloneArrayDeep(val, instanceClone);
  18. default: {
  19. return clone(val);
  20. }
  21. }
  22. }
  23. function cloneObjectDeep(obj, instanceClone) {
  24. if (isObject(obj) || (instanceClone === true && typeOf(obj) === 'object')) {
  25. var res = {};
  26. forOwn(obj, function(val, key) {
  27. this[key] = cloneDeep(val, instanceClone);
  28. }, res);
  29. return res;
  30. }
  31. if (typeof instanceClone === 'function') {
  32. return instanceClone(obj);
  33. }
  34. return obj;
  35. }
  36. function cloneArrayDeep(arr, instanceClone) {
  37. var res = [];
  38. for (var i = 0; i < arr.length; i++) {
  39. res[i] = cloneDeep(arr[i], instanceClone);
  40. }
  41. return res;
  42. }
  43. /**
  44. * Expose `cloneDeep`
  45. */
  46. module.exports = cloneDeep;