¿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'))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; }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)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.
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í.
false , debería convertirse en true y viceversa.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);