angular2过滤器管道,包含许多类别和组合

时间:2017-02-18 13:35:28

标签: javascript angular filter

我尝试实现角度2过滤器,用户应该能够按一组类别进行过滤。过滤结果应包含任何对象,该对象至少有一个字段与用户选择过滤的类别之一匹配。

至于现在,我有2个类别,并且能够完成所有这些"手动"但现在我需要使用多达20个类别进行此操作,并且我正在寻找一种通用的方法来执行此操作。

考虑一下这个例子(我现在用来按性别过滤的内容):

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

这样可以正常工作,但是,假设我有15-20个类别可以过滤并需要相同的逻辑,这对于编写具有所有可能组合的代码来说真的很痛苦。

例如:如果在我的情况下,公司对象包含4个选择的类别,然后用户按照15个类别中的3个类别过滤,其中2/3个与公司选择的4个类别相匹配,那么公司应该是回。基本上,我在上面的示例中寻找相同的逻辑,但它应该适用于任意数量的类别。

我已在我的代码中关注了this example。虽然建议这与 array.prototype.filter 的工作原理类似,但我无法弄清楚如何在我的例子中使用它。

感谢任何帮助。

0 个答案:

没有答案