Для меня эти функции filterMarkers
и filterMarkersx
на самом деле не являются "фильтрами", так как они изменяют элементы gmarkers
вместо того, чтобы возвращать подмножество этого массива. С точки зрения фильтрации, я бы переписал такой код:
1. объявить функции фильтрации
// returns a filtering function to be passed to Array.prototype.filter parameterized with `category`
var filterByCategory = function (category) {
return function (marker) {
return !category.length || marker.category == category;
}
};
// returns a filtering function to be passed to Array.prototype.filter parameterized with `session`
var filterBySession = function (session) {
return function (marker) {
return !session.length || marker.session == session;
}
};
Кстати, поскольку это те же самые функции, которые изменяют только проверяемое свойство, вы можете разложить их на:
var filterBy = function (name, object) {
return function (marker) {
return !object.length || marker[name] == object;
}
};
2. используя фильтры
// set all visibility to false for starters
gmarkers.forEach(function (m) {
m.setVisible(false);
});
// apply chained filtering then set visibility to true on resulting subset
gmarkers
.filter(filterBy('category', category)) // or .filter(filterByCategory(category))
.filter(filterBy('session', session)) // or .filter(filterBySession(session))
.forEach(function (marker) {
marker.setVisible(true);
});
Таким образом, вы можете контролировать, используете ли вы цепные фильтры или используете только один из них.
ОБНОВЛЕНИЕ: более четкое определение использования
Теперь, когда у нас есть логика, мы хотим подключить этот фрагмент кода к вашему HTML.
Давайте обернем код из части "2. Используя фильтры" в функцию:
// assuming vanilla JS: binding the function to `document`
// (the purpose is just to make it callable from the HTML)
document.setMarkersVisibility = function () {
// first, fetch data from both <select> (category and session)
var selectCategory = document.getElementById('selectcategory');
var selectSession = document.getElementById('selectsession');
var category = selectCategory.options[selectCategory.selectedIndex].value;
var session = selectSession .options[selectSession .selectedIndex].value;
/* INSERT PART 2. CODE HERE */
};
Теперь нам нужно провести рефакторинг HTML, потому что оба ваших <select>
имеют одинаковое значение для id
, что неверно. И нам нужно вызвать нашу новую функцию. Учитывая код выше, я назвал их selectcategory
и selectsession
:
<select id="selectcategory" onchange="setMarkersVisibility()">
и
<select id="selectsession" onchange="setMarkersVisibility()">
Это должно быть все, что нужно.