Menu
Coddy logo textTech

Copia superficial y profunda

Parte de la sección Lógica y Flujo del Journey de JavaScript de Coddy. Lección 25 de 65.

Al copiar objetos, tenemos dos tipos de copias:

  1. Copia superficial: copia solo el primer nivel
  2. Copia profunda: copia todos los niveles anidados

Métodos de copia superficial:

Usando el operador spread:

const original = { a: 1, b: { x: 2 } };
const spreadCopy = { ...original };

Uso de Object.assign(), que crea un nuevo objeto copiando las propiedades del objeto de origen al objeto de destino:

const assignCopy = Object.assign({}, original);

Problema con la copia superficial:

original.b.x = 3;
console.log(spreadCopy.b.x); // 3
// (los objetos anidados comparten la referencia)

console.log(assignCopy.b.x); // 3

Comprender los métodos de JSON y la copia profunda

JSON.stringify() convierte un objeto de JavaScript en una cadena JSON:

const obj = { name: "John", age: 30 };
const jsonString = JSON.stringify(obj);
console.log(jsonString); // "{"name":"John","age":30}"

JSON.parse() convierte una cadena JSON de nuevo en un objeto de JavaScript:

const backToObject = JSON.parse(jsonString);
console.log(backToObject); // { name: "John", age: 30 }

Copia profunda usando JSON:

const original = { a: 1, b: { x: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));

original.b.x = 3;
console.log(deepCopy.b.x); // 2 (completamente independiente)
challenge icon

Desafío

Fácil

Crea una función llamada processCart que reciba una cadena JSON que represente un carrito de compras. El carrito contiene un arreglo de productos con nombres y precios. Tu tarea es:

  1. Analizar la cadena JSON para convertirla en un objeto JavaScript
  2. Crear DOS carritos separados a partir de ella
  3. En el segundo carrito:
    1. Agregar una propiedad discounted a cada elemento, establecida en false
    2. Aplicar un descuento del 10 % a todos los elementos que tengan un price mayor que 50
    3. Establecer 'discounted' en true para los elementos que recibieron el descuento
  4. Devolver un arreglo que contenga ambos carritos

Pruébalo tú mismo

function processCart(jsonString) {
    // Escribe el código aquí
}
// No escribas nada fuera de la función
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo

Practica por tu cuenta: Compilador de JavaScript online