Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

132
Vistas
¿Cómo podemos modificar los valores de los objetos anidados sin modificar el objeto original en JavaScript?

¿Cómo puedo cambiar todos los valores de objetos anidados a "verdadero" sin usar espacio adicional? ¿Alguien puede ayudarme en esto? Lo he intentado de esta manera, pero no obtengo la lógica para manejar el objeto anidado.

PD: Por favor, no se concentre en que "verdadero" o "falso" está en la cadena porque son datos simulados, solo quiero que se implemente la lógica, lo cual no estoy haciendo.

 const config = { header:{"logo":"true","nav":"false","user":"false"}, searchResults:{"listView":"false","favorite":"true","share":"false","pagination":"true","filters":"true","sortBy":"false"}, sharedLinks:{}, learnerLinks:{}, lukePreview:{"toc":"false","controls":"false"}, lukeLaunch:{"toc":"false","controls":"false"}, misc:{"import":"true"} } function changeBoolean(obj,propName){ for(let i in obj){ if( typeof obj[i] === 'object'){ changeBoolean(obj[i],i) } } return obj } console.log(changeBoolean(config,'header'))

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Intenta asignar el resultado de la función, así:

 function changeBoolean(obj, propName) { for (let i in obj) { if (typeof obj[i] === "object") { obj[i] = changeBoolean(obj[i], propName); } else { obj[i] = "true"; } } return obj; }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Tu puedes hacer:

 const config = { header: { "logo": "true", "nav": "false", "user": "false" }, searchResults: { "listView": "false", "favorite": "true", "share": "false", "pagination": "true", "filters": "true", "sortBy": "false" }, sharedLinks: {}, learnerLinks: {}, lukePreview: { "toc": "false", "controls": "false" }, lukeLaunch: { "toc": "false", "controls": "false" }, misc: { "import": "true" } } const changeBoolean = o => Object.entries(o).reduce((a, [k, v]) => { a[k] = typeof v === 'object' ? changeBoolean(v) : 'true' return a }, {}) const newConfig = changeBoolean(config) console.log(newConfig)

about 4 years ago · Juan Pablo Isaza Denunciar

0

Usted escribe:

¿Podemos modificar los valores de los objetos anidados sin modificar el objeto original?

Esto suena como una contradicción. Cuando muta un objeto anidado, eso es una mutación del objeto original. Parece que quieres inmutabilidad. Esto significa que tan pronto como necesite un cambio en un objeto anidado, cree una copia del mismo que tenga el cambio, y este cambio se propagará hacia arriba, dando como resultado nuevas copias de objetos a medida que reciben un nuevo objeto "secundario".

...sin espacio adicional

No puedes tener ambos: o mutas el objeto original (en sus partes anidadas), o creas uno nuevo. Si no desea que el objeto original mute, obviamente necesita espacio para el objeto de reemplazo.

Algunos asuntos

  • Su objeto de entrada no tiene valores booleanos. Tiene cadenas como "falso" y "verdadero", pero no son valores booleanos. Así que sugiero trabajar con valores verdaderamente booleanos, sin las comillas

  • Su código no establece ninguna propiedad, por lo que nunca puede mutar nada en su objeto

  • Sus datos no tienen propiedad de "encabezado", por lo que esa sería otra razón por la cual su código no podría haber cambiado nada.

  • El segundo argumento que pasa a la llamada recursiva es i , que no es la propiedad que desea cambiar. Deberías pasar propName allí.

Algunas suposiciones que haré

  • La función es devolver el objeto original cuando encuentra que no hay ningún cambio. Este también debería ser el principio para los objetos anidados.
  • Cuando el objeto tiene una propiedad con el nombre dado, pero no es un booleano, entonces no se cambiará. Solo cuando el valor de esa propiedad sea un booleano, habrá un cambio.
  • El cambio alternará el valor booleano. Entonces, si era false , debería convertirse en true y viceversa.
  • Ningún objeto debe ser mutado . Si algo cambia, se debe crear y devolver un nuevo objeto.

Así es como lo haría. Este fragmento se ejecuta con 2 casos de prueba: uno que no cambia nada y otro que sí:

 function changeBoolean(obj, propName) { if (Object(obj) !== obj) return obj; // A primitive value: nothing changes let changed = false; let pairs = Object.entries(obj).map(function ([key, value]) { let changedValue = key === propName && typeof value === "boolean" ? !value : changeBoolean(value, propName); changed ||= changedValue !== value; return [key, changedValue]; }); return changed ? Object.fromEntries(pairs) : obj; } const config = { header:{logo: true, nav: false, user: false}, searchResults:{listView: false, favorite: true, share: false, pagination: true, filters: true, sortBy: false}, sharedLinks:{}, learnerLinks:{}, lukePreview:{toc: false, controls: false}, lukeLaunch:{toc: false, controls: false}, misc:{import: true} }; // Test 1 let header = changeBoolean(config, 'header'); console.log("header:", header === config ? "no change" : header); // Test 2 let toc = changeBoolean(config, 'toc'); console.log("toc:", toc === config ? "no change" : toc);

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda