Javascript 过滤多个输入字段

Javascript 过滤多个输入字段,javascript,filter,filtering,Javascript,Filter,Filtering,我正在尝试使用javascript创建一个过滤器,其中包含4个输入字段,因此我可以猜测16种可能的搜索组合。我可以一次搜索所有4个或一次搜索1个输入,但由于某些原因,当我添加其他语句时,我会得到wierd结果。有没有更好的方法来实现过滤器 var unfilteredFloorplans = floorplanJSON.floorplanData; filteredFloorplans = []; for (var i = 0; i < unfilteredFloorplans.len

我正在尝试使用javascript创建一个过滤器,其中包含4个输入字段,因此我可以猜测16种可能的搜索组合。我可以一次搜索所有4个或一次搜索1个输入,但由于某些原因,当我添加其他语句时,我会得到wierd结果。有没有更好的方法来实现过滤器

var unfilteredFloorplans = floorplanJSON.floorplanData;

filteredFloorplans = [];

for (var i = 0; i < unfilteredFloorplans.length; i++) {

    if (unfilteredFloorplans[i].city == req.body.cityName && 
        unfilteredFloorplans[i].building == req.body.buildingName && 
        unfilteredFloorplans[i].bedrooms == req.body.minBedroom && 
        unfilteredFloorplans[i].baths == req.body.maxBathroom) {

           console.log(unfilteredFloorplans[i].city);
           filteredFloorplans.push(unfilteredFloorplans[i]);
    } 
}
var unfilteredFloorplans=floorplanJSON.floorplanData;
filteredFloorplans=[];
对于(变量i=0;i
那么现在我需要再写15条if语句?我不想复制它们,而是想问一下这是否正确,是否有人知道如何用switch语句实现这一点


编辑:当我说另外15条语句时,我的意思是,如果他们选择城市,那么一条语句用于表示,如果他们选择城市和卧室等,那么另一条语句用于表示。这似乎效率低下

一个最简单的修复方法是将“And”与“or”结合起来,但请注意这会将代码变成一个难以阅读的混乱:

var unfilteredFloorplans = floorplanJSON.floorplanData;

filteredFloorplans = [];

for (var i = 0; i < unfilteredFloorplans.length; i++) {

    if ((req.body.cityName == '' || unfilteredFloorplans[i].city == req.body.cityName) && 
        (req.body.buildingName == '' || unfilteredFloorplans[i].building == req.body.buildingName) && 
        (req.body.minBedroom == '' || unfilteredFloorplans[i].bedrooms == req.body.minBedroom) && 
        (req.body.maxBathroom == '' || unfilteredFloorplans[i].baths == req.body.maxBathroom)) {

           console.log(unfilteredFloorplans[i].city);
           filteredFloorplans.push(unfilteredFloorplans[i]);
    } 
}
var unfilteredFloorplans=floorplanJSON.floorplanData;
filteredFloorplans=[];
对于(变量i=0;i
(顺便说一句,这看起来是一个很好的结合连接和析取的练习。)

编辑我建议将过滤放在一个单独的函数中,并引入一个附加的辅助函数。此外,请使用更一致的命名,并使用“==”而不是“==”

函数filterByQuality(formValue、dataValue){
如果(formValue=='')返回true;
如果(formValue==dataValue)返回true;
返回false;
}
函数过滤器FloorPlan(表单、数据){
如果(!filterByQuality(form.city,data.city))返回false;
如果(!filterByQuality(form.building、data.building))返回false;
如果(!filterByQuality(form.minBedrooms,data.bedrooms))返回false;
如果(!filterByQuality(form.maxBathrooms,data.bathroms))返回false;
返回true;
}
var unfilteredFloorplans=floorplanJSON.floorplanData;
filteredFloorplans=[];
对于(变量i=0;i

通过学习Array.filter方法,您可以进一步减少此代码。您应该修复某些字段应使用“>=”或“>=”而不是“==”的错误。但我将把这些事情留作练习。

最简单的修复方法是将“And”与“or”结合起来,但请注意这会将代码变成难以阅读的混乱:

var unfilteredFloorplans = floorplanJSON.floorplanData;

filteredFloorplans = [];

for (var i = 0; i < unfilteredFloorplans.length; i++) {

    if ((req.body.cityName == '' || unfilteredFloorplans[i].city == req.body.cityName) && 
        (req.body.buildingName == '' || unfilteredFloorplans[i].building == req.body.buildingName) && 
        (req.body.minBedroom == '' || unfilteredFloorplans[i].bedrooms == req.body.minBedroom) && 
        (req.body.maxBathroom == '' || unfilteredFloorplans[i].baths == req.body.maxBathroom)) {

           console.log(unfilteredFloorplans[i].city);
           filteredFloorplans.push(unfilteredFloorplans[i]);
    } 
}
var unfilteredFloorplans=floorplanJSON.floorplanData;
filteredFloorplans=[];
对于(变量i=0;i
(顺便说一句,这看起来是一个很好的结合连接和析取的练习。)

编辑我建议将过滤放在一个单独的函数中,并引入一个附加的辅助函数。另外,使用更一致的命名,并使用“==”而不是“==”

函数filterByQuality(formValue、dataValue){
如果(formValue=='')返回true;
如果(formValue==dataValue)返回true;
返回false;
}
函数过滤器FloorPlan(表单、数据){
如果(!filterByQuality(form.city,data.city))返回false;
如果(!filterByQuality(form.building、data.building))返回false;
如果(!filterByQuality(form.minBedrooms,data.bedrooms))返回false;
如果(!filterByQuality(form.maxBathrooms,data.bathroms))返回false;
返回true;
}
var unfilteredFloorplans=floorplanJSON.floorplanData;
filteredFloorplans=[];
对于(变量i=0;i

通过学习Array.filter方法,您可以进一步减少此代码。您应该修复某些字段应使用“>=”或“>=”而不是“==”的错误。但我将这些内容留作练习。

下面是一个简化的代码示例(在本例中,我硬编码了表示
输入
选项的值):

过滤器中调用的匿名函数可以替换为如下命名函数:

function filterFloorplans(floorplan) {
  return floorplan.city === 'NY' && floorplan.building === 'A' && floorplan.bedrooms >= 1 && floorplan.baths >= 1;
}

var filteredFloorplans = unfilteredFloorplans.filter(filterFloorplans);
您可能希望使用此路由,因为您可以有4个输入选项的任意组合。因此,您希望从其他较小的检查中“构建”过滤器楼层平面
功能:

function testCity(userInputCity, floorplanCity) {
    return userInputCity ? userInputCity === floorplanCity : true;
}

function filterFloorplans(floorplan) {
  return testCity('NY', floorplan.city) && floorplan.building === 'A' && floorplan.bedrooms >= 1 && floorplan.baths >= 1;
}
这就足够了
function testCity(userInputCity, floorplanCity) {
    return userInputCity ? userInputCity === floorplanCity : true;
}

function filterFloorplans(floorplan) {
  return testCity('NY', floorplan.city) && floorplan.building === 'A' && floorplan.bedrooms >= 1 && floorplan.baths >= 1;
}