123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 'use strict'
- module.exports = rfdc
- function rfdc (opts) {
- opts = opts || {}
- const proto = opts.proto || false
- const circles = opts.circles || false
- if (circles) return rfdcCircles(opts)
- return proto ? cloneProto : clone
- function clone (o) {
- const type = typeof o
- if (type === 'function') return o
- if (o === null || type !== 'object') return o
- if (o instanceof Date) return new Date(o)
- const o2 = Array.isArray(o) ? new Array(o.length) : {}
- for (var k in o) {
- if (Object.hasOwnProperty.call(o, k) === false) continue
- var cur = o[k]
- if (typeof cur === 'function') {
- o2[k] = cur
- continue
- }
- if (cur === null) {
- o2[k] = null
- continue
- }
- if (typeof cur === 'object') {
- if (cur instanceof Date) {
- o2[k] = new Date(cur)
- continue
- }
- o2[k] = clone(cur)
- continue
- }
- o2[k] = cur
- }
- return o2
- }
- function cloneProto (o) {
- const type = typeof o
- if (type === 'function') return o
- if (o === null || type !== 'object') return o
- if (o instanceof Date) return new Date(o)
- const o2 = Array.isArray(o) ? new Array(o.length) : {}
- for (var k in o) {
- var cur = o[k]
- if (typeof cur === 'function') {
- o2[k] = cur
- continue
- }
- if (cur === null) {
- o2[k] = null
- continue
- }
- if (typeof cur === 'object') {
- if (cur instanceof Date) {
- o2[k] = new Date(cur)
- continue
- }
- o2[k] = cloneProto(cur)
- continue
- }
- o2[k] = cur
- }
- return o2
- }
- }
- function rfdcCircles (opts) {
- const proto = opts.proto || false
- const refs = new WeakMap()
- return proto ? cloneProto : clone
- function clone (o) {
- const type = typeof o
- if (type === 'function') return o
- if (o === null || type !== 'object') return o
- if (o instanceof Date) return new Date(o)
- const o2 = Array.isArray(o) ? new Array(o.length) : {}
- refs.set(o, o2)
- for (var k in o) {
- if (Object.hasOwnProperty.call(o, k) === false) continue
- var cur = o[k]
- if (typeof cur === 'function') {
- o2[k] = cur
- continue
- }
- if (cur === null) {
- o2[k] = null
- continue
- }
- if (typeof cur === 'object') {
- if (cur instanceof Date) {
- o2[k] = new Date(cur)
- continue
- }
- if (refs.has(cur)) o2[k] = refs.get(cur)
- else o2[k] = clone(cur)
- continue
- }
- o2[k] = cur
- }
- refs.delete(o)
- return o2
- }
- function cloneProto (o) {
- const type = typeof o
- if (type === 'function') return o
- if (o === null || type !== 'object') return o
- if (o instanceof Date) return new Date(o)
- const o2 = Array.isArray(o) ? new Array(o.length) : {}
- refs.set(o, o2)
- for (var k in o) {
- var cur = o[k]
- if (typeof cur === 'function') {
- o2[k] = cur
- continue
- }
- if (cur === null) {
- o2[k] = null
- continue
- }
- if (typeof cur === 'object') {
- if (cur instanceof Date) {
- o2[k] = new Date(cur)
- continue
- }
- if (refs.has(cur)) o2[k] = refs.get(cur)
- else o2[k] = cloneProto(cur)
- continue
- }
- o2[k] = cur
- }
- refs.delete(o)
- return o2
- }
- }
|