Estoy implementando un cifrado recursivo para objetos de Javascript, pero la solución que se me ocurrió no es funcional. Esto ha causado algunos errores extraños ya que manipula el objeto directamente. ¿Hay alguna forma de hacer que esto sea funcional (devolver un nuevo objeto encriptado)?
No sé cómo hacer que esto permanezca recursivo y al mismo tiempo devolver un nuevo objeto (funcional). Específicamente, esto es encryptObject(dd)
class Security { static encryptText = (text) => { //function to encrypt text/strings }; static encryptObject(dd) { try { for (let d in dd) { if (!dd[d]) { continue; } else if (typeof dd[d] !== "object") { dd[d] = this.encryptText(dd[d]); } else { this.encryptObject(dd[d]); } } } catch (e) { console.log(e.message + `error encrypting`); } } const data = {dog:"john", cat:"anders", weapons:{laser:"3",sword:"1"}} Security.encrypt(data)Me gustaría llamar a la función de esta manera en su lugar
const data = {dog:"john", cat:"anders", weapons:{laser:"3",sword:"1"}} const encryptedData = Security.encrypt(data)¿Simplemente crear y devolver un nuevo objeto en su lugar?
static encryptObject(objectToEncrypt) { try { const newObj = {}; for (const [key, value] of Object.entries(objectToEncrypt)) { if (!value) { newObj[key] = value; } else if (typeof value !== "object") { newObj[key] = this.encryptText(value); } else { newObj[key] = this.encryptObject(value); } } return newObj; } catch (e) { console.log(e.message + `error encrypting`); } }Una forma de escribir esto es basarlo en una función de map que maneja arreglos y objetos. Con esto, y una función identidad simple (x) => x , podemos escribir esto como
const encryptObj = (o) => (typeof o == 'object' ? map (encryptObj) : typeof o == 'string' ? encryptText : x => x) (o) Según si tenemos un objeto, una cadena u otra cosa, elegimos mapear recursivamente el resultado sobre los niños, llamar al cifrado de texto o devolver el valor sin cambios. Usando una función rot13 simple como cifrado de texto ficticio, podríamos escribir una función simple como esta:
const map = (fn) => (o) => Array .isArray (o) ? o .map (fn) : Object .fromEntries (Object .entries (o) .map (([k, v]) => [k, encryptObj (v)])) // simple rot13 const encryptText = (cs) => [...cs] .map ((c, i, _, cc = cs.charCodeAt (i)) => cc > 64 && cc <= 91 ? String .fromCharCode (65 + ((cc - 52) % 26)) : cc > 96 && cc <= 123 ? String .fromCharCode (97 + ((cc - 84) % 26)) : c) .join ('') const encryptObj = (o) => (typeof o == 'object' ? map (encryptObj) : typeof o == 'string' ? encryptText : x => x) (o) console .log (encryptObj ({ a: 'foo', b: ['bar', 'baz', 'qux'], c: false, d: { e: { f: { g: { h: 42, i: 'CORGE', j: { k: 'Grault' } } }, l: 99 } } })) .as-console-wrapper {max-height: 100% !important; top: 0} Y, por supuesto, puede convertir esto en una función estática de su clase rociando algo de this alrededor del código.