我有几个.filter
函数,其中两个在下面。这些都可以工作并实现它们的意义。我遇到的问题是他们需要花一些时间来进行过滤,因为他们必须迭代来自后端的记录。当前设置的方式是后端返回总共约400的所有记录。不知道为什么它不只是返回结果的第一页(或前几页),返回所有结果只是为了让所有记录分页很容易,但这不是我的决定。
当检查各种复选框时,对所选复选框执行过滤,感觉有点慢,因为当选中其中一个复选框时,在执行过滤时,需要一段很短但很明显的时间来勾选复选框。 / p>
如何优化此代码以使其运行更快?使用underscore.js
是否值得为此目的使用?
.filter('rangeFilter', function() {
return function(hotelResults, price ) {
var filtered = [];
var priceMin = parseInt(price.min);
var priceMax = parseInt(price.max);
angular.forEach(hotelResults, function(hotel) {
if((hotel.Price >= priceMin && hotel.Price <= priceMax)) {
filtered.push(hotel);
}
});
return filtered;
};
})
.filter('ratingsFilter', function() {
return function(hotelResults, ratings) {
filteredResults = []
angular.forEach(hotelResults, function(hotel) {
angular.forEach(ratings, function(rating) {
if (hotel.Rating === rating.value && rating.selected === true) {
filteredResults.push(hotel)
}
})
})
return filteredResults;
}
})
答案 0 :(得分:2)
对于第一个片段,我并没有真正看到优化。
对于第二个,我猜你可以提高时间复杂度。
这可以将时间复杂度从O(n.m)
提高到O(n + m)
.filter('ratingsFilter', function() {
return function(hotelResults, ratings) {
var filteredResults = [];
var ratingsHash = {};
angular.forEach(hotelResults, function(hotel) {
if (!(hotel.Rating in ratingsHash)) {
ratingsHash[hotel.Rating] = [];
}
ratingsHash[hotel.Rating].push(hotel);
});
angular.forEach(ratings, function(rating) {
if ((rating.value in ratingsHash) && rating.selected === true) {
var hotels = ratingsHash[rating.value];
Array.prototype.push.apply(filteredResults, hotels);
}
})
return filteredResults;
}
})