使用过滤器和拼接删除数组中的对象在JavaScript中哪一种是最好的方法?

anauzrmj  于 2023-01-01  发布在  Java
关注(0)|答案(5)|浏览(150)

我使用两种方法删除数组中的一个对象:- splice和filter.
此处为拼接代码:-

(this.myArray).splice((this.myArray).indexOf(myobject), 1);

过滤器代码:-

(this.myArray).filter(obj => obj !== myobject);

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

ccgok5k5

ccgok5k51#

我认为christian的答案是正确的,但我想添加一个警告(与性能无关,但为了避免潜在的不希望出现的bug)

警告:一个小细节,当您将spliceindexOf一起使用时要小心。如果 indexOf 返回(-1),也就是说没有找到元素,splice将删除数组的最后一个元素(负索引有效)。

如果决定使用splice而不是filter,请考虑这一点,并在执行splice之前检查 indexOf 结果

bqujaahr

bqujaahr2#

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

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

Angular 在这里没有任何关系,当谈到速度,拼接将获胜
和小测试作为证据https://jsperf.com/array-splice-vs-array-filter/1

hmmo2u0o

hmmo2u0o3#

如果你知道索引使用拼接将是一个O(1)操作,而使用过滤器是一个O(n)操作。

vlju58qv

vlju58qv4#

Array.splice-将更改阵列本身。(使用:(x月1日至1x日)
数组。filter-将返回筛选后的数组。(使用:myFilteredArray = Array.filter
这是在一个包含30个小对象的Array上的测试结果。我在jsbence.me上运行了它:

mccptt67

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中。
你问题的第二部分问的是哪种方法最好,最好的方法可能基于以下两点:

  • myobjectthis.myArray中引用了多少次?
  • 如果它发生多次,并且您希望移除所有引用,请使用过滤器
  • 如果它发生多次,并且您只想移除第一个引用,请使用indexOf
  • 如果只发生一次,问自己问题2:
  • 性能是一个大问题吗?
  • 如果是,那么使用将运行脚本的引擎为它做一个基准测试,并使用性能最好的方法
  • 如果不是,就用你觉得最容易读的那本。

相关问题