JSFiddle - React, Tailwind, and code Playground

by xavierm02

JavaScript

( function ( ) {
    
    var hasOwnProperty = { }.hasOwnProperty;
    
    Object.deepDataClone = function ( object, number ) {
        var maps = [ ];
        while ( number --> 0 ) {
            maps.push( new WeakMap( ) );
        }
        if ( Object( object ) !== object ) {
            return maps.map( function ( ) {
                return object;
            } );
        }
        return deepDataClone( object, maps );
    };
    
    var deepDataClone = function ( object, maps ) {
        var clone;
        var clones;
        var key;
        var value;
        
        if ( maps[ 0 ].has( object ) ) {
            return maps.map( function ( map ) {
                return map.get( object );
            } );
        }
        
        if ( Array.isArray( object ) ) {
            return maps.map( function ( map ) {
                clone = object.slice( );
                map.set( object, clone );
                return clone;
            } );
        }
        
        clones = maps.map( function ( map ) {
            clone = Object.create( object );
            map.set( object, clone );
            return clone;
        } );
        
        for ( key in object ) {
            if ( hasOwnProperty.call( object, key ) ) {
                value = object[ key ];
                if ( Object( value ) === value ) {
                    deepDataClone( value, maps ).forEach( function ( value, index ) {
                        clones[ index ][ key ] = value;
                    } );
                }
            }
        }
        return clones;
    };
    
}( ) );

var data = data1 = {
    number: 1,
    array: [ 0, 1 ],
    object: {
        p: 'v'
    },
    null: null
};
var dataCopy = Object.deepDataClone( data, 2 );
var data2 = dataCopy[ 0 ];
var data3 = dataCopy[ 1 ];

console.log( data1, data2, data3 );