过滤($filter)从对象列表中匹配值,不包括不必要的属性

Filtering ($filter) matching values from list of objects excluding unnecessary properties

本文关键字:不包括 不必要 属性 filter 列表 对象 过滤      更新时间:2023-09-26

我试图通过定义我的自定义过滤器st-set-filter="myCustomFilter"来修改智能表全局搜索的行为。在这里

.filter('myCustomFilter', ['$filter', function($filter){
    return function(input, predicate){
        return $filter('filter')(input, predicate, false);
    }
}])

Smart Table输入是一个对象列表,它们的属性是列的名称。我想只过滤表列的给定子集。

如果在输入foo后输入console.log predicate,我将看到类似Object {$: "foo"}的内容。这意味着过滤器正在查找列表中对象的任何属性(即列)的匹配。

是否有一种方法来正确定义谓词根据我的需求(例如排除不必要的属性?

只需将该排除逻辑放入过滤器谓词中。您可以通过它的函数名将谓词直接传递给HTML。

谓词函数是接受一些形参(通常是对象)并返回真或假值的函数。该谓词通常会对数组的每个元素单独求值。在$filter的情况下,谓词决定是否包含或排除该元素。这意味着您只需要编写该函数来正确地包含正确的元素,同时排除错误的元素。

在angular的$filter的文档中,谓词有这样的签名:

function(value, index, array):谓词函数可用于编写任意过滤器。对于数组中的每个元素调用该函数,该元素、该元素的索引和整个数组本身作为参数。

不必使用所有的输入,通常只需要第一个参数(元素本身)。您的过滤谓词可能如下所示:

$scope.customFilter = function(item, index, array) {
  var excluded = item.testResult == 'fail';
  //.contains() logic for a search filter 
  var included = item.name.toLowerCase().indexOf($scope.filterData.name.toLowerCase()) > -1;
  return included && !excluded;
};

然后将谓词函数本身传递给HTML中的过滤器:

<div ng-repeat="obj in data | filter:customFilter">
     Do stuff with the filtered data
</div>

我已经链接了一个关于plnkr的演示,演示了谓词如何与表单的其他部分交互以包含某些元素同时排除其他元素的基本思想。


关于智能表。我不确定你的智能表期待什么,但如果它只是想要一个$filter对象,那么你应该能够利用$filterpredicate参数。只需将谓词函数(如上面所示)传递到带有filterName:arg1的自定义过滤器中。我从Todd Motto的页面(第3节:过滤带参数的重复)中学到了这种语法。

筛选定义

//same as your filter, but named a bit better
.filter('appLevelFilter', ['$filter', function($filter){
    return function(input, predicate){
        return $filter('filter')(input, predicate, false);
    }
}])
HTML

<div ng-repeat="obj in data | appLevelFilter:customFilter">
     Do stuff with the filtered data
</div>