Я пытаюсь реализовать функцию фильтрации для отображения списка шин на основе некоторых параметров с помощью lodash.js
.Javascript: Динамическое выражение в функции фильтра на основе значений переменных
Вот четыре параметра для фильтрации boardingPoint, droppingPoint, busType и operatorName, и он будет заполнен в 4 раскрывающихся меню.
Workflow
Когда пользователь выбрать boardingPoint результат должен содержит только список автобусов с выбранными точками интернатов,
Если он выбрать boardingPoint и droppingPoint результат должен содержать только список автобусов с выбранной boradingPoint и падение пунктов и так далее.
Вот моя функция для фильтрации
function search_buses(bpLocations,dpLocations,busTypes,operatorNames){
//filter function
tresult = _.filter(result, function(obj) {
return _(obj.boardingPoints).map('location').intersection(bpLocations).value().length > 0
&&_(obj.droppingPoints).map('location').intersection(dpLocations).value().length > 0
&& _.includes(busTypes, obj.busType)
&& _.includes(operatorNames, obj.operatorName);
});
//return result array
return tresult;
}
Но проблема в том, если пользователь выбирает только две вещи говорят, интернаты и сбрасывают точки и другие пустуют в этом случае указанное выше условие фильтра не удалось, так как он будет оценивать четыре условия. Вышеуказанное будет работать только в том случае, если все 4 параметра имеют какое-либо значение.
Так как я могу изменить приведенное выше выражение должно содержит только выбранный параметр для фильтрации
Например: если пользователь выбирает точку посадки и точку каплепадения (т.е. bpLocations
, dpLocations
) только выражение должно быть таким
tresult = _.filter(result, function(obj) {
return _(obj.boardingPoints).map('location').intersection(bpLocations).value().length > 0
&&_(obj.droppingPoints).map('location').intersection(dpLocations).value().length > 0
});
, если выбирает только busType он должен быть
tresult = _.filter(result, function(obj) {
return _.includes(busTypes, obj.busType)
});
UPDATE:
Я просто сцепить строковое выражение на основе каждой переменной пуста или не
//expression string
var finalvar;
tresult = _.filter(result, function(obj) {
if(bpLocations!=''){
finalvar+=_(obj.boardingPoints).map('location').intersection(bpLocations).value().length > 0;
}
if(dpLocations!=''){
finalvar+=&&+_(obj.droppingPoints).map('location').intersection(dpLocations).value().length > 0;
}
if(busTypes!=''){
finalvar+=&&+ _.includes(busTypes, obj.busType);
}
if(operatorNames!=''){
finalvar+=&&+ _.includes(operatorNames, obj.operatorName);
}
return finalvar;
});
Но это будет возвращает эту ошибку Uncaught SyntaxError: Unexpected token &&
Его работали частично, иногда он возвращает пустой массив, даже если условие фильтра существует. –
Если вы можете объяснить условие, которое не работает, тогда, возможно, я смогу понять, почему. Обратите внимание, что эти фильтры чувствительны к регистру. – Ben
каждый параметр указан в выпадающем меню, например: 'operatorname', как это указано в этом виде' a, b, c, d, e, f' (предположим, что это значения, перечисленные в раскрывающемся списке operatorname), если массив operatorNames в порядок, такой же, как и dropdown (т.е. 'operatorNames = [a, b, c, d]'), он будет работать, но если я случайно выбрал один (т.е. 'operatorNames = [d]'), он вернет пустой массив. –