使用关联数组过滤 ng-repeat
使用关联数组过滤 ng-repeat
我有一个关联数组(或者更准确地说是对象)
$scope.items = { 'x': {...}, 'y': {...} };
我想要使用ng-repeat来循环遍历,这个工作得很好
然而过滤器似乎没有起作用,它被定义为
$scope.customFunction = function (item) { return item.status === 'active'; }
然而,过滤器没有起作用。无论过滤器是什么,我总是得到整个集合。在过滤器控制器中调用警报甚至都没有显示出来。似乎根本没有调用该函数。
以前我是通过遍历数组来实现过滤的,这个方法很好用:
$scope.items = [ {...}, {...} ];
出于简单起见,我没有包含我的逻辑,我有一些过滤逻辑而不仅仅是返回false。
问题原因:
使用ng-repeat指令时,想要对一个关联数组进行过滤,但是ng-repeat指令默认只能对数组进行过滤,无法直接对关联数组进行过滤。
解决方法:
通过编写一个自定义的过滤器(filterObject),可以对关联数组进行过滤。该过滤器的实现方式是遍历关联数组中的每个元素,根据指定的回调函数对每个元素进行判断,满足条件的元素会被添加到一个新的关联数组中并返回。
具体代码如下:
app.filter('filterObject', function() { return function(items, callback) { var filtered = {}; angular.forEach(items, function(item, key) { if (callback(item)) { filtered[key] = item; } }); return filtered; }; });
使用方式如下:
item in items | filterObject:
其中,items为要进行过滤的关联数组,
问题的原因是,ng-repeat指令无法直接对关联数组进行过滤,因为ng-repeat默认是针对数组进行迭代的,而不是对象的属性。解决方法是在过滤之前手动将对象转换为数组。然而,这样做会导致在ng-repeat中无法访问id属性。
在进行任何过滤逻辑之前,需要使用items对象填充一个标准数组。
以下是一个执行所述逻辑的过滤器示例:
app.filter('customFunction', function(){ return function (items) { var filtered = []; angular.forEach(items, function(item){ if (item.status === 'active') { filtered.push(item); } }); return filtered; }; });
通过使用自定义的customFunction过滤器,可以实现对关联数组进行过滤的功能。