繁体   English   中英

过滤多个选项上的数组以返回新选择中的选项

[英]Filtering array on multiple options to return options in new select

我支持一些旧代码,在实现新功能时遇到一些问题。

我有2个多重选择选项,第一个显示州列表,第二个显示城市列表。 想法是,将根据第一选择中的选定州来过滤城市列表。

当前,城市包含在javascript数组中,该数组在if语句中用于将相关选项附加到select上,但是,这仅适用于单个州的选择。

如何在多个州选择中过滤城市?

我尝试了很多if语句组合,但没有运气。 我的jquery知识显然很缺乏,并且在google / stackoverflow中没有找到任何类似的东西-但是,我很欣赏我可能是从错误的角度来解决这个问题。

<form name="newform">
<select multiple size="10" name="getStateSelect" id="getStateSelectID" onchange="GetSeries(document.newform.getStateSelect.options [document.newform.getStateSelect.selectedIndex].value);">
    <option value="1">Alaska</option>
    <option value="2">Arizona</option>
    <option value="3">Californa</option>
</select>
<br />
<br />
<select id="getCitySelect" multiple="multiple" size="10"></select>
</form>


var fsArray = [{id: 1,stateid: 1,cityname: "Anchorage"}, 
    {id: 2,stateid: 1,cityname: "Fairbanks"}, 
    {id: 3,stateid: 1,cityname: "Wasilla"}, 
    {id: 4,stateid: 2,cityname: "Flagstaff"}, 
    {id: 5,stateid: 2,cityname: "Phoenix"}, 
    {id: 6,stateid: 2,cityname: "Tucson"}, 
    {id: 7,stateid: 3,cityname: "Fremont"}, 
    {id: 8,stateid: 3,cityname: "Lakeport"}, 
    {id: 9,stateid: 3,cityname: "Los Angeles"}];

function GetSeries(i) {
var SeriesSelectBox = document.getElementById("getCitySelect");
SeriesSelectBox.options.length = 0;

for (j in fsArray) {
    if (fsArray[j].stateid == i) {
        var seriesLength = SeriesSelectBox.options.length;
        SeriesSelectBox.options[seriesLength] = new Option(fsArray[j].cityname, fsArray[j].id);
    }
}
}

http://jsfiddle.net/fcp3h7mw/1/

任何帮助,不胜感激! 谢谢

我只是在getStateSelectID值上添加了一个for循环,以检查每个元素是否处于选择状态,如果选中,它将运行您的循环以添加城市。

小提琴: http : //jsfiddle.net/fcp3h7mw/5/

JavaScript的:

var fsArray = [
    {id:1,stateid:1,cityname:"Anchorage"},
    {id:2,stateid:1,cityname:"Fairbanks"},
    {id:3,stateid:1,cityname:"Wasilla"},
    {id:4,stateid:2,cityname:"Flagstaff"},
    {id:5,stateid:2,cityname:"Phoenix"},
    {id:6,stateid:2,cityname:"Tucson"},
    {id:7,stateid:3,cityname:"Fremont"},
    {id:8,stateid:3,cityname:"Lakeport"},
    {id:9,stateid:3,cityname:"Los Angeles"}
];

function GetSeries(i) {     
    var id = document.getElementById("getStateSelectID");
    var SeriesSelectBox = document.getElementById("getCitySelect");
    SeriesSelectBox.options.length = 0;     
    var states = 0;

    for (states=0; states < id.length; states++) {
        if(id[states].selected){
            for (j in fsArray) {
                if (fsArray[j].stateid == id[states].value) {
                    var seriesLength = SeriesSelectBox.options.length;
                    SeriesSelectBox.options[seriesLength] = new Option(fsArray[j].cityname, fsArray[j].id);     
                }
            }
        }   
    }
}

标记:在标记中,我还提取了很多函数调用

<select multiple size="10" name="getStateSelect" id="getStateSelectID" onchange="GetSeries();">

我已经更新了您的代码,以便能够选择多个州并显示正确的城市。

本质上,您需要获取属性为“ selected”的选项列表,并将选项值存储在数组中(onchange)

之后,您将遍历新数组并与该数组中的值而不是单个值进行匹配。

这是更新的代码: http : //jsfiddle.net/biz79/fcp3h7mw/3/

var fsArray = [
    {id:1,stateid:1,cityname:"Anchorage"},
    {id:2,stateid:1,cityname:"Fairbanks"},
    {id:3,stateid:1,cityname:"Wasilla"},
    {id:4,stateid:2,cityname:"Flagstaff"},
    {id:5,stateid:2,cityname:"Phoenix"},
    {id:6,stateid:2,cityname:"Tucson"},
    {id:7,stateid:3,cityname:"Fremont"},
    {id:8,stateid:3,cityname:"Lakeport"},
    {id:9,stateid:3,cityname:"Los Angeles"}
];

function getSeries() {      
    var SeriesSelectBox = document.getElementById("getCitySelect");
    SeriesSelectBox.options.length = 0;     

    var arr = getStateSelected();

    for (var i = 0; i< arr.length; i++) {

        for (var j in fsArray) {
            if (fsArray[j].stateid == arr[i]) {
                var seriesLength = SeriesSelectBox.options.length;
                SeriesSelectBox.options[seriesLength] = new Option(fsArray[j].cityname, fsArray[j].id);     
          }
        }
    }
}

function getStateSelected() {
    var sel = document.querySelectorAll('#getStateSelectID option');
    var arr = [];

    for (var i = 0; i< sel.length; i++ ) {
        if ( sel[i].selected ) {
          arr.push(sel[i].value);   
        }
    }
    return arr;
}

希望这可以帮助。 如果您有任何问题,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM