嗨,我使用两种方法删除数组中的对象: - 拼接和过滤.
拼接代码在这里: -
(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)
请告诉我们两者之间的差异,哪一个是最好的方法?
如果您知道使用 splice 的索引将是 O(1) 操作,而使用 filter 是 O(n) 操作。
Array.splice- 将更改数组本身。(使用:myArray.splice)
- 将返回过滤后的数组。(使用:)myFilteredArray = Array.filter这
是对 30 个小对象的数组的测试结果。我在jsbence.me上运行了它:

小智 8
我认为 chrystian 的答案是正确的,但我想添加一个警告(与性能无关,但为了避免潜在的不良错误)
警告:一个小细节,当你使用带有indexOf 的splice时要小心。如果indexOf返回 (-1),即未找到该元素,则 splice 将删除数组的最后一个元素(负索引有效)。
如果您决定使用splice而不是过滤器,请考虑并在执行splice之前检查indexOf结果
我认为这里的主要区别是:
角度与此无关,在速度方面,拼接将获胜
和小测试作为证据https://jsperf.com/array-splice-vs-array-filter/1
小智 6
关于性能有几个答案,但是您所询问的两种方法之间还有一个未明确提及的区别:
您编写的第一个方法,使用indexOf,只会拼接对myobjectin的第一个引用,正如文档this.myArray中所述,
indexOf() 方法返回可以找到给定元素的第一个索引
您询问使用的第二种方法filter将删除对myobjectin的所有引用this.myArray,以防您在数组中对它有多个引用。以下是过滤器文档中的一行对其进行了解释:
Filter() 为数组中的每个元素调用一次提供的回调函数
正如 chrystian 所说,filter 还返回一个新数组,而 splice 修改它被调用的数组。为了清楚起见,我写了一些要点,并排显示了两个选项的重载。它有关于差异的非常清晰的文档,所以如果它对您有帮助,请随意使用它。(如果您像某些人一样喜欢将其作为原型方法,那么这里也是如此。)由于这个问题专门与 Angular 有关,因此要点在 Typescript 中。
你问题的第二部分问哪个最好。最好的方法可能基于两件事:
myobject中被引用了多少次this.myArray?