Javascript:基于变量值的过滤函数中的动态表达式

时间:2016-03-12 05:53:22

标签: javascript jquery html lodash

我正在尝试使用lodash.js实现基于某些参数显示总线列表的过滤功能。

以下是过滤boardingPoint,droppingPoint,busType和operatorName的四个参数,它将填入4个下拉菜单中。

工作流

当用户选择一个登机点时,结果应该只包含选定登机点的公交车列表

如果他选择boardingPoint并且pausePoint结果应仅包含选定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个参数都有任何值时,上述内容才有效。

那么如何修改上面的表达式呢?它应该只包含用于过滤的选定参数

例如:如果用户选择了登机点和丢弃点(即bpLocationsdpLocations),则只有表达式应为此

 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)
                  });

更新

我只是连接基于每个变量的表达式字符串是否为空

//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 个答案:

答案 0 :(得分:1)

首先,需要初始化finalvar。如果您在没有选择任何内容时根本不需要过滤器,我应该将其初始化为true,我假设它是您想要的逻辑。

其次,添加作业' + ='在这种情况下使用不正确。请检查here是否正确使用。

第三,&&是JavaScript运算符,它不能添加到另一个值。这就是您收到错误的原因。

这是修订后的代码,可以解决问题和预期的逻辑:

package sample;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TextField;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.control.*;
import javafx.scene.shape.Polygon;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

public class Controller implements Initializable{

    private String path;
    private ArrayList<File> files;
    private String[] extens;

    @FXML
    public Polygon right_arrow;
    public Polygon left_arrow;
    public Button edit_button;
    public ImageView home_button;
    public TextField search_box;
    public TextArea tag_box;
    public ChoiceBox language_box;
    public Label photo_title;
    public Label photo_number;
    public ImageView photo_box;
    public Image home_picture;

    public void goToEditPage (ActionEvent event) throws Exception {
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Edit.fxml"));

            Parent root1 = (Parent) fxmlLoader.load();
            Stage stage = new Stage();
            stage.setScene(new Scene(root1));
            stage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    public void goToHomePage (){
        try {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("home.fxml"));

            Parent root1 = fxmlLoader.load();
            Stage stage = new Stage();
            stage.setScene(new Scene(root1));
            stage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }


    public Image getPicture(){


        /*home_picture = new Image(String.valueOf(getClass().getResource("home.png")));
        */return home_picture;
    }

    private void photo (String pathGet){
        path = pathGet;
        files = new ArrayList<File>();

        File repo = new File (path);

        File[] fileList = repo.listFiles();
        for (int i=0; i<1; i++) {
            System.out.println(repo.list());
        }
       // System.out.println(fileList.length);
        /*int nb = fileList.length;
        String ext = "";
        int s = -1;

        for (int i=0; i<nb; i++){
            if (fileList[i].isFile()){
                s = fileList[i].getName().lastIndexOf(".");
                if (s>-1) {
                    ext = fileList[i].getName().substring(s + 1);
                }
                if (ext=="jpg"||ext=="png"||ext=="jpeg"){
                    files.add(fileList[i]);
                }
            }
        }*/
    }


    public File getPhotoById(int id) {
        id--;
        return this.files.get(id);
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        photo("sample/photos/album_1");
        //photo_box.setImage(new Image(files.get(1).toURI().toString()));
    }
}