当前位置: 首页 > 面试题库 >

AngularJS'ng-filter'在〜1000个元素的数组上非常慢

黄磊
2023-03-14
问题内容

<input>为中的项目名称列表设置了一个简单的搜索过滤器AngularJS

我的清单如下所示:

var uniqueLists = {
    category1: ['item1', 'item2', 'item3' ... 'item180' ], // Real list contains ~180 items
    category2: ['itemA', 'itemB', 'itemC' ... 'itemZZZ' ], // Real list contains ~1080 items
    category3: ['otheritem1', 'otheritem2', 'otheritem3' ]  // Real list contains 6 items
  }

我在Angular中遍历此列表,并在<ul>每个类别的a中打印出结果。

<div ng-repeat="(key,val) in uniqueLists">
    <form ng-model="uniqueLists[index][0]">
        <input ng-model="searchFilter" type="text" />
            <ul>
                <li ng-repeat="value in val | filter: searchFilter">
                    <label>
                         <input type="checkbox" ng-model="selectedData[key][value]" />
                        {{value}}
                    </label>
                </li>
            </ul>
    </form>
</div>

为了清楚起见,selectedData看起来像这样:

var selectedData = {category1: [item1:true], category2: [], category3: []); // if 'item1's checkbox is checked.

尽管filter即使在我速度相当快的计算机上,该列表也很笨拙,但此列表仍然可以正常工作。在输入中输入字母需要1-2秒才能更新列表。

我知道这很可能是因为我一次过滤了大约1000个项目,但是我在其他地方没有看到对此的任何讨论。

有什么办法可以使过滤器获得更好的性能?


问题答案:

筛选器方法的主要问题在于,每次更改dom都会对其进行操作,因此,筛选器的运行速度不是缓慢,而是后果。一种替代方法是使用类似:

ng-show="([item] | filter:searchFilter).length > 0"

在重复元素上。

通过@OverZealous提供一些代码,您可以使用以下内容比较行为:

  • 过滤器:http://jsbin.com/fuwadanu/1/
  • ng-show:http : //html" target="_blank">jsbin.com/xajehulo/1/

更新 :Angular v1.2附带了track by语法。这也有助于解决此类问题。如果元素具有一些唯一属性,则可以使用:

ng-repeat="item in items | filter:searchFilter track by item.id"

item.id所有项目中,哪里必须是唯一的。与track by只有那些以DOM元素将被移除这已经不再是在最后的名单,其他人将被 铭记
。而没有track by整个列表的每次都会 重绘 。简而言之:更少的dom操作=更快的重绘。

  • 跟踪者:http : //jsbin.com/dufasego/1/


 类似资料:
  • 问题内容: 最近,我注意到声明包含64个元素的数组比声明具有65个元素的相同类型的数组要快得多(> 1000倍)。 这是我用来测试的代码: 这将运行在大约6毫秒,如果我更换用它需要大约7秒。如果作业分布在越来越多的线程中,那么这个问题就会成倍地恶化,这就是我的问题所在。 不同类型的数组(例如或)也会发生此问题。大字符串不会发生此问题:,但将其更改为时确实会发生 我想知道为什么会这样,是否有可能规避

  • 问题内容: 我需要在数组中找到最常见的(模态)元素。 我能想到的最简单的方法是为每个唯一元素设置变量,并为每个元素分配一个计数变量,每次将其记录在遍历数组的for循环中时,该变量都会增加。 不幸的是,数组的大小是未知的,并且会很大,所以这种方法是没有用的。 我在Objective- C中遇到了类似的问题,该问题使用NSCountedSet方法对数组元素进行排名。不幸的是,我对编程非常陌生,只能将第

  • 问题内容: 简介: 就我所能搜索到的而言,尚无此问题。 这是一个面试问题。 我什至没有专门寻找代码解决方案,任何算法/伪代码都可以使用。 问题: 给定一个整数数组及其大小,找到2个最小和的 非后续 元素(在数组中不能相邻)。另外,答案中不得包含第一个或最后一个元素(index 和)。解决方案还应该是 时间和空间的复杂性。 例如,当回答是,因为。 当答案为时,因为和不能选择的任何一个,因为处于数组的

  • 问题内容: 我被困在以下程序中: 我有一个输入整数数组,其中只有一个非重复数,例如{1,1,3,2,3}。输出应显示非重复元素,即2。 到目前为止,我执行了以下操作: 最好限制阵列中的解决方案。避免使用集合,地图。 问题答案: 由于几乎可以肯定这是一种学习练习,并且由于您非常接近正确完成它,因此需要进行以下更改才能使其正常工作: 将声明 __移到 外部循环 内部 -需要将标志设置为外部循环的每次迭

  • 我在中有一个带有几个元素的,我正在做的是迭代并显示Array中与null不同的所有元素。 这是: 我的问题:是否可以在一行中迭代null以外的元素?

  • 问题内容: 我有很多对象,我需要将它们分成两个组成一组,以供UI助手使用。 例: 通过这四个数组成为一个数组 有很多分割数组的方法。但是,如果阵列很大,什么是最有效的(成本最低)。 问题答案: 如果您正在寻找效率,则可以使用一种方法来懒散地生成每个包含2个元素的数组,因此您一次只能在内存中存储2个元素: 此方法适用于任何Array,而不仅限于Arrays。 对于Swift 1,没有协议扩展,您将拥