index.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. 'use strict'
  2. module.exports = rfdc
  3. function rfdc (opts) {
  4. opts = opts || {}
  5. const proto = opts.proto || false
  6. const circles = opts.circles || false
  7. if (circles) return rfdcCircles(opts)
  8. return proto ? cloneProto : clone
  9. function clone (o) {
  10. const type = typeof o
  11. if (type === 'function') return o
  12. if (o === null || type !== 'object') return o
  13. if (o instanceof Date) return new Date(o)
  14. const o2 = Array.isArray(o) ? new Array(o.length) : {}
  15. for (var k in o) {
  16. if (Object.hasOwnProperty.call(o, k) === false) continue
  17. var cur = o[k]
  18. if (typeof cur === 'function') {
  19. o2[k] = cur
  20. continue
  21. }
  22. if (cur === null) {
  23. o2[k] = null
  24. continue
  25. }
  26. if (typeof cur === 'object') {
  27. if (cur instanceof Date) {
  28. o2[k] = new Date(cur)
  29. continue
  30. }
  31. o2[k] = clone(cur)
  32. continue
  33. }
  34. o2[k] = cur
  35. }
  36. return o2
  37. }
  38. function cloneProto (o) {
  39. const type = typeof o
  40. if (type === 'function') return o
  41. if (o === null || type !== 'object') return o
  42. if (o instanceof Date) return new Date(o)
  43. const o2 = Array.isArray(o) ? new Array(o.length) : {}
  44. for (var k in o) {
  45. var cur = o[k]
  46. if (typeof cur === 'function') {
  47. o2[k] = cur
  48. continue
  49. }
  50. if (cur === null) {
  51. o2[k] = null
  52. continue
  53. }
  54. if (typeof cur === 'object') {
  55. if (cur instanceof Date) {
  56. o2[k] = new Date(cur)
  57. continue
  58. }
  59. o2[k] = cloneProto(cur)
  60. continue
  61. }
  62. o2[k] = cur
  63. }
  64. return o2
  65. }
  66. }
  67. function rfdcCircles (opts) {
  68. const proto = opts.proto || false
  69. const refs = new WeakMap()
  70. return proto ? cloneProto : clone
  71. function clone (o) {
  72. const type = typeof o
  73. if (type === 'function') return o
  74. if (o === null || type !== 'object') return o
  75. if (o instanceof Date) return new Date(o)
  76. const o2 = Array.isArray(o) ? new Array(o.length) : {}
  77. refs.set(o, o2)
  78. for (var k in o) {
  79. if (Object.hasOwnProperty.call(o, k) === false) continue
  80. var cur = o[k]
  81. if (typeof cur === 'function') {
  82. o2[k] = cur
  83. continue
  84. }
  85. if (cur === null) {
  86. o2[k] = null
  87. continue
  88. }
  89. if (typeof cur === 'object') {
  90. if (cur instanceof Date) {
  91. o2[k] = new Date(cur)
  92. continue
  93. }
  94. if (refs.has(cur)) o2[k] = refs.get(cur)
  95. else o2[k] = clone(cur)
  96. continue
  97. }
  98. o2[k] = cur
  99. }
  100. refs.delete(o)
  101. return o2
  102. }
  103. function cloneProto (o) {
  104. const type = typeof o
  105. if (type === 'function') return o
  106. if (o === null || type !== 'object') return o
  107. if (o instanceof Date) return new Date(o)
  108. const o2 = Array.isArray(o) ? new Array(o.length) : {}
  109. refs.set(o, o2)
  110. for (var k in o) {
  111. var cur = o[k]
  112. if (typeof cur === 'function') {
  113. o2[k] = cur
  114. continue
  115. }
  116. if (cur === null) {
  117. o2[k] = null
  118. continue
  119. }
  120. if (typeof cur === 'object') {
  121. if (cur instanceof Date) {
  122. o2[k] = new Date(cur)
  123. continue
  124. }
  125. if (refs.has(cur)) o2[k] = refs.get(cur)
  126. else o2[k] = cloneProto(cur)
  127. continue
  128. }
  129. o2[k] = cur
  130. }
  131. refs.delete(o)
  132. return o2
  133. }
  134. }