recorrer objetos objeto imprimir eliminar elemento clonar buscar array agregar javascript

imprimir - Copia de una matriz de objetos a otra matriz sin referencia de objeto en javascript(copia profunda)



imprimir objeto javascript (6)

Tengo un escenario en el que necesito copiar la matriz de objetos (matriz principal) a otra matriz de temperatura que no debería tener referencia de objeto, básicamente, si realizo alguna modificación a la matriz principal, no debería reflejarse en la matriz de temperatura para que preserve la copia de forma independiente

He utilizado uno de los fragmentos de código del desbordamiento de la pila, este hace parcialmente, si elimino todos los objetos de la matriz principal, la matriz temporal aún conserva el valor, pero cuando hago algunas modificaciones en la matriz principal y hago clic en el botón cancelar iam quitando todos los objetos de la matriz principal usando array.Removeall (); pero la modificación todavía existe en la matriz de Temp, lo que significa que el objeto tiene una referencia.

clone: function (existingArray) { var newObj = (existingArray instanceof Array) ? [] : {}; console.debug(''newObj value is '' + newObj); for (i in existingArray) { console.debug(''i value is'' + i); if (i == ''clone'') continue; console.debug(''existingArray[i] value '' + existingArray[i]); if (existingArray[i] && typeof existingArray[i] == "object") { newObj[i] = this.clone(existingArray[i]); } else { console.debug(''in else part '' + existingArray[i]); newObj[i] = existingArray[i]; } } return newObj; }

mi estructura de objetos es como

iam usando el marco knockout.

newObjectCreation = function (localIp, RemoteIp, areaId) { this.localIP = ko.observable(localIp); this.remoteIP = ko.observable(RemoteIp); this.areaId = ko.observable(areaId); }; template.ProtocolArray.push(new newObjectCreation('''', '''', '''')); // to create default row

por favor ayúdame en este sentido. Gracias por adelantado.


Déjame entender: ¿no quieres solo tener una nueva matriz, pero quieres crear una nueva instancia para todos los objetos que están presentes en la misma matriz? Entonces, si modifica uno de los objetos en la matriz temporal, ¿qué cambios no se propagan a la matriz principal?

Si es el caso, depende de los valores que guardas en la matriz principal. Si estos objetos son objetos simples y se pueden serializar en JSON, la forma más rápida es:

var tempArray = JSON.parse(JSON.stringify(mainArray));

Si tiene objetos más complejos (como instancias creadas por algunos sus propios constructores, nodos html, etc.), entonces necesita un enfoque ad hoc.

Editar:

Si no tiene ningún método en su newObjectCreation , puede usar JSON , pero el constructor no será el mismo. De lo contrario, debe hacer la copia manualmente:

var tempArray = []; for (var i = 0, item; item = mainArray[i++];) { tempArray[i] = new newObjectCreation(item.localIP, item.remoteIP, item.areaId); }


Entonces, ¿quieres una copia profunda sin referencia de objeto? Claro, use .slice() .

Ejemplo:

var mainArr = [], tmpArr = [] tmpArr = mainArr.slice(0) // Shallow copy, no reference used.

PD: No creo que el análisis de doble JSON sea en cuanto al rendimiento .


Lodash se puede usar para copiar objetos profundos _.cloneDeep(value)

var objects = [{ ''a'': 1 }, { ''b'': 2 }]; var deep = _.cloneDeep(objects); console.log(deep[0] === objects[0]); // → false


Para copiar los valores de una matriz sin copiar la referencia, simplemente puede hacer:

let tempArray = [...mainArray];

Esta es la solución recomendada para la Guía de estilo JS de AirBnb: https://github.com/airbnb/javascript#arrays



Usa angular.copy . Pero no para toda la matriz (porque pasaría los elementos de la matriz por referencia), sino que la itera y usa angular.copy en sus miembros.

var newArray = []; for (var i = 0, item; item = mainArray[i];) { newArray[i] = angular.copy(item); i++; }