angular 根据 table 列的多个值过滤管道
angular filter pipe on multiple values of table columns
我试图在 table 中的多个属性的多个值上实现过滤器管道。
我能够过滤一个属性的多个值。但是我无法为多个属性的多个值执行此操作。
我在单个属性中实现多个值的管道过滤器,
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'}]
谁能帮我解决这个逻辑问题。
你的代码逻辑错误是你 returning true
如果任何过滤器匹配,而你只想 return 如果所有过滤器匹配则为真。
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]);
});
});
}
我试图在 table 中的多个属性的多个值上实现过滤器管道。
我能够过滤一个属性的多个值。但是我无法为多个属性的多个值执行此操作。
我在单个属性中实现多个值的管道过滤器,
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'}]
谁能帮我解决这个逻辑问题。
你的代码逻辑错误是你 returning true
如果任何过滤器匹配,而你只想 return 如果所有过滤器匹配则为真。
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]);
});
});
}