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

时间:2017-06-08 11:56:40

标签: filter splice

您好我使用两种方法删除数组中的对象: - 拼接和过滤。

拼接代码: -

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

在此处过滤代码: -

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

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

6 个答案:

答案 0 :(得分:6)

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

  • 拼接 - 允许您从此特定数组中删除元素
  • 过滤器 - 不接触输入数组并创建并返回新的过滤数组
角度与此无关,当谈到速度时,拼接会赢得

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

答案 1 :(得分:3)

检查this性能测试。 它与Angular没什么关系,但更多的是JavaScript。 如果您能够选择最快的方法:)

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

警告:一个小细节,将 splice indexOf 一起使用时要小心。如果 indexOf 返回(-1),表示找不到该元素,则拼接将删除数组的最后一个元素(负索引工作)。

如果您决定使用 splice 而不是 filter ,请在进行 splice <之前检查并考虑 indexOf 结果/ strong>

答案 4 :(得分:1)

关于性能的答案很多,但是您要问的两种方法之间还没有明确提到另一个差异:

您使用indexOf编写的第一个方法只会像在documentation中所说的那样,在myobject中仅拼接对this.myArray的第一个引用,

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

在数组中有多个引用的情况下,您询问使用filter的第二种方法将删除对myobject中对this.myArray的所有引用。这是filter's documentation中的一行对其进行解释:

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


就像chrystian所说的那样,filter也会返回一个新数组,而splice会修改它被调用的数组。为了清楚起见,我写了a little gist并排显示了两个选项的重载。它有关于差异的非常清晰的文档,因此,如果有帮助,请随时使用。 (如果像某些人一样,如果您更喜欢将其用作原型方法,则here's that也是如此。)由于此问题专门针对Angular,因此要点在Typescript中。
您问题的第二部分问哪个最好。最好的方法可能是基于两种情况:

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

答案 5 :(得分:0)

Array.splice-将更改数组本身。 (使用:myArray.splice)
Array.filter-将返回过滤后的Array。 (使用:myFilteredArray = Array.filter)
这是一个由30个小物体组成的阵列的测试结果。我在jsbence.me上运行它:
enter image description here