Image by Oleksandr Klymovych
I was puzzled about this all afternoon. I came up with a terrible workaround using eval
. Tonight, I did some more research and found this answer on StackOverflow. I've adapted it, and it seems to work a treat:
(() => { const obj = {} const expand = (output, mystr, value) => { const items = mystr.split(".") // split on dot notation let ref = output // keep a reference of the new object // loop through all nodes, except the last one for (let i = 0; i < items.length - 1; i++) { if (!ref[items[i]]) { // create a new element inside the reference ref[items[i]] = {} } ref = ref[items[i]] // shift the reference to the newly created object } ref[items[items.length - 1]] = value // apply the final value return output // return the full object } const arr = [ "thingOne.thingTwo.thingThree", "thingOne.thingTwo.thingFour", "thingyOne.thingyTwo.thingyThree", "thingyOne.thingyTwo.thingyFour" ] arr.forEach(a => { expand(obj, a, true) }) console.log(obj) })()
I was nearly there on my tod, TBH, but wussed out at the end; this is lovely! It produces this object:
{ "thingOne": { "thingTwo": { "thingThree": true, "thingFour": true } }, "thingyOne": { "thingyTwo": { "thingyThree": true, "thingyFour": true } } }
Top comments (0)