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 (Shallow Copy) - copia solo el primer nivel
  2. Copia profunda (Deep Copy) - copia todos los niveles anidados

Métodos de copia superficial (Shallow Copy):

Usando el operador spread:

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

Usando 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

Comprendiendo los métodos JSON y la copia profunda

JSON.stringify() convierte un objeto 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 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. Convertir la cadena JSON en un objeto de JavaScript
  2. Crear DOS carritos separados a partir de él
  3. En el segundo carrito:
    1. Agregar una propiedad discounted a cada artículo establecida en false
    2. Aplicar un descuento del 10% a todos los artículos que tengan un price mayor a 50
    3. Establecer 'discounted' en true para los artículos que recibieron el descuento
  4. Devolver un arreglo que contenga ambos carritos

Hoja de referencia

Al copiar objetos, tenemos dos tipos de copias:

  • Copia superficial (Shallow Copy) - copia solo el primer nivel
  • Copia profunda (Deep Copy) - copia todos los niveles anidados

Métodos de copia superficial:

Usando el operador spread:

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

Usando Object.assign():

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

Problema con la copia superficial:

original.b.x = 3;
console.log(spreadCopy.b.x); // 3 (nested objects share reference)

Métodos JSON:

JSON.stringify() convierte un objeto 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() vuelve a convertir una cadena JSON en un objeto 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 (completely independent)

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