逻辑:组合下拉框来切换可见性

Logic: Combining dropdown boxes to toggle visibility

本文关键字:可见性 组合 逻辑      更新时间:2023-09-26

我有100行数据,每一行有3个属性:年龄,位置,性别。

我有3个选择框,根据年龄,位置和性别筛选我的数据。

我的函数setVisible(true)或setVisible(false)使行隐藏或可见。

我想要过滤我的数据,这取决于下拉框选择了什么。

我设置了3个事件监听器:

$('.age_selector').change(function() {
    for (i=0;i<data.length;i++){
        if (data[i].age == $('.age_selector').val()){
            data[i].setVisible(true);
        } else {
            data[i].setVisible(false);
        }
    }
});
$('.location_selector').change(function() {
    for (i=0;i<data.length;i++){
        if (data[i].location == $('.location_selector').val()){
            data[i].setVisible(true);
        } else {
            data[i].setVisible(false);
        }
    }
});
$('.gender_selector').change(function() {
    for (i=0;i<data.length;i++){
        if (data[i].gender == $('.gender_selector').val()){
            data[i].setVisible(true);
        } else {
            data[i].setVisible(false);
        }
    }
});

我的问题是可见性只取决于我最近选择的下拉选项。例如,如果我选择美国作为位置,那么我选择男性,我的列表显示所有男性,无论位置/年龄。我如何结合逻辑,使它将被过滤,只显示美国男性?

感谢

编辑:我希望有一些类似于计数器的东西,所以不用

if (data[i].age == $('.age_selector').val()){
    data[i].setVisible(true);
}

我就写成

if (data[i].age == $('.age_selector').val()){
    data[i].counter++;
}else{
    data[i].counter--;
}

并且在最后,如果计数器高于某个值,数据将是可见的。这可能吗?

我会这样做:

// Store our current selections
var age_selection, location_selection, gender_selection;
// Do the real filtering
function do_filter() {
    // For each element
    for (i=0;i<data.length;i++) {
        // If our data doesn't match one of the selections, set it to not visible
        if (age_selection != null && data[i].age != age_selection) {
            data[i].setVisible(false);
        } else if (location_selection != null && data.location != location_selection) {
            data[i].setVisible(false);
        } else if (gender_selection != null && data.gender != gender_selection) {
            data[i].setVisible(false);
        } else {
            // Otherwise, set it visible
            data[i].setVisible(true);
        }
    }
}
// When one of the selectors changes, store the selection, and call do_filter
$('.age_selector').change(function() {
    age_selection = $('.age_selector').val();
    do_filter();
});
$('.location_selector').change(function() {
    location_selection = $('.location_selector').val();
    do_filter();
});
$('.gender_selector').change(function() {
    gender_selection = $('.gender_selector').val();
    do_filter();
});