Алгоритм поиска / фильтрации JavaScript с использованием включает - PullRequest
0 голосов
/ 03 мая 2018

Фон

Я пытаюсь разработать алгоритм поиска / фильтрации с помощью JavaScript, и я в тупике. У меня есть массив степеней с именем степени вместе с фильтрами, связанными с ним. Моя функция filterSearch () получает фильтры, которые пользователь выбрал из полей HTML. Функция getDept () возвращает только одно значение отдела, в то время как getSearchValue () возвращает значения из полей множественного выбора.

Функция filterSearch () получает выбранные пользователем фильтры и сравнивает их с фильтрами в массиве градусов, используя метод include. Два цикла for в этой функции выполняют сравнение и выходят из цикла, если обнаруживается, что фильтр не является частью того, что выбрал пользователь. Если проверка все еще имеет значение true, она помещается в массив результатов для вывода пользователю.

Проблема

Скажем, я выбираю "Бакалавр, Бизнес, Традиционный и Main_Campus" в качестве фильтров пользователя, он без проблем помещает первую степень в результаты и отфильтровывает вторую степень. Тем не мение! Допустим, я выбрал «Бакалавр, Ассоциированный, Бизнес, Традиционный и Main_Campus». Я хотел бы, чтобы вторую степень добавили к результатам, но обе не будут отталкиваться. Я провел некоторую отладку, и оказалось, что в нем говорится, что «бакалавр» не входит в первую степень, а «младший» нет во второй степени.

Я открыт для всех предложений и решений, я хотел бы получить некоторые рекомендации.

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 Ответ

0 голосов
/ 03 мая 2018

Возможно, вам нужен такой фильтр:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...