代码之家  ›  专栏  ›  技术社区  ›  Jennica Ramones

使用includes的JavaScript搜索/筛选算法

  •  1
  • Jennica Ramones  · 技术社区  · 8 年前

    出身背景

    我正试图用javascript开发一个搜索/过滤算法,我被难住了。我有一个度数数组,其中包含度数名称以及与其关联的过滤器。函数的作用是:获取用户从HTML字段中选择的过滤器。函数getDept()只返回一个部门值,而getSearchValue()从多个选择字段返回值。

    函数的作用是:获取用户选择的过滤器,并使用includes方法将其与度数组中的过滤器进行比较。该函数中的两个for循环进行比较,如果碰巧有一个过滤器不是用户选择的一部分,则中断循环。如果检查仍然为true,则将其推送到结果数组上,以输出给用户。

    问题所在

    假设我选择“学士、商业、传统和Main\u校园”作为用户的过滤器,它会毫无问题地将第一个学位推送到结果上,并过滤掉第二个学位。然而假设我选择了“学士、副学士、商科、传统和主校区”,我也希望将第二个学位添加到结果中,但这两个学位都不会受到影响。我做了一些调试,结果显示“学士”不包括在一级学位中,“副学士”不包括在二级学位中。

    我愿意接受所有建议和解决方案,我希望得到一些指导。

    var degrees = [
        {degree: "Business Administration", filters: "Business Bachelor Traditional Main_Campus"},
        {degree: "Applied Science", filters: "Business Associate Online Main_Campus"}
        ]
    
    function filterSearch(){
        var filters = getFilters();
        var array = [];
        var check = false;
        var results = [];
    
        for (var i = 0; i < degrees.length; i++){
            array = degrees[i].filters.split(' ');
            for (var j = 0; j < array.length; j++){
                if (filters.includes(array[j])) { check = true; }
                else {
                    check = false;
                    break;
                }
            }
            if (check == true) results.push(degrees[i]);
        }
    }
    
    function getFilters(){
        var filters = [];
        var d = this.getDeptVal();
        var p = this.getSearchValue('#programType');
        var f = this.getSearchValue('#formatType');
        var l = this.getSearchValue('#locationType');
        filters.push(d); filters.push(p); filters.push(f); filters.push(l); 
    
        return filters;
    }
    
    function getDeptVal(){
        var selected = $('#departmentType option:selected').text();
        return selected;
    }
    
    function getSearchValue(searchId){
        var selected = $(searchId).val();
        var toString = selected.toString();
        return toString;
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   mscdeveloper    8 年前

    也许您需要这样一个过滤器:

    var degrees = [
        {degree: "Business Administration", filters: "Business Bachelor Traditional Main_Campus"},
        {degree: "Applied Science", filters: "Business Associate Online Main_Campus"}
        ];
    
    
    function get_degrees_by_filters(_filters){
    	var found=[];
    	var temp_degrees=degrees.slice(0); //clone original array
    	var input_filters_arr=_filters.split(' ');
    	for(var key in temp_degrees){
    		var degree=temp_degrees[key].degrees;
    		var filters=temp_degrees[key].filters;
    		var filters_arr=filters.split(' ');
    		for(var key_f in filters_arr){
    			for(var key_if in input_filters_arr){
    				filter=input_filters_arr[key_if];
    			    if(filters_arr[key_f]==filter){
    				     if(temp_degrees[key]){
    				         found.push(temp_degrees[key]);
    				         delete  temp_degrees[key];
    				     }
    			    }
    
    
    			}
    		}
    	}
    	return found;
    }
    <input type="button" value="filters: Bachelor" onclick="console.log(get_degrees_by_filters('Bachelor'));"/></br>
    <input type="button" value="filters: Associate" onclick="console.log(get_degrees_by_filters('Associate'));"/></br>
    <input type="button" value="filters: Bachelor Associate" onclick="console.log(get_degrees_by_filters('Bachelor Associate'));"/></br>
    <input type="button" value="filters: Associate Online" onclick="console.log(get_degrees_by_filters('Associate Online'));"/></br>