objetos objeto objects clonar array javascript arrays node.js google-chrome deep-copy

objects - Copiando una matriz de objetos en otra matriz en javascript(Deep Copy)



object.assign javascript (6)

Copiar una matriz de objetos en otra matriz en javascript utilizando slice (0) y concat () no funciona.

He intentado lo siguiente para probar si obtengo el comportamiento esperado de la copia profunda usando esto. Pero la matriz original también se está modificando después de hacer cambios en la matriz copiada.

var tags = []; for(var i=0; i<3; i++) { tags.push({ sortOrder: i, type: ''miss'' }) } for(var tag in tags) { if(tags[tag].sortOrder == 1) { tags[tag].type = ''done'' } } console.dir(tags) var copy = tags.slice(0) console.dir(copy) copy[0].type = ''test'' console.dir(tags) var another = tags.concat() another[0].type = ''miss'' console.dir(tags)

¿Cómo puedo hacer una copia profunda de una matriz en otra, para que la matriz original no se modifique si hago un cambio en la matriz de copias?


Tratar

var copy = JSON.parse(JSON.stringify(tags));


Como se menciona aquí, .slice(0) será efectivo para clonar la matriz con elementos de tipo primitivo. Sin embargo, en su matriz de tags ejemplo contiene objetos anónimos. Por lo tanto, cualquier cambio en estos objetos en una matriz clonada se refleja en la matriz de tags .

La respuesta de @ dangh arriba libera estos objetos del elemento y crea otros nuevos.

Aquí hay otro hilo que aborda una situación similar



Para esto utilizo el nuevo método Object.assign de ECMAScript 6:

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 objeto completamente nuevo,

también puede agregar otros objetos para copiar también:

let newObject = Object.assign({}, oldObject, o2, o3, ...)


La manera más fácil y optimista de hacer esto en una sola línea es usar Underscore / Lodash

dejar a = _.map (b, _.clone)


El mismo problema me pasa. Tengo datos del servicio y los guardo en otra variable. Cada vez que actualizo mi matriz, la matriz copiada también se actualiza. el viejo código es como abajo

//$scope.MyData get from service $scope.MyDataOriginal = $scope.MyData;

Entonces, cuando cambie $ scope.MyData también cambie $ scope.MyDataOriginal. Encontré una solución que angular.copy código correcto como a continuación

$scope.MyDataOriginal = angular.copy($scope.MyData);