【发布时间】:2016-02-23 19:21:58
【问题描述】:
假设我有一个包含 5000 个对象(带有布尔值)的数组,我必须在模板中 ng-repeat:
$scope.arr = [
{
"value": true
},
{
"value": false
},
{
"value": false
}
//and so on
]
现在,我想根据一个动态变量过滤这个ng-repeated 数组,比如我在别处设置的“show_filter”。
如果 'show_filter' 设置为 'all' 我想显示所有对象。如果它设置为 false(布尔值),那么我想显示将“value”键设置为 false 的对象。 'show_filter' 设置为 true 时也是如此。
所以,有两种方法:
1.构建自定义过滤器:
我会为过滤任务编写一个自定义过滤器,如下所示:
过滤器:
app.filter('filterArr', function() {
return function(arr, show_filter) {
var filtered_arr = [];
if(show_filter != 'All') { //if show_filter is a boolean value
for(var i = 0; i < arr.length; i++) {
if(arr[i].value == show_filter) {
filtered_arr.push(arr[i]);
}
}
return filtered_arr;
}
else {
return arr; //return the entire array if show_filter is set to 'All'
}
}
})
模板:
obj in arr | filterArr : show_filter
2。在控制器中编写过滤函数:
过滤器:
$scope.filterObjects = function(arr) {
var filtered_arr = [];
if($scope.show_filter != 'All') { //if $scope.show_filter is a boolean value
for(var i = 0; i < arr.length; i++) {
if(arr[i].value == $scope.show_filter) {
filtered_arr.push(arr[i]);
}
}
return filtered_arr;
}
else {
return arr; //return the entire array if show_filter is set to 'All'
}
}
模板:
obj in filterObjects(arr)
以上两种方法中哪一种会更快?我已经看到自定义过滤器代码每次都会针对每个摘要循环执行,而不仅仅是对$scope.show_filter的更改,这让我相信它相当低效。虽然我不确定这两种方式哪个更快。
【问题讨论】:
-
你有两个相同的函数,你问哪个最快?如果您的意思是哪个被调用的次数最少,那么您可能已经回答了自己的问题?
-
第二个函数不知道调用了多少次。
-
最快的替代方法是将过滤后的数组公开给
ngRepeat。第二个函数必须在每个摘要循环中调用。 -
数组是根据外部变量过滤的,外部变量可以通过事件随时设置。所以,我不认为我可以有一个预先过滤的数组。我认为最好的方法是在外部变量上应用 watch 并在 watch 的回调中过滤数组。你怎么看?
-
我就是这个意思。
标签: javascript angularjs performance filter angularjs-filter