Last night, I created an object from an array of strings with dot notation; I needed to do that because I had previously flattened an object into those strings. I did this long and laboriously, but I asked a colleague to see if he could figure out how to do it using recursion. He did, and I'd like to share it here.
If we have this object:
{ "thingOne": { "thingTwo": { "thingThree": true, "thingFour": true } }, "thingyOne": { "thingyTwo": { "thingyThree": true, "thingyFour": true } } }
Then this code:
(() => { const obj = { "thingOne": { "thingTwo": { "thingThree": true, "thingFour": true } }, "thingyOne": { "thingyTwo": { "thingyThree": true, "thingyFour": true } } } const getObjStringsArr = (o = {}, arr = [], name = '') => { Object.keys(o).forEach(key => { if (o[key] === true) { arr.push(`${name}${key}`) } else { const nested = getObjStringsArr(o[key], arr, `${name}${key}.`) arr.concat(nested) } }); return arr } console.log(getObjStringsArr(obj)) })()
It's brilliant having colleagues; it's even better having colleagues with huge brains! Thanks, Hamish!
It's not necessarily faster than my cludge, but it is far more elegant!