Javascript angular2过滤管具有多种类别和组合

Javascript angular2过滤管具有多种类别和组合,javascript,angular,filter,Javascript,Angular,Filter,我试图实现一个angular 2过滤器,用户应该能够通过一组类别进行过滤。其中,筛选结果应包括至少有一个字段与用户选择筛选依据的类别之一匹配的任何对象 至于现在,我有2个类别,已经能够做到这一切“手动”,但现在我需要这样做,多达20个类别,我正在寻找一个通用的方法来做到这一点 以这个为例(我现在用它来按性别过滤): 转换(值){ 如果(值==null){ 返回null; } //根本没有过滤器////// //如果未选择过滤器 if(this.SearchService.filterFemale

我试图实现一个angular 2过滤器,用户应该能够通过一组类别进行过滤。其中,筛选结果应包括至少有一个字段与用户选择筛选依据的类别之一匹配的任何对象

至于现在,我有2个类别,已经能够做到这一切“手动”,但现在我需要这样做,多达20个类别,我正在寻找一个通用的方法来做到这一点

以这个为例(我现在用它来按性别过滤):

转换(值){
如果(值==null){
返回null;
}
//根本没有过滤器//////
//如果未选择过滤器
if(this.SearchService.filterFemale==0&&this.SearchService.filterMale==0){
返回值.filter(公司=>{
返回公司;
});
}
//如果只有女性
if(this.SearchService.filterFemale!==0&&this.SearchService.filterMale==0){
返回值.filter(公司=>{
var i;
对于(i=0;i{
var i;
对于(i=0;i{
var i;
对于(i=0;i
这很好,但是,假设我有15-20个类别需要过滤,并且需要相同的逻辑,这将是一个真正的痛苦编写代码与所有可能的组合有

例如:在我的例子中,如果一个公司对象包含4个选择的类别,然后一个用户从15个可能的类别中筛选出3个类别,其中2/3与公司选择的4个类别匹配,那么应该返回该公司。本质上,我在上面的例子中寻找相同的逻辑,但它应该适用于任意数量的类别

我已经按照我的代码。有人建议这是一种类似于array.prototype.filter工作原理的机制,但我不知道如何在示例中使用它


非常感谢您的帮助。

hmm,将类别作为数组传递,然后循环,在该循环中,您将进行过滤,并将接受的项目添加到一个数组中,该数组最终将包含所有类别中接受的所有项目。好的,谢谢,我将尝试一下,看看我能想出什么。hmm,将类别作为数组传递,然后循环,在该循环中,您将进行过滤,并将接受的项目添加到一个数组中,该数组最终将包含所有类别接受的所有项目。好的,谢谢,我将尝试一下,看看我能想出什么。
transform(value) {
if(value == null) {
  return null;
}
// NO FILTER AT ALL //////

//If no filter is selected
if(this.SearchService.filterFemale == 0 && this.SearchService.filterMale == 0){
  return value.filter(company => {
    return company;
  });
}
//If Female only
if(this.SearchService.filterFemale !== 0 && this.SearchService.filterMale == 0){
  return value.filter(company => {
    var i;
    for (i = 0; i < company.audience.targetGroup.genders.length; i++) {
      if(company.audience.targetGroup.genders[i].gender === 'Female'){
        return company.audience.targetGroup.genders[i].gender === 'Female';
      }
    }
  });
}
//If Male only
if(this.SearchService.filterFemale == 0 && this.SearchService.filterMale !== 0){
  return value.filter(company => {
    var i;
    for (i = 0; i < company.audience.targetGroup.genders.length; i++) {
      if(company.audience.targetGroup.genders[i].gender === 'Male'){
        return company.audience.targetGroup.genders[i].gender === 'Male';
      }
    }
  });
}
//If both Male and Female
if(this.SearchService.filterFemale !== 0 && this.SearchService.filterMale !== 0){
  return value.filter(company => {
    var i;
    for (i = 0; i < company.audience.targetGroup.genders.length; i++) {
      if(company.audience.targetGroup.genders[i].gender === 'Female' || company.audience.targetGroup.genders[i].gender === 'Male'){
        return company.audience.targetGroup.genders[i].gender === 'Female' || company.audience.targetGroup.genders[i].gender === 'Male';
      }
    }
  });
}
}