Wanted to make a generic cascading dropdown but am weak in recursion
The code is supposed to end up with
- One select for items - clothes or gadgets - when a choice is made
- One select with either Levis/Gucci or LG/Apple - when a choice is made
- One select with either Levis jeans or jackets or Gucci shoes or dresses - when a choice is made
- One select with Levis jeans sizes OR levis jacket sizes OR
- One select with Gucci shoe sizes OR Gucci dress sizes
OR
- One select with either LG TVs or phones or Apple Macbooks or iPhones - when a choice is made
- One select with LG TV sizes OR LG Phone sizes OR
- One select with Apple Macbook sizes OR Apple iPhone sizes
I lost my train of thoughts when I got to actually recurse - or perhaps filtering can be used?
I assume one could make a set of paths and then just show/hide depending on path
const selObject = {
"-- Select Item --": {
"Clothes": {
"-- Select brands --": {
"Levis": {
"-- Select product --": {
"Jeans": {
"-- Select size --": [
"38",
"39",
"40"
]
},
"Jackets": {
"-- Select size --": [
"41",
"42",
"43"
]
}
}
}, // end Levis
"Gucci": {
"-- Select product --": {
"Shoes": {
"-- Select size --": [
"45",
"50",
"55"
]
},
"Dresses": {
"-- Select size --": [
"8",
"9",
"10"
]
}
}
} // end Gucci
} // end brands
}, // End clothes
"Gadgets": {
"-- Select brands --": {
"LG": {
"-- Select product --": {
"TVs": {
"-- Select size --": [
"38",
"39",
"40"
]
},
"Phones": {
"-- Select size --": [
"8",
"9",
"10"
]
}
}
}, // end Levis
"Apple": {
"-- Select product --": {
"Macbooks": {
"-- Select size --": [
"15",
"17",
"21"
]
},
"iPhones": {
"-- Select size --": [
"8",
"9",
"10"
]
}
}
} // end Apple
} // end brands
} // end Gadgets
} // end items
} // end
function createSel(obj) {
Object.keys(obj).forEach(function(item) {
if (typeof obj[item] == "object") {
var list = obj[item];
//console.log(item,typeof list);
if (typeof list == "object") {
if (list.length) {
list.forEach(function(val) {
console.log('<br/>'+val)
})
}
else createSel(list)
}
} else {
console.log("no", obj[item])
}
});
}
window.onload = function() {
createSel(selObject)
}
<form name="myform" id="myForm">
<div id="selContainer">
</div>
</form>
-- Select Item --
etc. always “one level up”? I am assuming that the first select is supposed to show the three options “-- Select Item --”, “Clothes”, and “Gadgets”, right? First as placeholder, others as the actual valid choices. I imagine it might be easier if you had those three on the same level in your data structure to begin with. – Frendel