FilterPipe, массив фильтров - PullRequest
0 голосов
/ 03 марта 2020

Я хочу сделать фильтр для массива объекта

Чтобы сделать этот фильтр, я получил этот канал:

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

@Pipe({
  name: 'filter'
})
export class FilterPipe implements PipeTransform {
  transform(items: any[], searchText: string[]): any[] {
    if (!items) { return []; }
    if (!searchText || searchText.length <= 0) { return items; }

    return items.filter(item => {
      return Object.keys(item).some(key => {
        return String(item[key]).toLowerCase().includes(searchText[0]);
      });
    });
  }
}

Мой массив:

[
   {
      "drinkPreference":"Apple",
      "email":"emailmyemail@gmail.com",
      "firstName":"fgsfdg",
      "id":"_ihaj8q0uh",
      "lastName":"Test"
   },
   {
      "drinkPreference":"NoDrink",
      "email":"Test@live.fr",
      "firstName":"Marc",
      "id":"_rhahpcz3h",
      "lastName":"Lander"
   },
   {
      "drinkPreference":"Banana",
      "email":"dsfgf@lkive.fr",
      "firstName":"fdgsdg",
      "id":"_5l63di4x5",
      "lastName":"fdgfsd"
   },
   {
      "drinkPreference":"NoDrink",
      "email":"myemailgmail@gmail.com",
      "firstName":"qfdqsfdsq",
      "hobbies":[
         "qsfqd"
      ],
      "id":"_byvwezzs4",
      "lastName":"look"
   }
]

И, например, мой массив фильтров:

   arrayfilter = ["Lander","Test"]

Он должен вернуть меня:

[
   {
      "drinkPreference":"Apple",
      "email":"emailmyemail@gmail.com",
      "firstName":"fgsfdg",
      "id":"_ihaj8q0uh",
      "lastName":"Test"
   },
   {
      "drinkPreference":"NoDrink",
      "email":"Test@live.fr",
      "firstName":"Marc",
      "id":"_rhahpcz3h",
      "lastName":"Lander"
   }
]

Но он возвращает только те элементы, которые соответствуют моему первому элементу arrayfilter, поэтому элементы "Lander" .

Как я могу изменить свою функцию pip, чтобы получить все результаты?

Спасибо!

1 Ответ

2 голосов
/ 03 марта 2020

Поскольку вы получаете только первый элемент из массива:

searchText[0]

Таким образом, вы фильтруете только по первому элементу массива.

Вы можете использовать Object.values и делать не забудьте использовать toLowerCase() для обеих строк:

searchText = searchText.map(s => s.toLowerCase());
return items.filter(f => 
    Object.values(f).some(s => 
        searchText.includes(typeof s == 'string' ? s.toLowerCase() : s)));

Пример:

let myArray = [
    {
       "drinkPreference":"Apple",
       "email":"emailmyemail@gmail.com",
       "firstName":"fgsfdg",
       "id":"_ihaj8q0uh",
       "lastName":"Test"
    },
    {
       "drinkPreference":"NoDrink",
       "email":"Test@live.fr",
       "firstName":"Marc",
       "id":"_rhahpcz3h",
       "lastName":"Lander"
    },
    {
       "drinkPreference":"Banana",
       "email":"dsfgf@lkive.fr",
       "firstName":"fdgsdg",
       "id":"_5l63di4x5",
       "lastName":"fdgfsd"
    },
    {
       "drinkPreference":"NoDrink",
       "email":"myemailgmail@gmail.com",
       "firstName":"qfdqsfdsq",
       "hobbies":[
          "qsfqd"
       ],
       "id":"_byvwezzs4",
       "lastName":"look"
    }
];

let arrayfilter = ["Lander","Test"];
arrayfilter = arrayfilter.map(s => s.toLowerCase());
const result = myArray.filter(f => 
    Object.values(f).some(s => 
        arrayfilter.includes(typeof s == 'string' ? s.toLowerCase() : s)));
console.log(result);
...