过滤器管道用于不同级别的多个字段(嵌套数组)

时间:2019-07-24 16:16:05

标签: arrays angular filter pipe

我正在尝试按职位类型,职位标签(嵌套数组)和职位付款过滤职位列表。 我有一个包含工作类型和工作标签的复选框列表,以及两个包含最低工资和最高工资的输入

目前,我只能过滤具有多个复选框值的工作类型,但无法过滤工作标签,也不能过滤工资

我在这里尝试了此解决方案: Filtering array of objects with arrays based on nested value

那没用

我的工作对象:

{
    "jobTitle" :"Whatever",
    "jobDescription" : "",
    "jobType" : "EXTRA", // Job Type can be either EXTRA or FULL
    "jobPayement" : 5,   
    "tags" : ["RESTAURANT","EVENT"], //Job Tags are defined with 4 categories RESTAURANT / EVENT / COFFEE / HOTEL
    "xpOnly" : true,
    "image" : "kitchen.png",
   }

我的过滤器项(复选框):

this.filterItems = [
      {
        value: 'Coffee',
        checked: false
      },
      {
        value: 'Event',
        checked: false
      },
      {
        value: 'Hotel',
        checked: false
      },
      {
        value: 'Restaurant',
        checked: false
      },
      {
        value: 'FULL',
        checked: false
      },
      {
        value: 'EXTRA',
        checked: false
      },
    ];

过滤条件和ng

 <a *ngFor="let job of jobs  | fresh: { jobType: ''} : checked();let i = index">

我的过滤器管道:

@Pipe({
  name: 'fresh'
})
export class FreshPipe implements PipeTransform {


  transform(items: any, filter: any, filterItems: Array<any>, isAnd: boolean): any {
    console.log('Filtering ..');
    if (filter && Array.isArray(items) && filterItems) {
      let filterKeys = Object.keys(filter);
      let checkedItems = filterItems.filter(item => { return item.checked; });
      if (!checkedItems || checkedItems.length === 0) { return items; }
      if (isAnd) {
        return items.filter(item =>
            filterKeys.reduce((acc1, keyName) =>
                (acc1 && checkedItems.reduce((acc2, checkedItem) => acc2 && new RegExp(item[keyName], 'gi').test(checkedItem.value) || checkedItem.value === "", true))
              , true)
              );
      } else {
        return items.filter(item => {
          return filterKeys.some((keyName) => {
            return checkedItems.some((checkedItem) => {
              return new RegExp(item[keyName], 'gi').test(checkedItem.value) || checkedItem.value === "";
            });
          });
        });
      } 
    } else {
      return items;
    }
  }


}

checked() {
    return this.filterItems.filter(item => { return item.checked; });
  }

就像我说的那样,现在我只对Job Type进行过滤,如果我们能找到一种解决方案来过滤标签和薪水,那将是很棒的。我可以提供任何其他信息 谢谢您的帮助。

0 个答案:

没有答案