¿Cómo clonar una matriz de objetos en Javascript?

421

... donde cada objeto también tiene referencias a otros objetos dentro de la misma matriz?

Cuando se me ocurrió este problema, pensé en algo como

var clonedNodesArray = nodesArray.clone()

existiría y buscó información sobre cómo clonar objetos en javascript. Encontré una pregunta en StackOverflow (respondida por el mismo @JohnResig) y señaló que con jQuery podrías hacer

var clonedNodesArray = jQuery.extend({}, nodesArray);

para clonar un objeto. Sin embargo, probé esto, esto solo copia las referencias de los objetos en la matriz. Entonces si yo

nodesArray[0].value = "red"
clonedNodesArray[0].value = "green"

el valor de ambos nodeArray [0] y clonedNodesArray [0] resultará ser "verde". Entonces intenté

var clonedNodesArray = jQuery.extend(true, {}, nodesArray);

que copia en profundidad un objeto, pero recibí mensajes de " demasiada recursividad " y " desbordamiento de la pila de control " de Firebug y Opera Dragonfly respectivamente.

¿Como lo harias? ¿Es esto algo que ni siquiera debería hacerse? ¿Hay alguna forma reutilizable de hacer esto en Javascript?

wallyqs
fuente

Respuestas:

106

El problema con su copia superficial es que todos los objetos no están clonados. Si bien las referencias a cada objeto son únicas en cada matriz, una vez que finalmente lo agarras, estás lidiando con el mismo objeto que antes. No hay nada de malo en la forma en que lo clonó ... el mismo resultado ocurriría con Array.slice ().

La razón por la que su copia profunda tiene problemas es porque está terminando con referencias de objetos circulares. Profundo irá tan profundo como sea posible, y si tienes un círculo, continuará infinitamente hasta que el navegador se desmaye.

Si la estructura de datos no puede representarse como un gráfico acíclico dirigido, entonces no estoy seguro de que pueda encontrar un método universal para la clonación profunda. Los gráficos cíclicos brindan muchos casos difíciles, y como no es una operación común, dudo que alguien haya escrito una solución completa (si es posible, ¡podría no serlo! Pero no tengo tiempo para intentar escribir una prueba rigurosa ahora). Encontré algunos buenos comentarios sobre el tema en esta página .

Si necesita una copia profunda de una matriz de objetos con referencias circulares, creo que tendrá que codificar su propio método para manejar su estructura de datos especializada, de modo que sea un clon de varias pasadas:

  1. En la primera ronda, haga un clon de todos los objetos que no hagan referencia a otros objetos en la matriz. Mantenga un registro de los orígenes de cada objeto.
  2. En la segunda ronda, vincula los objetos.
Dan Lew
fuente
1
Enlace fijo para @PatrickdeKleijn respuesta: web.archive.org/web/20140222022056/http://my.opera.com/…
Mike Szyndel
531

Siempre que sus objetos contengan contenido serializable JSON (sin funciones, no Number.POSITIVE_INFINITY, etc.) no es necesario que ningún bucle clone matrices u objetos. Aquí hay una solución pura de una línea de vainilla.

var clonedArray = JSON.parse(JSON.stringify(nodesArray))

Para resumir los comentarios a continuación, la principal ventaja de este enfoque es que también clona el contenido de la matriz, no solo la matriz misma. Las desventajas principales son su límite de trabajar solo en contenido serializable JSON, y su rendimiento (que es significativamente peor que un sliceenfoque basado).

Vladimir Kharlampidi
fuente
118
Esto podría funcionar para los datos JSON, pero si su matriz contiene funciones o instancias de objetos que tienen métodos, despídase de ellos.
sp0rkyd0rky
12
tenga cuidado si tiene una matriz que contiene el valor Infinito. Este valor se pierde (es nulo después). ( jsfiddle.net/klickagent/ehm4bd3s )
klickagent.ch 01 de
13
En general, este es un mal enfoque a menos que su matriz contenga solo primitivas y / u objetos que contienen solo primitivas de cadena / número / booleanos (incluso nully undefinedserán problemas, ya que JSON no los admite). Además, es una operación mucho menos eficiente que old_array.slice(0);, que debería funcionar mejor y más rápido.
XML
2
si el objeto de la matriz tiene DateTime, se devolverá la cadena en lugar de DateTime. nueva fecha! == JSON.parse (JSON.stringify (nueva fecha))
MarkosyanArtur
2
La línea clave en la pregunta del OP, que esta respuesta anterior ignora por completo: ... ¿dónde cada objeto también tiene referencias a otros objetos dentro de la misma matriz?
XML
288

Resolví la clonación de una matriz de objetos con Object.assign

const newArray = myArray.map(a => Object.assign({}, a));

o incluso más corto con sintaxis extendida

const newArray = myArray.map(a => ({...a}));
dinodsaurus
fuente
15
Pero si myArray contenía un montón de Dinosaurios, newArray contiene un montón de Objetos. Eso es tonto, ¿no estás de acuerdo?
Matthew James Davis el
3
mejor enfoque, ya que mantiene vivas las funciones de los objetos, luego los pierde con JSON.parse (JSON.stringify (nodeArray))
scipper
14
@MatthewJamesDavis puede resolver esto reemplazando {}con new Dinosaur().
Agargara
55
copia superficial no copia profunda
sultan aslam
1
Esto funciona muy bien para una variedad de objetos, si esos objetos solo contienen propiedades primitivas ... que es lo que necesitaba, gracias
mojave
154

Si todo lo que necesita es una copia superficial, una forma realmente fácil es:

new_array = old_array.slice(0);
Leopd
fuente
66
No creo que tengas que pasar 0, puedes llamar .slice()al menos en Chrome de todos modos
slf
112
Sin embargo, esto no funciona, ¿verdad? Quiero decir, no es una respuesta a la pregunta de cómo clonar una matriz de objetos. Esta es la solución para clonar una matriz simple.
bozdoz
35
En realidad, esto no funcionará para una matriz de objetos. La matriz devuelta por sliceserá una nueva matriz pero contendrá las referencias a los objetos de la matriz original.
Sergio A.
44
Esto funcionará solo para "genéricos" int, string, etc., pero no para una matriz de objetos.
Stefan Michev
55
para una matriz de objetos que en realidad no se clona, ​​la actualización a new_array también actualizará old_array.
Anas
44

La mejor y más actualizada forma de hacer este clon es la siguiente:

Uso del ...operador de propagación ES6.

Aquí está el ejemplo más simple:

var clonedObjArray = [...oldObjArray];

De esta forma, distribuimos la matriz en valores individuales y la colocamos en una nueva matriz con el operador [].

Aquí hay un ejemplo más extenso que muestra las diferentes formas en que funciona:

let objArray = [ {a:1} , {b:2} ];

let refArray = objArray; // this will just point to the objArray
let clonedArray = [...objArray]; // will clone the array

console.log( "before:" );
console.log( "obj array" , objArray );
console.log( "ref array" , refArray );
console.log( "cloned array" , clonedArray );

objArray[0] = {c:3};

console.log( "after:" );
console.log( "obj array" , objArray ); // [ {c:3} , {b:2} ]
console.log( "ref array" , refArray ); // [ {c:3} , {b:2} ]
console.log( "cloned array" , clonedArray ); // [ {a:1} , {b:2} ]

MennyMez
fuente
2
Buena respuesta moderna, que no funcionará con navegadores antiguos (como IE 11)
Jealie
1
@Jealie, voy a adivinar que KingpinEX está apuntando esta respuesta para la gente que está transfiriendo es6 a algo más universalmente útil con Babel o lo que sea que tengas.
ruffin
61
Esto solo copia en profundidad la matriz, no cada objeto en la matriz.
Toivo Säwén
31
Para hacer un seguimiento de lo que dijo @ ToivoSäwén, esto no copiará en profundidad los objetos en la matriz. Todavía hará referencia a los objetos originales, por lo que si los muta, también afectará a la matriz original.
Joel Kinzel el
3
Funciona solo para primitivas. Pruebe esto: objArray [0] .a = 3; y verá que la referencia del objeto sigue siendo la misma en clonedArray.
Sergio Correa
25

Esto funciona para mi:

var clonedArray = $.map(originalArray, function (obj) {
                      return $.extend({}, obj);
                  });

Y si necesita una copia profunda de los objetos en la matriz:

var clonedArray = $.map(originalArray, function (obj) {
                      return $.extend(true, {}, obj);
                  });
viliks
fuente
1
Parece que funcionaría. Estoy tratando de evitar el uso extensivo de jQuery, por lo que no lo usaré en mi situación, pero un bucle for y for ... in funcionaría.
bozdoz
19
$.evalJSON($.toJSON(origArray));
de lo contrario
fuente
2
Deberá usar el complemento jquery json para usar este código
Google.com/p/jquery-json
32
Sin JQ (bien en los navegadores modernos):JSON.parse(JSON.stringify(origArray));
forresto
Encontré este comentario útil. En mi implementación, necesitaba hacer una copia de una matriz de objetos que tenían aplicadas propiedades observables de KnockoutJS. La copia solo necesitaba los valores, no la observabilidad. Para hacer una copia de SOLO los valores, utilicé JSON.parse (ko.toJSON (origArray)) O ko.utils.parseJson (ko.toJSON (origArray)). Solo mis 2 centavos y gracias por ayudarme a llegar a mi solución.
Wavedrop
66
JSON.parse(JSON.stringify(origArray));Definitivamente es la solución más simple.
yorkw
jQuery es a menudo innecesario. youmightnotneedjquery.com
ADJenks
9

El mapa creará una nueva matriz a partir de la anterior (sin referencia a la anterior) y dentro del mapa creará un nuevo objeto e iterará sobre las propiedades (claves) y asignará valores del antiguo objeto de matriz a las propiedades correspondientes al nuevo objeto.

Esto creará exactamente la misma matriz de objetos.

let newArray = oldArray.map(a => {
               let newObject = {};
               Object.keys(a).forEach(propertyKey => {
                    newObject[propertyKey] = a[propertyKey];
               });
               return newObject ;
});
eomeroff
fuente
8

Puedo tener una manera simple de hacer esto sin tener que hacer una dolorosa recursión y sin conocer todos los detalles más finos del objeto en cuestión. Usando jQuery, simplemente convierta su objeto a JSON usando jQuery $.toJSON(myObjectArray), luego tome su cadena JSON y evalúela nuevamente en un objeto. BAM! ¡Hecho y hecho! Problema resuelto. :)

var oldObjArray = [{ Something: 'blah', Cool: true }];
var newObjArray = eval($.toJSON(oldObjArray));
Jorge
fuente
21
Algunos navegadores modernos tienen incorporado el método JSON, por lo que puede hacer esto: JSON.parse (JSON.stringify (MY_ARRAY)), que debería ser más rápido. Buena sugerencia.
Nicolas R
1
Y si no usan json2 , no eval.
kamranicus
Esto tiene un rendimiento terrible, pero desafortunadamente es la mejor respuesta que he visto: /
Dvid Silva
No evalúe nada con los datos del usuario. Preferiblemente nunca usar eval()en absoluto. Es un riesgo de seguridad.
ADJenks
8

Estoy respondiendo esta pregunta porque no parece haber una solución simple y explícita al problema de "clonar una matriz de objetos en Javascript":

function deepCopy (arr) {
    var out = [];
    for (var i = 0, len = arr.length; i < len; i++) {
        var item = arr[i];
        var obj = {};
        for (var k in item) {
            obj[k] = item[k];
        }
        out.push(obj);
    }
    return out;
}

// test case

var original = [
    {'a' : 1},
    {'b' : 2}
    ];

var copy = deepCopy(original);

// change value in copy
copy[0]['a'] = 'not 1';

// original[0]['a'] still equals 1

Esta solución itera los valores de la matriz, luego itera las claves del objeto, guarda la última en un nuevo objeto y luego empuja ese nuevo objeto a una nueva matriz.

Ver jsfiddle . Nota: un simple .slice()o [].concat()no es suficiente para los objetos dentro de la matriz.

bozdoz
fuente
gracias por la respuesta, pero deberías haber resaltado las deficiencias de la respuesta. No funciona cuando los objetos tienen objetos en él ... ¿verdad?
Duro
creará una copia superficial. no profundo
sultan aslam
necesita agregar recursividad en alguna parte
DGoiko
6

JQuery extend está funcionando bien, solo necesita especificar que está clonando una matriz en lugar de un objeto ( observe el [] en lugar de {} como parámetro para el método extendido ):

var clonedNodesArray = jQuery.extend([], nodesArray);
Stef
fuente
2
Hmm, si rechazas esto, ¿puedes agregar un comentario sobre por qué lo haces? ¿O puede probar primero el código y ver si funciona o no? Gracias;)
Stef
1
Después de cambiar un objeto en la primera matriz, el objeto en la segunda matriz se modifica, por lo que no está bien.
Spikolynn
6

Este método es muy simple y puede modificar su clon sin modificar la matriz original.

// Original Array
let array = [{name: 'Rafael'}, {name: 'Matheus'}];

// Cloning Array
let clone = array.map(a => {return {...a}})

// Editing the cloned array
clone[1].name = 'Carlos';


console.log('array', array)
// [{name: 'Rafael'}, {name: 'Matheus'}]

console.log('clone', clone)
// [{name: 'Rafael'}, {name: 'Carlos'}]

Rafael Grilli
fuente
1
Esto hace una copia superficial que es dos niveles de profundidad, mientras que [...oldArray]y oldArray.slice(0)hacer una copia superficial de un nivel profundo. Así que esto es súper útil, pero no es un clon completo real.
Ben Wheeler
clon profundo verdadero se puede hacer lodash.clonedeepdesde npm
revelt
5

Como mencionó Daniel Lew, los gráficos cíclicos tienen algunos problemas. Si tuviera este problema, agregaría clone()métodos especiales a los objetos problemáticos o recordaría qué objetos ya he copiado.

Lo haría con una variable copyCountque aumenta en 1 cada vez que copie su código. Se copyCountcopia un objeto que tiene un proceso de copia inferior al actual. De lo contrario, se debe hacer referencia a la copia que ya existe. Esto hace que sea necesario vincular desde el original a su copia.

Todavía hay un problema: la memoria. Si tiene esta referencia de un objeto a otro, es probable que el navegador no pueda liberar esos objetos, ya que siempre se hace referencia desde algún lugar. Tendría que hacer un segundo pase donde establezca todas las referencias de copia a Null. (Si hace esto, no tendría que tener un copyCountbooleano isCopied, pero sería suficiente, ya que puede restablecer el valor en la segunda pasada).

Georg Schölly
fuente
4

Array.slice se puede usar para copiar una matriz o parte de una matriz ... http://www.devguru.com/Technologies/Ecmascript/Quickref/Slice.html Esto funcionaría con cadenas y números ... - cambiando una cadena en una matriz no afectaría a la otra, pero los objetos solo se copian por referencia, por lo que los cambios a los objetos referenciados en una matriz afectarían a la otra matriz.

Aquí hay un ejemplo de un administrador de deshacer de JavaScript que podría ser útil para esto: http://www.ridgway.co.za/archive/2007/11/07/simple-javascript-undo-manager-for-dtos.aspx

Markt
fuente
Lo sé. La razón por la que quería implementar esto es porque estoy tratando de resolver un problema de CSP con retroceso. Pensé que una de las formas de implementar el retroceso podría ser como "tomar instantáneas" del estado de la asignación de las variables ... clonando tales instantáneas en una pila.
wallyqs
... y bueno, en realidad podría ser una muy mala idea.
wallyqs
Ese enfoque podría tener otras complicaciones de sincronización :) .. ¿Cómo sabe que la matriz no se está modificando mientras toma una instantánea?
markt
Se ha añadido un enlace a un artículo donde el autor puso en práctica un simple administrador de deshacer usando javascript ..
Markt
4

Mi acercamiento:

var temp = { arr : originalArray };
var obj = $.extend(true, {}, temp);
return obj.arr;

me da un clon agradable, limpio y profundo de la matriz original, sin que ninguno de los objetos haga referencia al original :-)

nebulosas
fuente
Esta es la mejor solución usando jquery. corto y dulce.
John Henckel
1
Hice una prueba de rendimiento y esta solución parece ser aproximadamente 2 veces más rápida que la solución JSON.stringify.
meehocz
4

Lodash tiene una cloneDeepfunción para este propósito:

var objects = [{ 'a': 1 }, { 'b': 2 }];
var deep = _.cloneDeep(objects);
DicBrus
fuente
4

Si desea implementar un clon profundo, use JSON.parse (JSON.stringify (su {} o []))

const myObj ={
    a:1,
    b:2,
    b:3
}

const deepClone=JSON.parse(JSON.stringify(myObj));
deepClone.a =12;
console.log("deepClone-----"+myObj.a);
const withOutDeepClone=myObj;
withOutDeepClone.a =12;
console.log("withOutDeepClone----"+myObj.a);

nunna del sur
fuente
3

olvide eval () (es la característica más mal utilizada de JS y hace que el código sea lento) y slice (0) (funciona solo para tipos de datos simples)

Esta es la mejor solución para mí:

Object.prototype.clone = function() {
  var myObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i != 'clone') {
        if (this[i] && typeof this[i] == "object") {
          myObj[i] = this[i].clone();
        } else 
            myObj[i] = this[i];
        } 
    }
  return myObj;
};
krupar
fuente
3

Estaba bastante frustrado por este problema. Aparentemente, el problema surge cuando envía una matriz genérica al método $ .extend. Entonces, para solucionarlo, agregué una pequeña comprobación, y funciona perfectamente con matrices genéricas, matrices jQuery y cualquier objeto.

jQuery.extend({
    deepclone: function(objThing) {
        // return jQuery.extend(true, {}, objThing);
        /// Fix for arrays, without this, arrays passed in are returned as OBJECTS! WTF?!?!
        if ( jQuery.isArray(objThing) ) {
            return jQuery.makeArray( jQuery.deepclone($(objThing)) );
        }
        return jQuery.extend(true, {}, objThing);
    },
});

Invocar usando:

var arrNewArrayClone = jQuery.deepclone(arrOriginalArray);
// Or more simply/commonly
var arrNewArrayClone = $.deepclone(arrOriginalArray);
Brak
fuente
clon profundo? Yo uso jquery-1.9.1 y no es compatible con este método. ¿Es el método de la versión más moderna?
user5260143
@ user2783091 él está extendiendo JQuery para agregar esa función. No es algo que sale de la caja
JorgeeFG
3

Esto copia profundamente los arrays, objetos, valores nulos y otros valores escalares, y también copia profundamente cualquier propiedad en funciones no nativas (lo cual es bastante poco común pero posible). (Para mayor eficiencia, no intentamos copiar propiedades no numéricas en las matrices).

function deepClone (item) {
  if (Array.isArray(item)) {
    var newArr = [];
    for (var i = item.length; i-- > 0;) {
      newArr[i] = deepClone(item[i]);
    }
    return newArr;
  }
  if (typeof item === 'function' && !(/\(\) \{ \[native/).test(item.toString())) {
    var obj;
    eval('obj = '+ item.toString());
    for (var k in item) {
      obj[k] = deepClone(item[k]);
    }
    return obj;
  }
  if (item && typeof item === 'object') {
    var obj = {};
    for (var k in item) {
      obj[k] = deepClone(item[k]);
    }
    return obj;
  }
  return item;
}
Brett Zamir
fuente
3

Uso el nuevo método ECMAScript 6 Object.assign :

let oldObject = [1,3,5,"test"];
let newObject = Object.assign({}, oldObject);

El primer argumento de este método es la matriz que se actualizará, pasamos un objeto vacío porque queremos tener un nuevo objeto.

También podemos usar esta sintaxis, que es la misma pero más corta:

let newObject = [...oldObject];
Chtiwi Malek
fuente
Tenga en cuenta que estos enfoques solo copiarán referencias para matrices y objetos dentro de la matriz, y no harán nuevas copias de estos. Espere que esto se rompa para estructuras multidimensionales.
Ben Wheeler
2

Podemos inventar un método de matriz recursiva simple para clonar matrices multidimensionales. Si bien los objetos dentro de las matrices anidadas mantienen su referencia a los objetos correspondientes en la matriz fuente, las matrices no lo harán.

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};

var arr = [ 1, 2, 3, 4, [ 1, 2, [ 1, 2, 3 ], 4 , 5], 6 ],
    brr = arr.clone();
brr[4][2][1] = "two";
console.log(JSON.stringify(arr));
console.log(JSON.stringify(brr));

Redu
fuente
2

En JavaScript, la copia de matriz y objeto cambia los valores de origen, por lo que la copia profunda es la solución para esto.

Una copia profunda significa en realidad crear una nueva matriz y copiar sobre los valores, ya que pase lo que pase nunca afectará al origen.

JSON.parsey JSON.stringifyes la mejor y más simple forma de copiar en profundidad. El JSON.stringify()método convierte un valor de JavaScript en una cadena JSON. El JSON.parse()método analiza una cadena JSON, construyendo el valor de JavaScript u objeto descrito por la cadena.

// Deep Clone

let a = [{ x:{z:1} , y: 2}];
let b = JSON.parse(JSON.stringify(a));
b[0].x.z=0

console.log(JSON.stringify(a)); //[{"x":{"z":1},"y":2}]
console.log(JSON.stringify(b)); // [{"x":{"z":0},"y":2}]

Para más detalles: lea aquí

Bijay Rai
fuente
1
Esta es la mejor solución. Gracias.
Nikolay
1

con jQuery:

var target= [];
$.each(source, function() {target.push( $.extend({},this));});
lujan99
fuente
1

El siguiente código realizará una copia recursiva profunda de los objetos y la matriz :

function deepCopy(obj) {
if (Object.prototype.toString.call(obj) === '[object Array]') {
    var out = [], i = 0, len = obj.length;
    for ( ; i < len; i++ ) {
        out[i] = arguments.callee(obj[i]);
    }
    return out;
}
if (typeof obj === 'object') {
    var out = {}, i;
    for ( i in obj ) {
        out[i] = arguments.callee(obj[i]);
    }
    return out;
}
return obj;
}

Fuente

Franck Dernoncourt
fuente
arguments.calleeno está disponible en modo estricto y tiene problemas de rendimiento de lo contrario.
Brett Zamir
0

Creo que logró escribir un método genérico de clonación profunda de cualquier estructura de JavaScript, principalmente, Object.createque es compatible con todos los navegadores modernos. El código es así:

function deepClone (item) {
  if (Array.isArray(item)) {
    var newArr = [];

    for (var i = item.length; i-- !== 0;) {
      newArr[i] = deepClone(item[i]);
    }

    return newArr;
  }
  else if (typeof item === 'function') {
    eval('var temp = '+ item.toString());
    return temp;
  }
  else if (typeof item === 'object')
    return Object.create(item);
  else
    return item;
}
ozantunca
fuente
Object.createse tratará itemcomo el prototipo del objeto, pero eso es diferente de la clonación. Si itemse modifica, los cambios se reflejarán en su "clon" y viceversa. Este enfoque no funciona.
Brett Zamir
0

Para clonar los objetos también, solo iba a sugerir ECMAScript 6 reduce():

const newArray=myArray.reduce((array, element)=>array.push(Object.assign({}, element)), []);

Pero, francamente, me gusta aún más la respuesta de @dinodsaurus. Solo estoy poniendo esta versión aquí como otra opción, pero personalmente la map()usaré como lo sugiere @dinodsaurus.

Garret Wilson
fuente
0
       var game_popularity = [
            { game: "fruit ninja", popularity: 78 },
            { game: "road runner", popularity: 20 },
            { game: "maze runner", popularity: 40 },
            { game: "ludo", popularity: 75 },
            { game: "temple runner", popularity: 86 }
        ];
        console.log("sorted original array before clonning");
        game_popularity.sort((a, b) => a.popularity < b.popularity);
        console.log(game_popularity);


        console.log("clone using object assign");
        const cl2 = game_popularity.map(a => Object.assign({}, a));
        cl2[1].game = "clash of titan";
        cl2.push({ game: "logan", popularity: 57 });
        console.log(cl2);


        //adding new array element doesnt reflect in original array
        console.log("clone using concat");
        var ph = []
        var cl = ph.concat(game_popularity);

        //copied by reference ?
        cl[0].game = "rise of civilization";

        game_popularity[0].game = 'ping me';
        cl.push({ game: "angry bird", popularity: 67 });
        console.log(cl);

        console.log("clone using ellipses");
        var cl3 = [...game_popularity];
        cl3.push({ game: "blue whale", popularity: 67 });
        cl3[2].game = "harry potter";
        console.log(cl3);

        console.log("clone using json.parse");
        var cl4 = JSON.parse(JSON.stringify(game_popularity));
        cl4.push({ game: "home alone", popularity: 87 });
        cl4[3].game ="lockhead martin";
        console.log(cl4);

        console.log("clone using Object.create");
        var cl5 = Array.from(Object.create(game_popularity));
        cl5.push({ game: "fish ville", popularity: 87 });
        cl5[3].game ="veto power";
        console.log(cl5);


        //array function
        console.log("sorted original array after clonning");
        game_popularity.sort((a, b) => a.popularity < b.popularity);
        console.log(game_popularity);


        console.log("Object.assign deep clone object array");
        console.log("json.parse deep clone object array");
        console.log("concat does not deep clone object array");
        console.log("ellipses does not deep clone object array");
        console.log("Object.create does not deep clone object array");


        Output:


        sorted original array before clonning
        [ { game: 'temple runner', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 } ]
        clone using object assign
        [ { game: 'temple runner', popularity: 86 },
        { game: 'clash of titan', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'logan', popularity: 57 } ]
        clone using concat
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'ludo', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'angry bird', popularity: 67 } ]
        clone using ellipses
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'maze runner', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'blue whale', popularity: 67 } ]
        clone using json.parse
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'lockhead martin', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'home alone', popularity: 87 } ]
        clone using Object.create
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'veto power', popularity: 40 },
        { game: 'road runner', popularity: 20 },
        { game: 'fish ville', popularity: 87 } ]
        sorted original array after clonning
        [ { game: 'ping me', popularity: 86 },
        { game: 'fruit ninja', popularity: 78 },
        { game: 'harry potter', popularity: 75 },
        { game: 'veto power', popularity: 40 },
        { game: 'road runner', popularity: 20 } ]

        Object.assign deep clone object array
        json.parse deep clone object array
        concat does not deep clone object array
        ellipses does not deep clone object array
        Object.create does not deep clone object array
sangram
fuente