使用filter和splice删除数组中的对象哪一个最好接近angular2?

Har*_*ora 9 filter splice

嗨,我使用两种方法删除数组中的对象: - 拼接和过滤.

拼接代码在这里: -

(this.myArray).splice((this.myArray).indexOf(myobject), 1);
Run Code Online (Sandbox Code Playgroud)

过滤代码: -

(this.myArray).filter(obj => obj !== myobject);
Run Code Online (Sandbox Code Playgroud)

请告诉我们两者之间的差异,哪一个是最好的方法?

srf*_*rnk 9

如果您知道使用 splice 的索引将是 O(1) 操作,而使用 filter 是 O(n) 操作。

  • 我认为拼接的最坏情况时间复杂度实际上是 O(n) ,在您拼接的元素位于需要复制整个数组的位置的情况下。但是,当使用过滤器时,它总是 O(n) ,所以我同意你的断言,即拼接几乎总是更有效。简而言之,除非您拼接的元素位于数组的开头,否则 slice 在时间复杂度方面总是更有效。 (5认同)
  • 同样在大多数情况下,我们可能需要indexOf来与拼接一起工作,而indexOf的成本为O(n);所以一般来说实际上是 O(n) 。 (4认同)

Nad*_*dav 9

Array.splice- 将更改数组本身。(使用:myArray.splice
- 将返回过滤后的数组。(使用:)myFilteredArray = Array.filter
是对 30 个小对象的数组的测试结果。我在jsbence.me上运行了它:
在此输入图像描述


小智 8

我认为 chrystian 的答案是正确的,但我想添加一个警告(与性能无关,但为了避免潜在的不良错误)

警告:一个小细节,当你使用带有indexOf 的splice时要小心。如果indexOf返回 (-1),即未找到该元素,则 splice 将删除数组的最后一个元素(负索引有效)。

如果您决定使用splice而不是过滤器,请考虑并在执行splice之前检查indexOf结果


chr*_*ian 7

我认为这里的主要区别是:

  • splice - 允许您从此特定数组中删除元素
  • filter - 不会触及输入数组,并将创建并返回新的过滤数组

角度与此无关,在速度方面,拼接将获胜

和小测试作为证据https://jsperf.com/array-splice-vs-array-filter/1

  • 我看到现在结果取决于浏览器,在 chromium 中它确实是过滤器获胜,但在 firefox 上它仍然是拼接的 (2认同)

小智 6

关于性能有几个答案,但是您所询问的两种方法之间还有一个未明确提及的区别:

您编写的第一个方法,使用indexOf,只会拼接对myobjectin的第一个引用,正如文档this.myArray中所述,

indexOf() 方法返回可以找到给定元素的第一个索引

您询问使用的第二种方法filter将删除对myobjectin的所有引用this.myArray,以防您在数组中对它有多个引用。以下是过滤器文档中的一行对其进行了解释:

Filter() 为数组中的每个元素调用一次提供的回调函数


正如 chrystian 所说,filter 还返回一个新数组,而 splice 修改它被调用的数组。为了清楚起见,我写了一些要点,并排显示了两个选项的重载。它有关于差异的非常清晰的文档,所以如果它对您有帮助,请随意使用它。(如果您像某些人一样喜欢将其作为原型方法,那么这里也是如此。)由于这个问题专门与 Angular 有关,因此要点在 Typescript 中。
你问题的第二部分问哪个最好。最好的方法可能基于两件事:

  1. myobject中被引用了多少次this.myArray
    • 如果它出现多次,并且您想删除所有引用,请使用过滤器
    • 如果它出现多次,并且您只想删除第一个引用,请使用indexOf
    • 如果只发生一次,问自己问题 2:
  2. 性能是一个大问题吗?
    • 如果是,则使用将运行脚本的引擎对其进行基准测试,并使用性能最高的方法
    • 如果不是,请使用您认为最容易阅读的内容。