Copiar objetos en profundidad en Angular


AngularJS tiene angular.copy() para copiar profundamente objetos y matrices.

¿Angular también tiene algo así?

 34
Author: Lazar Ljubenović, 2016-03-21

5 answers

Esta pregunta no es un duplicado de Cómo puedo usar angular.copie en angular 2 porque el OP está preguntando por objetos de copia profunda. La respuesta vinculada recomienda el objeto .assign () que no hace una copia profunda.

En realidad, el uso de Angular2 no restringe el uso de otras bibliotecas como jQuery para copiar objetos profundos con su $.clone () función o lodash con _.cloneDeep () .

Las bibliotecas más comunes tienen sus tipografías están disponibles a través de typings CLI tools, por lo que incluso al transpilar desde TypeScript, puede usar todo lo que desee sin problemas.

Ver también: ¿Cuál es la forma más eficiente de clonar en profundidad un objeto en JavaScript?

 15
Author: martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 11:45:32

Otra opción es implementar su propia función:

/**
 * Returns a deep copy of the object
 */
public static deepCopy(oldObj: any) {
    var newObj = oldObj;
    if (oldObj && typeof oldObj === "object") {
        newObj = Object.prototype.toString.call(oldObj) === "[object Array]" ? [] : {};
        for (var i in oldObj) {
            newObj[i] = this.deepCopy(oldObj[i]);
        }
    }
    return newObj;
}
 18
Author: Andrea Ialenti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-07 20:17:48

También puedes usar:

JSON.parse(JSON.stringify(Object))

Si está en su ámbito, está en cada componente Angular, directiva, etc. y también está en cada entorno de nodo.

A menos que tenga una referencia circular, debería funcionar y disociará efectivamente su referencia de variable con el objeto original.

 15
Author: Gabriel Balsa Cantú,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-20 06:21:36

Puedes deep copy un objeto en Angular usando el método cloneDeep de lodash:

Instala lodash con yarn add lodash o npm install lodash.

En tu componente, importa cloneDeep y úsalo:

import * as cloneDeep from 'lodash/cloneDeep';
...
clonedObject = cloneDeep(originalObject);

Solo son 18kb añadidos a tu compilación, bien vale la pena por los beneficios.

También he escrito un artículo aquí, si necesita más información sobre por qué usar cloneDeep de lodash.

 6
Author: BogdanC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 20:06:04

Si la fuente es una matriz de objetos , usando map:

let cloned = source.map(x => Object.assign({}, x));

O

let cloned = source.map((x) => {
                return { ...x };
             });
 0
Author: Lahar Shah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-20 15:40:07