const data = { "desk": { "drawer": "stapler" }, "cabinet": { "top drawer": { "folder1": "a file", "folder2": "secrets" }, "bottom drawer": "soda" }, "item" : [ { "hello" : { "world" : "isHere" }, "test" : "1" }, { "hello" : { "world" : "isHere2" }, "test" : "2" }, ] }; const iterate = (obj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') { iterate(obj[key]) } else{ let value = obj[key]; let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}}; delete obj[key]; Object.assign(obj, newObj); } }) } iterate(data); console.log(data)Escribí una función recursiva que debería reemplazar cada par clave-valor (¡no propiedad!) con un objeto que especifico en el parámetro.
Sin embargo, si uso un bucle array.forEach dentro de la función, el obj pasado no está definido .
¿Qué me estoy perdiendo?
Ejemplo
const iterate = (obj, newObj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') { iterate(obj[key]) } else{ delete obj[key]; Object.assign(obj, newObj); } }) }Sin embargo, si defino el objeto dentro del forEach, funciona perfectamente...
const iterate = (obj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') { iterate(obj[key]) } else{ let value = obj[key]; // SEE HERE let newObj = {[key]: value, 'style' : {backGroundColor : 'red'}}; delete obj[key]; Object.assign(obj, newObj); } }) }¿Por qué Object.keys(obj).forEach no ve el parámetro pasado en la primera versión? y cual es la solución?
Debe pasar newObj cada vez que llame iterate dentro de Array.forEach() - iterate iterate(obj[key], newObj) :
const data = {"desk":{"drawer":"stapler"},"cabinet":{"top drawer":{"folder1":"a file","folder2":"secrets"},"bottom drawer":"soda"},"item":[{"hello":{"world":"isHere"},"test":"1"},{"hello":{"world":"isHere2"},"test":"2"}]}; const iterate = (obj, newObj) => { Object.keys(obj).forEach(key => { if (typeof obj[key] === 'object') { iterate(obj[key], newObj) } else { // delete obj[key]; // remove for example purposes Object.assign(obj, newObj); } }) } const newObj = { 'style': { backGroundColor: 'red' } }; iterate(data, newObj); console.log(data)