No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
23 Hrs
22 Min
5 Seg

Playgrounds: Hacer freeze de un objeto de forma recursiva

10/20

Aportes 53

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Hola compartro solucion abajo
.
.
.
.
.
.
.
.
.
.
.
.
.
.

export function deepFreeze(obj) {
    if( typeof(obj)!=="object") return

    Object.freeze(obj); 

    for(let key in obj){
      deepFreeze(obj[key]) 
    }
} 

el play ground esta siendo muy deficiente, en la pestaña vista muestra errores que pareciera que esta fallando el codio. Incluso lo hace con el codigo de ofrece el boton de “ver solucion”. Asi como hay otras soluciones al ejercicio que el playground las toma como erradas. No permite solucionarlo por medio de for…in.

Lo que hemos visto en todos los cursos es que no importa el camino siempre que logres el resultado y estos ejercicios estan siendo restrictivos a una unica respuesta valida, me ha pasado en los ultimos 6 playground que hecho en los ultimos 3 cursos. Y en los ultimos 2 he tenido el inconveniente que incluso la solucion ofrecida por la plataforma tiene un comportamiento extraño en la pestaña de “vista”

Por favor revisenlo xq nos causa dudas a los que estamos aprendiendo y necesitamos aprender con seguridad y esto nos hace dudar mucho.

Mi Solucion 😎

function deepFreeze(obj) {
  // Tu código aquí 👈
  if (typeof obj != 'object') return obj;

  Object.freeze(obj);

  for (let key in obj) {
    deepFreeze(obj[key])
  }

  return obj;
}

Agrego mi solución Aunque debo decir que el playground no me la valio si funciona XD
¬¬
¬¬
¬¬
¬¬
¬¬
¬¬
¬¬
Tuve dos de las validaciones bien pero me pide que lance un error cuando se intenta agregar o borrar una propiedad y pues no se hacer eso aun (se supone que por el freeze igual no dejaria, no ? ) entiendo que lo que quieren es literal hacer un throw error o algo asi … no ?

function isObject(obj) {
  return typeof obj === 'object' && obj !== null;
}
export function deepFreeze(obj) {
  for (let prop in obj) {
    console.log(prop)
    let keyIsObj = isObject(obj[prop])

    console.log(keyIsObj)
    if (keyIsObj) {
      console.log('entro a prop anidada');
      deepFreeze(obj[prop]);
      Object.freeze(obj[prop])
    } 
  }
}```

Hi!! 👋
Comparto mi solución

export function deepFreeze(obj) {
  if (typeof obj == "object") {
    Object.freeze(obj);
  } else {
    return obj;
  }
  for (let key in obj) {
    deepFreeze(obj[key]);
  };
  return obj;
};

MI RESPUESTA
.
.
.
.
.
.

.
.
.
.
.
.
.

Para que no tenga ningún problema al reconocer si realmente es una instancia del prototipo object, y no confundirlo con una instancia del prototipo array le añadí una función que hace una validación de tipo de dato mas estricta

export function deepFreeze(obj) {
  let isObject = typeOfElem(obj) == "object"
  if (isObject) {
    Object.freeze(obj);
    for (let value in obj) {
      deepFreeze(obj[value])
    }
    return obj
  } else {
    return obj
  }
}
function typeOfElem(elem) {
  let result;

  switch (Object.prototype.toString.call(elem)) {
    case "[object Object]":
      result = "object";
      break;
    case "[object Array]":
      result = "array";
      break;
    default:
      result = "other";
      break;
  }
  return result;
}

// Esta función comprueba si un objeto es válido (no nulo) y es un objeto.
function isObject(obj) {
  return obj !== null && typeof obj === "object";
}

// Esta es la función principal que se exporta. Toma un objeto y lo congela de forma recursiva.
export function deepFreeze(obj) {
  // Primero, comprobamos si el objeto es un objeto válido y si aún no está congelado.
  if (isObject(obj) && !Object.isFrozen(obj)) {
    // Luego, obtenemos las claves del objeto y las recorremos con forEach().
    Object.keys(obj).forEach((key) => {
      // Para cada clave, llamamos a la función deepFreeze() de forma recursiva.
      deepFreeze(obj[key]);
    });
    // Después de que todas las claves hayan sido congeladas, congelamos el objeto completo.
    Object.freeze(obj);
  }
  // Devolvemos el objeto, que ahora está completamente congelado.
  return obj;
}

En resumen, la función deepFreeze toma un objeto y lo congela de forma recursiva. Para hacer esto, comprueba si el objeto es válido y no está congelado, luego recorre todas sus claves y congela de forma recursiva cada subobjeto, antes de finalmente congelar el objeto completo. La función devuelve el objeto congelado.

ALERTA SPOILER
.
.
.
.
.
.
.
.
.
.
.
Object.freeze() impide que se le agreguen nuevas propiedades e impide que se puedan eliminar las propiedades ya existentes a un objeto, volviendo “false” las propiedades writable y configurable. Pero este metodo solo hace un shallow freeze, porque si dentro del objeto tenemos un objeto, las propiedades de este si podrán ser modificadas. Pero gracias a la recursividad podemos hacer un deep freeze, que aplica Object.freeze() a cada una de las propiedades del objeto:

 export function deepFreeze(obj) {
  if (typeof (obj) !== "object") return

  Object.freeze(obj);

  for (let key in obj) {
    deepFreeze(obj[key])
  }
} 

Me complique un poco por el metodo Object.freeze pero lo logre.

export function deepFreeze(obj) {
  if (typeof obj == "object") {
    Object.freeze(obj);
    for (let key in obj) {
      if (typeof obj[key] == "object") {
        deepFreeze(obj[key])
      }
    }
    return obj;
  } else {
    return obj;
  }
}

Intente tres soluciones funcionales, eso si refactorice en cada una cada vez mas hasta llegar a esta:

function deepFreeze(obj) {
  
for (item in obj)
  if(typeof obj[item] === 'object')
     deepFreeze(Object.freeze(obj[item]))   
 return Object.freeze(obj)
}

Valido en mi RunJS y en consola y es funcional a parecer, recorrí todos los elementos intentando elminiar y queda completamente Freeze. Pero al final, solo valida la solución dada en el ejercicio.

Alguien me puede explicar por que el playground me da un error a mi solucion y que de diferente es a lo que ellos califican como bueno?

Mi codigo:

function deepFreeze(obj) {
  for (key in obj) {
    if (typeof obj[key] == "object") {
      deepFreeze(obj[key])
    }
  }
  return Object.freeze(obj)
}

El del playground:

export function deepFreeze(obj) {
  Object.keys(obj).forEach(prop => {
    if (typeof obj[prop] === 'object') deepFreeze(obj[prop]);
  });
  return Object.freeze(obj);
}

No funciona el playground

Esta es mi solución

export function freezer(param) {
  Object.keys(param).forEach((element) => {
    if (typeof param[element] == "object") {
      freezer(param[element]);
    } else {
      Object.freeze(param);
    }
  });
}

PERO
A pesar de que es muy similar a la solución y que ya lo corrí en mi VSCode con toda la depuración y corroboro que funciona, esta página no me vale el ejercicio …

El objetivo de este reto es que al intentar modificar las propiedades de error, por eso en la pestaña de vista da error por mas que sea la solución correcta \- \- ```js export function deepFreeze(obj) { if (typeof obj == 'object') { Object.freeze(obj) } else { return obj; } for (let ele in obj) { deepFreeze(obj[ele]); } return obj; } ```
Son muy buenos los ejercicios en este playground, pero el planteamiento esta malo, no especifica que tambien hay que bloquear el objecto original, no solo las propiedades que sean objecto. De todas formas dejo mi solucion: ```js export function deepFreeze(obj) { // Tu código aquí 👈 for(let prop in obj) { if(typeof(obj[prop]) === 'object' && !Array.isArray(obj[prop])) { console.log(obj[prop]) obj[prop] = deepFreeze(obj[prop]) Object.freeze(obj[prop]) } } return Object.freeze(obj) } ```*export* *function* deepFreeze(obj) {    *// Tu código aquí 👈*    *for*(*let* prop in obj) {        *if*(typeof(obj\[prop]) === 'object' && !*Array*.isArray(obj\[prop])) {            console.log(obj\[prop])            obj\[prop] = deepFreeze(obj\[prop])            *Object*.freeze(obj\[prop])        }    }    *return* *Object*.freeze(obj)}
Leyendo la documentación de MDN de deep freeze ( <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze> ) he podido construir un pequeño ejemplo que me ha ayudado muchísimo a resolver el playground (aunque daba error en Vista 🤷🏼, ha pasado todos los tests de 'Correr Pruebas' 🥲). Por si a alguien le ayuda copiarlo en consola y probarlo: ```js const nestedObject = { name: 'blop', address: { street: `blop's street`, moved: 0, }, moveOn (newAddress) { this.address.street = newAddress this.address.moved = this.address.moved + 1 } } function deepFreeze(nestedObject) { const nestedObjKeys = Object.keys(nestedObject) for(let key of nestedObjKeys) { const nestedValue = nestedObject[key] if(nestedValue && typeof nestedValue === 'object') { deepFreeze(nestedValue) } } return Object.freeze(nestedObject) } ```
Hola, esta es mi solución. funciona sin importar cuantos objetos esten anidados dentro de si. ```js function deepFreeze(param) { if (typeof param !== 'object') return; Object.freeze(param); for (let key in param) { const value = param[key]; deepFreeze(value); } } ```
Listo :)export function deepFreeze(obj) { //valido si el parametro es un objeto if (isObject(obj)) { Object.freeze(obj); //recorro el objeto para aplicarla misma funcion for (let element in obj) { deepFreeze(obj\[element]); } }} //hice la funcion para validar si la función es un objeto o nelfunction isObject(cosito) { return (typeof cosito === 'object' && cosito !== null);} ```js export function deepFreeze(obj) { //valido si el parametro es un objeto if (isObject(obj)) { Object.freeze(obj); //recorro el objeto para aplicarla misma funcion for (let element in obj) { deepFreeze(obj[element]); } } } //hice la funcion para validar si la función es un objeto o nel function isObject(cosito) { return (typeof cosito === 'object' && cosito !== null); } ```

Aquí esta mi solución:

function deepFreeze(obj) {
	if (typeof obj === "object") {
		for (let key in obj) {
			if (typeof obj[key] === "object") {
				deepFreeze(obj[key]);
				Object.freeze(obj[key]);
			}
		}
		Object.freeze(obj);
	}
}

deepFreeze(juan);
sol. ```js function deepFreeze(obj) { // Tu código aquí 👈 if(isObject(obj) == false) { throw new Error("el parametro pasado no es un objeto") } Object.freeze(obj); for (const key in obj) { const keyIsObject = isObject(obj[key]); if (keyIsObject) { deepFreeze(obj[key]); } } } ```
Todavía no funciona en el playground, sin embargo, en consola si me funcionó: ```js function deepFreeze(obj) { Object.freeze(obj); for (key in obj) { if (typeof obj[key] == "object") { deepFreeze(obj[key]); } } } ```
Hola chicos, según lo que entendí, tenemos que bloquear todos los atributos de tipo objeto(incluyendo arrays y los objetos anidados) usando Object.freeze. Les comparto mi código: ```js export function deepFreeze(obj) { if (typeof obj == "object") { for (let propiedad in obj) { if (typeof obj[propiedad] == "object") { deepFreeze(obj[propiedad]); } } Object.freeze(obj); } } ```Básicamente mediante el uso de la recursividad bloqueamos primeramente los objetos anidados y finalizamos bloqueando el objeto Juan.
Aquí mi solución . . . . . . . . . . ```js export function deepFreeze(obj) { // Tu código aquí 👈 const isObject = typeof obj === 'object' if (isObject) { Object.freeze(obj) } for (let key in obj) { if (typeof obj[key] === 'object') { deepFreeze(obj[key]) } } } ```
export function deepFreeze(obj) {
  // Congela el objeto completo para evitar modificaciones
  Object.freeze(obj);
  // Itera a través de todas las propiedades de juan
  for (let key in obj) {
    // Comprueba si el valor es un objeto (excluyendo null)
    if (typeof (obj[key]) === 'object' && obj[key] !== null) {
      // Congela recursivamente los objetos anidados para lograr la inmutabilidad profunda
      deepFreeze(obj[key]);
    }
  }
}

Solución 👈🤯🔥

Me gustó mucho esta solución porque aprendí y recordé varias cosas, este código está muy interesante para practicar y aprender… 👉 Código en GitHub

reto solucionado
mi codigo

export function deepFreeze(obj) {
  // Tu código aquí 👈
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      deepFreeze(obj[key]) 
    }
  }

  return Object.freeze(obj)
}

Tengo un problema y es que en mi terminal y cuando trato de eliminar o editar desde mi visual estudio code, este no me deja pero aun así no pasa en los tests o sera que me estoy equivocando🤔

const juan = {
  name: "Juanito",
  approvedCourses: ["Curso 1", "Curso 2"],
  caracteristicas: {
    age: 18,
    colorCabello: "Negro",
    gustos: {
      musica: ["rock", "punk", "ska"],
      peliculas: ["drama", "horros", "comedia"],
    },
  },
  addCourse(newCourse) {
    console.log("This", this);
    console.log("This.approvedCourses", this.approvedCourses);
    this.approvedCourses.push(newCourse);
  },
};

function isObject(obj) {
  return typeof obj === "object" && !isArray(obj);
}

function isArray(obj) {
  return Array.isArray(obj);
}

function deepFreeze(obj) {
  let copyFreeze;

  if (isObject(obj)) {
    copyFreeze = {};
  } else if (isArray(obj)) {
    copyFreeze = [];
  } else {
    return Object.freeze(obj);
  }

  for (const key in obj) {
    copyFreeze[key] = deepFreeze(obj[key]);
  }

  Object.freeze(copyFreeze);
  return copyFreeze;
}

const COPY = deepFreeze(juan);

COPY.caracteristicas.age = 20;
delete COPY.name;
delete COPY.caracteristicas;
COPY.caracteristicas = [];
COPY.caracteristicas.gustos = "";
COPY.caracteristicas.gustos.musica = [];
delete COPY.caracteristicas.age;
delete COPY.caracteristicas.gustos;
delete COPY.caracteristicas.gustos.musica;
delete COPY.caracteristicas.gustos.musica[0];
delete COPY.addCourse;

console.log(COPY);
console.log(COPY.caracteristicas.gustos.musica);

Y estos son todos los tests que le hice, pero bueno puede que me este equivocando, no quito esa posibilidad. Bueno esta es mi solución 😅

```js function deepFreeze(obj) { if (typeof obj !== 'object') return; Object.freeze(obj); for (let key in obj) { deepFreeze(obj[key]); } return obj; } ```function deepFreeze(obj) { if (typeof obj !== 'object') return; Object.freeze(obj); for (let key in obj) { deepFreeze(obj\[key]); } return obj;}
const juan = {
  name: "Juanito",
  approvedCourses: ["Curso 1","Curso 2"],
  caracteristicas: {
    age: 18,
    colorCabello: 'Negro',
    gustos: {
      musica: ['rock', 'punk', 'ska'],
      peliculas: ['drama', 'horros', 'comedia'],
    },
  },
  addCourse(newCourse) {
    console.log("This", this);
    console.log("This.approvedCourses", this.approvedCourses);
    this.approvedCourses.push(newCourse);
  }
};
no me anda ningun codigo.. cual es la solucion oficial\_... deberia haber una

Estoy entendiendo cada vez más estos conceptos, pero creo que aún me falta más práctica xd

Otra forma de solucionarlo…

export function deepFreeze(obj) {

  //console.log(obj);
  if (typeof obj == 'object') {

    let keys = Object.entries(obj);
    for (let i = 0; i < keys.length; i++ ) {
      //console.log(obj[keys[i][0]]);
      if (typeof obj[keys[i][0]] == 'object') {        
        deepFreeze(obj[keys[i][0]]);        
      }      

    }

    Object.freeze(obj);

  }
  
}

Propuesta 😃

export function deepFreeze(obj) {
  const isThisAObject = subject => typeof subject === "object" && subject !== null;

  for (let key in obj) {
    if (isThisAObject(obj[key])) {
      deepFreeze(obj[key]); // Primero llama recursivamente a deepFreeze
      Object.freeze(obj[key]); // Luego congela el objeto
    }
  }
  return Object.freeze(obj); // Congela y retorna el objeto principal
}

mi solucion
solo corre en la consola del navegador o del vscode

export function deepFreeze(obj) {

  if (typeof (obj) == 'object') {

    for (const key of Object.keys(obj)) {
      Object.freeze(obj[key]);

    }
    Object.freeze(obj)
  } else {
    return obj
}```

Esta fue mi solución para el desafio:

function deepFreeze(obj){

  Object.freeze(obj)

  for(let key in obj){
    if(typeof obj == 'object'){
      deepFreeze(obj[key])
    }
  }

  return obj
}
<h6>que wena practica</h6>
export function deepFreeze(obj) {
  for (let key in obj) {
    if (typeof obj[key] == 'object') {
      Object.freeze(obj[key])
    deepFreeze(obj[key])
  }
  }
  Object.freeze(obj)
}

Mi solucion:

export function deepFreeze(obj) {
  // Tu código aquí 👈
  if (typeof obj !== 'object' || obj === null) {
    return;
  }
  Object.freeze(obj);
  for (let key of obj) {
    if (!Object.isFrozen(obj[key]))
      deepFreeze(obj[key]);
  }
  return obj;
}

mi aporte

export function deepFreeze(obj) {
  // Primero, se congela el objeto actual
  Object.freeze(obj);

  // Recorrer todas las propiedades del objeto
  for (let propKey in obj) {
    if (obj.hasOwnProperty(propKey)) {
      let propValue = obj[propKey];

      // Se verifica si la propiedad es un objeto y no nulo
      if (typeof propValue === "object" && propValue !== null) {
        // Llamada recursiva a deepFreeze para congelar el objeto anidado
        deepFreeze(propValue);
      }
    }
  }

  return obj;
}
export function deepFreeze(obj) {
  // Primero, congelamos el objeto actual
  Object.freeze(obj);

  // Recorremos todas las propiedades del objeto
  for (let prop in obj) {
    if (obj.hasOwnProperty(prop) && typeof obj[prop] === 'object' && obj[prop] !== null) {
      // Si la propiedad es un objeto, lo congelamos también de forma recursiva
      deepFreeze(obj[prop]);
    }
  }

  return obj;
}

Aqui esta mi solución:
.
.
.
.

.
.
.
.
.
.
.
.
.

export function deepFreeze(obj) {
  // Tu código aquí 👈
  if (typeof obj !== 'object') return obj;

  Object.freeze(obj);

  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      deepFreeze(obj[key]);
    }
  }

  return obj;
}

Mi solución…pero no reconoce la prueba…lo probé en VS Code y si funciona:

function deepFreeze(obj) {
    for (key in obj) {
        if (typeof obj[key] == "object") {
            obj[key] = deepFreeze(obj[key]);
        }
    }
    return Object.freeze(obj);
}
deepFreeze(juan);

console.log(Object.getOwnPropertyDescriptors(juan));
console.log(Object.getOwnPropertyDescriptors(juan.caracteristicas));
console.log(Object.getOwnPropertyDescriptors(juan.caracteristicas.gustos));

Heyy acá una solución:

.
.
.
.
.
.

function deepFreeze(obj) {
  // Primero, congelamos el objeto raíz
  Object.freeze(obj);

  // Luego, iteramos sobre todas las propiedades del objeto
  Object.getOwnPropertyNames(obj).forEach(prop => {
    const value = obj[prop];

    // Si la propiedad es un objeto y no está congelada, lo congelamos recursivamente
    if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {
      deepFreeze(value);
    }
  });

  return obj; // Retornamos el objeto congelado
}

¡Pero que suerte!
¡A la primera!


export function deepFreeze(obj) {
  Object.freeze(obj);

  for (let key in obj) {
    if (typeof obj[key] === "object") {
      deepFreeze(obj[key]);
    }
  }
  return obj;
}
export function deepFreeze(obj) {
  Object.freeze(obj);
  for (let key in obj) {
    if (!Array.isArray(obj[key]) && typeof obj[key] === 'object') {
      deepFreeze(obj[key]);
    }
  }
}

Hola, este es mi codigo!

const isObject = (object) => {
    return typeof object == "object"
}//es un array o un objeto


function deepFreeze(obj) {

    for (key in obj) {
        let keyIsObject = isObject(obj[key])

        if(keyIsObject) {
             deepFreeze(obj[key])
        } else {
            Object.freeze(obj[key])
        }
    }

    return Object.freeze(obj)

}

MI solución:

Es increible lo mucho que siento que he avanzado; al principio llegaba a ver este código y me desmayaba pensando en lo mucho que tardaría en entenderlo.

Ahora siento lo mismo cuando veo algo de React, pero se que de a poco llegaré ahí así como llegué hasta aquí.

function deepFreeze(obj) {
  const juan = {
    name: "Juanito",
    approvedCourses: ["Curso 1", "Curso 2"],
    caracteristicas: {
      age: 18,
      colorCabello: "Negro",
      gustos: {
        musica: ["rock", "punk", "ska"],
        peliculas: ["drama", "horros", "comedia"],
      },
    },
    addCourse(newCourse) {
      console.log("This", this);
      console.log("This.approvedCourses", this.approvedCourses);
      this.approvedCourses.push(newCourse);
    },
  };

  if (obj === undefined) {
    obj = juan;
  };
  Object.freeze(obj);
  for (let property in obj) { 
    if (typeof obj[property] === "object") {
      if (!Array.isArray(obj[property])) {
        deepFreeze(obj[property]);
      }
    }
  }

  return obj;
}
console.log(deepFreeze())

Mi solucion aunque en playground no funcionase u.u

function deepFreeze(obj) {
    for (let key in obj) {
      if (typeof key[0] === "object" || Array.isArray(key[0])) {
        deepFreeze(Object.freeze(obj[key]))
      }
      return Object.freeze(obj)
    }
  }

¡Saludos!
Aquí mi solución:

function deepFreeze(obj) {
   if (typeof obj !== "object" || obj === null) return;

   Object.freeze(obj);

   for (let key of Object.keys(obj)) deepFreeze(obj[key]);
   
   return;
}

Holis, no pude hacer nada. Me aparece la pantalla en blanco con un error:
Application error: a client-side exception has occurred (see the browser console for more information).

Bastante difícil de entender, al menos para mi.

export function deepFreeze(obj) {

  const propNames = Object.getOwnPropertyNames(obj);

  for (let a of propNames) {
    let prop = obj[a];

    if (typeof prop === 'object' && prop !== null) {
      deepFreeze(prop);
    }
  }
  return Object.freeze(obj);
}

No me anda, lo hice así:

export function deepFreeze(obj) {
  for (key in obj) {
    if (typeof obj[key] === 'object') {
      deepFreeze(obj[key])
    }
    return Object.freeze(obj)
  }
}

¿Alguien sabe por qué?

Object.keys(obj).forEach(element => {
    if (typeof obj[element] === 'object') deepFreeze(obj[element])
  });
  return Object.freeze(obj)
undefined