Using javascript and jquery, to populate related select boxes with array structure

后端 未结 4 1201
日久生厌
日久生厌 2020-11-28 03:55

Using answers to this question, I have been able to populate a select box based on the selection of another select box. ( I posted my answer here) Pulling the data from an a

4条回答
  •  南笙
    南笙 (楼主)
    2020-11-28 04:36

    I prefer data structure like this:

    var carMakers = [
        { name: 'Honda', models: [
                { name: 'Accord', features: ['2dr', '4dr'] },
                { name: 'CRV', features: ['2dr', 'Hatchback'] },
                { name: 'Pilot', features: ['base', 'superDuper'] }
            ]},
    
        { name: 'Toyota', models: [
                { name: 'Prius', features: ['green', 'superGreen'] },
                { name: 'Camry', features: ['sporty', 'square'] },
                { name: 'Corolla', features: ['cheap', 'superFly'] }
            ]}
    ];
    

    Given the three select lists with id's: 'maker', 'model' and 'features' you can manipulate them with this (I believe this is pretty self explanatory):

    // returns array of elements whose 'prop' property is 'value'
    function filterByProperty(arr, prop, value) {
        return $.grep(arr, function (item) { return item[prop] == value });
    }
    
    // populates select list from array of items given as objects: { name: 'text', value: 'value' }
    function populateSelect(el, items) {
        el.options.length = 0;
        if (items.length > 0)
            el.options[0] = new Option('please select', '');
    
        $.each(items, function () {
            el.options[el.options.length] = new Option(this.name, this.value);
        });
    }
    
    // initialization
    $(document).ready(function () {
        // populating 1st select list
        populateSelect($('#maker').get(0), $.map(carMakers, function(maker) { return { name: maker.name, value: maker.name} }));
    
        // populating 2nd select list
        $('#maker').bind('change', function() {
            var makerName = this.value,
                carMaker = filterByProperty(carMakers, 'name', makerName),
                models = [];
    
            if (carMaker.length > 0)
                models = $.map(carMaker[0].models, function(model) { return { name: model.name, value: makerName + '.' + model.name} });
    
            populateSelect($('#model').get(0), models);
            $('#model').trigger('change');
        });
    
        // populating 3rd select list
        $('#model').bind('change', function () {
            var nameAndModel = this.value.split('.'),
                features = [];
    
            if (2 == nameAndModel.length) {
                var makerName = nameAndModel[0], 
                    carModel = nameAndModel[1],
                    carMaker = filterByProperty(carMakers, 'name', makerName);
    
                if (carMaker.length > 0) {
                    var model = filterByProperty(carMaker[0].models, 'name', carModel)
    
                    if (model.length > 0)
                        features = $.map(model[0].features, function(feature) { return { name: feature, value: makerName + '.' + carModel + '.' + feature} })
                }
            }
    
            populateSelect($('#feature').get(0), features);
        })
    
        // alerting value on 3rd select list change
        $('#feature').bind('change', function () { 
            if (this.value.length > 0)
                alert(this.value);
        })
    });
    

提交回复
热议问题