在多个字段上搜索管道以获取一组项目

时间:2019-02-19 16:52:17

标签: angular typescript

我有一个管道,用于在用户数组中搜索ID或名称。工作正常。如果我输入用户ID号,它将找到它。如果我写了名字,只有名字是顺序写的,才能找到

但是我想搜索名字和姓氏,并使用 firstname secondname thirdname laststrong

我知道我必须拆分查询字符串(splitted = querystring.split('')并搜索两个名称,但是我不知道如何。

我不希望静态搜索2个词,而希望动态搜索2个,3个,等等...用户想要的那个。

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

@Pipe({
  name: 'querystring'
})
@Injectable()
export class PesquisaPipe implements PipeTransform {
  transform(users: any[], querystring: any): any[] {
   if ( querystring=== undefined) {
     return users;
   }
   return users.filter(z => {
     const userID = z.userID.toString().includes(querystring.toLocaleLowerCase());
     const userName = z.userName.toLocaleLowerCase().includes(querystring.toLocaleLowerCase());
     return( userID + userName);
   });
  }

1 个答案:

答案 0 :(得分:1)

欢迎来到stackoverflow!

首先,使用管道进行过滤或排序是一个想法。文档在此处警告有关此问题:https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe

相反,请在代码中进行过滤。

第二,有多种处理多种情况的方法,我在这里有一篇博客文章介绍了此问题:https://blogs.msmvps.com/deborahk/filtering-in-angular/

通常,您可以使用OR ||根据多个条件进行过滤如下:

function list(input){
  input = input.map(({ name }) => name )
  let length = input.length
  let last = input.pop()
  let op = length === 0 ? "" : length === 1 ? last : input.join(',') + ' & ' +last
  console.log(op)
}

list([ {name: 'Bart'}, {name: 'Lisa'}, {name: 'Maggie'} ])
list([ {name: 'Bart'}, {name: 'Lisa'} ])
list([ {name: 'Bart'} ])
list([])

如果在performFilter(filterBy: string): IProduct[] { filterBy = filterBy.toLocaleLowerCase(); return this.products.filter((product: IProduct) => product.productName.toLocaleLowerCase().indexOf(filterBy) !== -1 || product.description.toLocaleLowerCase().indexOf(filterBy) !== -1); } productName中找到上述代码,则会归档指定的字符串。

或者您可以按以下方式对任何对象属性进行过滤:

description

上面的代码在对象的所有属性中搜索提供的特定字符串。

链接的博客文章提供了其他选项。

将其应用到我所想的中:

performFilter(filterBy: string): IProduct[] {
    filterBy = filterBy.toLocaleLowerCase();
    return this.products.filter((product: IProduct) => 
        Object.keys(product).some(prop => {
            let value = product[prop];
            if (typeof value === "string") {
                value = value.toLocaleLowerCase();
            } 
            return value.toString().indexOf(filterBy) !== -1;
        })    
    );
}