带json数组筛选器的Filterpredicate



我有一个非常简单的过滤器:

this.dataSource.filter = JSON.stringify({
state: this.searchForm.controls['stateInputControl'].value,
product: this.searchForm.controls['productInputControl'].value
});

但是,我需要添加一个筛选器谓词,因为我需要有一个或语句来表示状态。如果我只是通过了状态,那么过滤器谓词将很简单:

this.dataSource.filterPredicate = (data,filter:string ) => {
return (data.state == filter || data.state == "AL")
};

然而,过滤器不仅仅是一个字符串,它还是一个json数组。所以我需要做这样的事情:

this.dataSource.filterPredicate = (data,filter:{state:string,product:string} ) => {
return ((data.state == filter.state || data.state == "AL") && data.product == filter.product)
};

然而,这引发了一个错误:

Type'(data:Guide,filter:{state:string;product:string;}(=>boolean'不可分配给Type'(data:Guide,filter:string(=>boolean'
参数"filter"one_answers"filter"的类型不兼容
类型"string"不可分配给类型"{state:string;product:string!}"。

如何将filterPredicate与作为json数组的筛选器一起使用?

我确定了解决方案。您只需接收序列化的JSON,然后在过滤器谓词声明中解析JSON,如下所示:

this.dataSource.filterPredicate = (data,filter:string ) => {
var s = JSON.Parse(filter);
return ((data.state == s.state || data.state == "AL") && data.product == s.product)
};

filterPredicate还应该处理null/unknown/blank值,这些值可能会破坏过滤。这个filterpredictive的更好格式是:

var s = JSON.parse(filter);
if (s.state && s.state.length && data.state !== s.state && data.state !== 'AL' && data.state !== '') { return false }
else if (s.product && s.product.length && data.product !== s.product) { return false }
return true;

最新更新