No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Playgrounds: Hacer freeze de un objeto de forma recursiva

10/20

Aportes 42

Preguntas 2

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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 鈥渧er solucion鈥. Asi como hay otras soluciones al ejercicio que el playground las toma como erradas. No permite solucionarlo por medio de for鈥n.

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 鈥渧ista鈥

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;
}

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 鈥渇alse鈥 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

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])
    } 
  }
}```

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 鈥

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鈥ero no reconoce la prueba鈥o 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