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)