Угловой фильтр трубы на несколько значений столбцов таблицы - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь реализовать фильтр конвейера по нескольким значениям по нескольким атрибутам в таблице.

Я могу отфильтровать несколько значений по одному атрибуту. Но я не могу сделать это для нескольких значений нескольких атрибутов.

Реализация моего конвейерного фильтра для нескольких значений в одном атрибуте,

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'vFilter',
  pure: false
})

export class VFilterPipe implements PipeTransform {

  transform(vList: any[], vfilter?: any): any {
    if (!vList|| !Object.keys(vfilter).length) {
      return vList;
    } 
    return vList.filter(item => {
          for (let key in vfilter) {
            for(let value in vfilter[key]){
             if ((item[key] === undefined || item[key] == vfilter[key][value])) 
             {
              return true;
             }
           }
           return false;
         }
         return false;
       });
  }
}

Мой входной массив задан,

vList = [{'name':'jack','age':'25'},{'name':'sam','age':'25'},{'name':'smith','age':'25'},{'name':'jack','age':'28'}]

vfilter = {'name':['jack','sam'],'age':['25']}

Я ожидаю вывод, подобный приведенному ниже, после фильтрации,

vList = [{'name':'jack','age':'25'},{'name':'sam','age':'25'}]

Но я получаю следующий результат,

vList = [{'name':'jack','age':'25'},{'name':'sam','age':'25'},{'name':'jack','age':'28'}]

Может кто-нибудь помочь мне в решении этой логической проблемы.

1 Ответ

0 голосов
/ 07 мая 2019

Ваша ошибка логики кода в том, что вы возвращаете true, если какой-либо из фильтров совпадает, когда вы хотите вернуть только true, если все фильтры совпадают.

stackblitz

transform(vList: any[], vfilter?: any): any {
  if (!vList || !Object.keys(vfilter).length) {
    return vList;
  } 
  return vList.filter(item => {
          return Object.keys(vfilter)
            .filter(_ => vfilter.hasOwnProperty(_))
            .every(key => {
              if(!item[key]) return true; // matches undefined value
              const arrayValues = vfilter[key] as any[];
              return arrayValues.some(_ => _ === item[key]);
          });
      });
}
...