Ваши требования мне не совсем понятны, но проблема кажется специально разработанной для базовых операций с массивами, поэтому, возможно, я могу предложить структуру для ее решения, которую вы можете заполнить деталями.
Во-первых, кажется, что основная идея состоит в том, чтобы фильтровать массив cars
в подмножество. Оказывается, есть метод Array только для этого, который называется, естественно, filter
const filtered_cars = cars.filter(car => {
// This function will get passed each car in turn. Return
// true if the car should be kept in the list, false otherwise.
});
Теперь, для каждой машины, я думаю, вы хотите проверить все активные фильтры. Если какой-либо из активных фильтров соответствует, автомобиль должен быть сохранен. Опять же, есть метод Array, в данном случае это some
.
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
// Within this function, we have a car variable, and a filter
// variable. We want to return true if the car matches the
// filter, false otherwise
});
});
Из вашего описания следует, что каждый активный фильтр может иметь несколько
значения, разделенные запятыми. Нам нужно извлечь их в массив. Мы также можем извлечь соответствующий атрибут автомобиля для фильтра.
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
// Return true if the attribute is in the set of values
});
});
Еще раз мы можем использовать some
const filtered_cars = cars.filter(car => {
return active_filters.some(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
return values.some(value => {
return value === attribute;
});
});
});
На данный момент мы уменьшили массив автомобилей только до тех элементов, которые соответствуют фильтрам, но мы не добавили тип для тех автомобилей, которые не создали фильтр. Чтобы сделать это, мы должны заменить первый some
на forEach
, чтобы убедиться, что мы перебираем все фильтры вместо остановки при первом совпадении. Также мы хотим добавить или удалить специальный класс в зависимости от ситуации.
const filtered_cars = cars.filter(car => {
let keep_car = false;
active_filters.forEach(filter => {
const values = filter.value.split(",");
const attribute = car.getAttribute(filter.id);
const matched = values.some(value => {
return value === attribute;
});
car.classList.toggle(filter.type, !matched);
keep_car = keep_car || matched;
});
return keep_car;
});
Как я уже сказал, я не уверен, что этот код именно то, что вы хотите, так как я, возможно, неправильно понял проблему. Но, надеюсь, этого достаточно, чтобы преодолеть нынешний блокпост.