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