我使用两种方法删除数组中的一个对象:- splice和filter.
此处为拼接代码:-
(this.myArray).splice((this.myArray).indexOf(myobject), 1);
过滤器代码:-
(this.myArray).filter(obj => obj !== myobject);
请告诉我们两者之间的区别,哪一个是最好的方法?
我使用两种方法删除数组中的一个对象:- splice和filter.
此处为拼接代码:-
(this.myArray).splice((this.myArray).indexOf(myobject), 1);
过滤器代码:-
(this.myArray).filter(obj => obj !== myobject);
请告诉我们两者之间的区别,哪一个是最好的方法?
5条答案
按热度按时间ccgok5k51#
我认为christian的答案是正确的,但我想添加一个警告(与性能无关,但为了避免潜在的不希望出现的bug)
警告:一个小细节,当您将splice与indexOf一起使用时要小心。如果 indexOf 返回(-1),也就是说没有找到元素,splice将删除数组的最后一个元素(负索引有效)。
如果决定使用splice而不是filter,请考虑这一点,并在执行splice之前检查 indexOf 结果
bqujaahr2#
我认为这里的主要区别是:
*splice-允许您从此特定数组中删除元素
*filter-不接触输入数组,将创建并返回新的过滤数组
Angular 在这里没有任何关系,当谈到速度,拼接将获胜
和小测试作为证据https://jsperf.com/array-splice-vs-array-filter/1
hmmo2u0o3#
如果你知道索引使用拼接将是一个O(1)操作,而使用过滤器是一个O(n)操作。
vlju58qv4#
Array.splice
-将更改阵列本身。(使用:(x月1日至1x日)数组。filter-将返回筛选后的数组。(使用:
myFilteredArray = Array.filter
)这是在一个包含30个小对象的Array上的测试结果。我在jsbence.me上运行了它:
mccptt675#
关于性能有几个答案,但您所问的两种方法之间还有另一个没有明确提及的差异:
您编写的第一个方法使用
indexOf
,它只会在this.myArray
中拼接对myobject
的第一个引用,正如documentation中所述,indexOf()方法返回可以找到给定元素的第一个索引
第二种方法是使用
filter
,如果数组中有多个对this.myArray
的引用,它将删除this.myArray
中对myobject
的每个引用。filter's documentation中的一行解释了这一点:Filter()为数组中的每个元素 * 调用提供的回调函数 * 一次
正如christian所说,filter也返回一个新数组,而splice修改它被调用的数组,为了清楚起见,我编写了a little gist,它并排显示了两个选项的重载,它有关于差异的非常清楚的文档,所以如果它对你有帮助的话,请随意使用它。(如果您像有些人一样喜欢将其作为原型方法,那么here's that也是如此。)由于这个问题专门针对Angular ,因此要点在Typescript中。
你问题的第二部分问的是哪种方法最好,最好的方法可能基于以下两点:
myobject
在this.myArray
中引用了多少次?