如何优化我的.filter功能,以便更快地完成过滤?

时间:2014-12-12 00:13:47

标签: angularjs

我有几个.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;
  }
})

1 个答案:

答案 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;
  }
})