Javascript 如何使用knockoutjs实现高效过滤器

Javascript 如何使用knockoutjs实现高效过滤器,javascript,knockout.js,Javascript,Knockout.js,我有一个100个项目的列表,它们显示在一个列表中。 还有一项规定适用于两个过滤器。 我正在使用knockoutJS进行数据绑定。目前的实施情况如下: var vmModel = function() { var self = this; self.items = ko.observableArray([]) self.filter1 = ko.observable() self.filter2 = k

我有一个100个项目的列表,它们显示在一个列表中。 还有一项规定适用于两个过滤器。 我正在使用knockoutJS进行数据绑定。目前的实施情况如下:

var vmModel = function() {
            var self = this;
            self.items = ko.observableArray([])
            self.filter1 = ko.observable()
            self.filter2 = ko.observable()
            self.filter3 = ko.observable()
            self.filteredItems = ko.computed(function(){
                 var allItems = self.items()
                 if (self.filter1()) {
                     allItems = ko.utils.arrayFilter(allitems, 
                                    function(item) {return "some condition";})}
                 ...
                 Other filters
                 ...
                 }) // end of computed function
            })// end of vmModel
在我的HTML中

<ul data-bind="foreach: filteredItems">
    <li data-bind="text: some data"></li>
</ul>
每当其中一个过滤器发生更改时,将重新计算整个filteredItems。因此,当用户设置filter1和filter2时,filter1将应用于100个项目。然后,对100个项目再次应用过滤器1和过滤器2。
我想知道是否有更有效的方法应用过滤器?i、 重复使用以前过滤的结果?

KO只知道在计算值中使用了多个可观察值,但它不知道为什么。我认为您不能指定将代码的特定部分应用于可观察的更改事件

我认为这样做的唯一方法是将值存储到一个不可观察的私有变量中,只是一个标准的JS变量。调用computed时,将新变量与最新变量进行比较。如果存在不同的值,则应用过滤器并在私有变量上存储新值。

您可能需要使用

它提供了高效的映射和过滤功能:

这个库的关键点是这些转换是高效完成的。具体地说,执行映射的回调函数仅在严格必要时才被调用,这通常仅适用于新添加的项。当您向源数据添加新项时,我们不需要重新映射现有项。对源数据重新排序时,输出顺序会相应地更改,而不会重新映射任何内容

如果你只是将数字平方,那么这个效率可能不会有多大影响, 但是,当您映射自定义对象的复杂嵌套图时,它 以最少的时间执行每个映射更新可能很重要 工作


看来你低估了现代设备的计算能力。唯一能让事情变得更平滑的真正功能是对计算结果进行评分,而不是对每个过滤器使用ko.utils.arrayFilter。最好使用一个for循环,然后根据过滤器对每个项目进行过滤。这意味着,如果应用了多个过滤器,那么所有项目中仍然只有一个循环。正如f_martinez所说,也可以使用速率限制,但这意味着过滤器不会立即应用,这可能是你不想要的。@WayneEllery我想我也在做同样的事情。问题是,当应用第二个筛选器时,会调用相同的循环,然后将筛选器1和筛选器2应用于vanila列表项。请您解释一下,假设filteredList1==具有筛选器1的项,然后当我添加另一个筛选器时,将筛选器2添加到其中?filteredList1还是原始列表项?在这两种情况下,filteredList1和filteredList2将不相同。我也不想逐项比较它们。