This was puzzling me all afternoon, and I came up with a bloody terrible work-around using eval
, this evening I decided to do a little 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, thisis lovely though! It produces this lovely object:
{ "thingOne": { "thingTwo": { "thingThree": true, "thingFour": true } }, "thingyOne": { "thingyTwo": { "thingyThree": true, "thingyFour": true } } }
No comments:
Post a Comment