我有一个管道,用于在用户数组中搜索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);
});
}
答案 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;
})
);
}