Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

139
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!