Nested Select Experiment

by Dominic Myers

HTML

<select id="select">
    <option class="default" selected="selected">All</option>
    <option>&nbsp;&nbsp;One</option>
    <option>&nbsp;&nbsp;Two</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Two point one</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Two point two</option>
    <option>&nbsp;&nbsp;Three</option>
    <option>&nbsp;&nbsp;Four</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Four point one</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Four point two</option>
    <option>&nbsp;&nbsp;Five</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Five point one</option>
    <option>&nbsp;&nbsp;&nbsp;&nbsp;Five point two</option>
    <option>&nbsp;&nbsp;Six</option>
</select>

JavaScript

var nbsp = new RegExp(String.fromCharCode(160), "g");

function howManyRepeated(str, search) {
    try {
        return str.toLowerCase().split("").sort().join("").match(search).length;
    } catch (e) {
        return 0;
    }
}

function replaceNbsps(str, search) {
    return str.replace(search, "");
}
var selectObject = {};
$(function() {
    var parent = [];
    var options = $("#select option:not(.default)");
    options.each(function(k, v) {
        var level = howManyRepeated($(v).text(), nbsp) / 2;
        if (level === 1) {
            parent = [replaceNbsps($(v).text(), nbsp)];
            selectObject[parent[0]] = {};
        }
        if (level > 1) {
            while (parent.length > level - 1) {
                parent.pop();
            }
            parent.push(replaceNbsps($(v).text(), nbsp));
            var evalString = "selectObject";
            for (var i = 0; i < parent.length; i++) {
                evalString += '["' + parent[i] + '"]';
            }
            evalString += " = {};";
            eval(evalString);

        }
    });
    console.log(JSON.stringify(selectObject));
});