Javascript 基于动态条件的最佳过滤方法

Javascript 基于动态条件的最佳过滤方法,javascript,array-filter,Javascript,Array Filter,这是我的示例代码 data = [ {name: "Sam", age: 25, location: 'deleware', new_employee: true, shift: 'day'}, {name: "John", age: 45, location: 'new york', new_employee: false, shift: 'day'}, {name: "Tony", age: 65, location: 'calif

这是我的示例代码

data = [
{name: "Sam", age: 25, location: 'deleware', new_employee: true, shift: 'day'},
{name: "John", age: 45, location: 'new york', new_employee: false, shift: 'day'},
{name: "Tony", age: 65, location: 'california', new_employee: true, shift: 'evening'},
{name: "Bruce", age: 23, location: 'california', new_employee: true, shift: 'evening'},
{name: "Tom", age: 34, location: 'texas', new_employee: false, shift: 'day'},
{name: "Rob", age: 51, location: 'ohio', new_employee: false, shift: 'day'},
{name: "Jacob", age: 21, location: 'ohio', new_employee: false, shift: 'evening'},
{name: "Steve", age: 38, location: 'deleware', new_employee: false, shift: 'day'}
]
如果我想过滤这个,我可以这样做 要过滤所有夜班:

data.filter(x=>x.shift=='night')//给我筛选的列表

如果我想过滤多个条件,我可以这样做 过滤我们的夜班,而不是新的emp
data.filter(x=>x.shift=='night'&&&!x.new\u employee)//给我一个确切的

现在我面临的挑战是,我不知道用户将通过哪些过滤器。我想动态构建这个过滤器。目前,我正在使用多个if-else语句实现这一点,以实现各种可能的组合。 组合包括

if name then that filter
else if name and age then another filter
else if name location then another filter
else if name and age and location another filter
and so on

我知道有一个更好的方法可以做到这一点。任何指向正确方向的建议都会非常有帮助。

您可以选择一系列想要的过滤器,并检查每个过滤器以获得结果

const
数据=[{name:“Sam”,年龄:25岁,地点:'deleware',纽约大学员工:true,班次:'day'},{name:“John”,年龄:45岁,地点:'new york',纽约大学员工:false,班次:'day'},{name:“Tony”,年龄:65,地点:'california',纽约大学员工:true,班次:'day'},{name:'Bruce,年龄:23,地点:'california',新雇员:true,班次:'day'},{姓名:“Tom”,年龄:34,地点:'texas',新雇员:false,班次:'day'},{姓名:“Rob”,年龄:51,地点:'ohio',新雇员:false,班次:'day'},{姓名:“Jacob”,年龄:21,地点:'ohio',新雇员:false,班次:'day'},{姓名:“Steve,年龄:38,地点:'deleware',新员工:false,班次:'day'},
过滤器=[
({age})=>年龄<30岁,
({shift})=>shift==='night'
],
结果=data.filter(o=>filters.every(fn=>fn(o));
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
您可以获取所需筛选器的数组,并检查每个筛选器以获取结果

const
数据=[{name:“Sam”,年龄:25岁,地点:'deleware',纽约大学员工:true,班次:'day'},{name:“John”,年龄:45岁,地点:'new york',纽约大学员工:false,班次:'day'},{name:“Tony”,年龄:65,地点:'california',纽约大学员工:true,班次:'day'},{name:'Bruce,年龄:23,地点:'california',新雇员:true,班次:'day'},{姓名:“Tom”,年龄:34,地点:'texas',新雇员:false,班次:'day'},{姓名:“Rob”,年龄:51,地点:'ohio',新雇员:false,班次:'day'},{姓名:“Jacob”,年龄:21,地点:'ohio',新雇员:false,班次:'day'},{姓名:“Steve,年龄:38,地点:'deleware',新员工:false,班次:'day'},
过滤器=[
({age})=>年龄<30岁,
({shift})=>shift==='night'
],
结果=data.filter(o=>filters.every(fn=>fn(o));
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
您可以使用以下内容:

data.filter(x=> {
x.shift=='evening' && !x.new_employee
    if (x.name.length<5) return nameFilter(x);
    else if (x.name==='Peter' && x.age>18) return ageFilter(x);
    else if (x.name.length>10 && x.location) return locationFilter(x);
    else return defaultFilter(x);
});
data.filter(x=>{
x、 班次==“晚上”&!x.新员工
if(x.name.length18)返回ageFilter(x);
如果(x.name.length>10&&x.location)返回locationFilter(x);
否则返回默认过滤器(x);
});

您可以使用以下内容:

data.filter(x=> {
x.shift=='evening' && !x.new_employee
    if (x.name.length<5) return nameFilter(x);
    else if (x.name==='Peter' && x.age>18) return ageFilter(x);
    else if (x.name.length>10 && x.location) return locationFilter(x);
    else return defaultFilter(x);
});
data.filter(x=>{
x、 班次==“晚上”&!x.新员工
if(x.name.length18)返回ageFilter(x);
如果(x.name.length>10&&x.location)返回locationFilter(x);
否则返回默认过滤器(x);
});

这就成功了。谢谢:)这就成功了。谢谢:)