2016-03-12 2 views
0

Я пытаюсь реализовать функцию фильтрации для отображения списка шин на основе некоторых параметров с помощью 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 &&

ответ

1

Прежде всего, finalvar необходимо инициализировать. Он должен быть инициализирован true, если вы не хотите, чтобы фильтр вообще не был выбран, и я предполагаю, что это логика, которую вы хотите.

Во-вторых, в этом случае неверно используется присваивание '+ ='. Пожалуйста, проверьте here для правильного использования.

В-третьих, & & является оператором JavaScript, его нельзя добавить к другому значению. Вот почему вы получаете ошибку.

Вот пересмотренный код, который будет решать проблемы, и ожидаемая логика:

// initialize to true means no filter if nothing is selected (return the item). 
var finalvar = true; 

var tresult = _.filter(result, function(obj) { 
    if(bpLocations){ 
     finalvar = finalvar && _(obj.boardingPoints).map('location').intersection(bpLocations).value().length > 0; 
    } 
    if(dpLocations){ 
     finalvar = finalvar && _(obj.droppingPoints).map('location').intersection(dpLocations).value().length > 0; 
    } 
    if(busTypes){ 
     finalvar = finalvar && _.includes(busTypes, obj.busType); 
    } 
    if(operatorNames){ 
     finalvar = finalvar && _.includes(operatorNames, obj.operatorName); 
    } 
    return finalvar; 
}); 
+0

Его работали частично, иногда он возвращает пустой массив, даже если условие фильтра существует. –

+0

Если вы можете объяснить условие, которое не работает, тогда, возможно, я смогу понять, почему. Обратите внимание, что эти фильтры чувствительны к регистру. – Ben

+0

каждый параметр указан в выпадающем меню, например: 'operatorname', как это указано в этом виде' a, b, c, d, e, f' (предположим, что это значения, перечисленные в раскрывающемся списке operatorname), если массив operatorNames в порядок, такой же, как и dropdown (т.е. 'operatorNames = [a, b, c, d]'), он будет работать, но если я случайно выбрал один (т.е. 'operatorNames = [d]'), он вернет пустой массив. –

Смежные вопросы