您好我使用两种方法删除数组中的对象: - 拼接和过滤。
拼接代码: -
(this.myArray).splice((this.myArray).indexOf(myobject), 1);
在此处过滤代码: -
(this.myArray).filter(obj => obj !== myobject);
请告诉我们两者之间的差异,哪一种是最好的方法?
答案 0 :(得分:6)
我认为这里的主要区别是:
答案 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中。
您问题的第二部分问哪个最好。最好的方法可能是基于两种情况:
myobject
中引用this.myArray
多少次?
答案 5 :(得分:0)
Array.splice-将更改数组本身。 (使用:myArray.splice)
Array.filter-将返回过滤后的Array。 (使用:myFilteredArray = Array.filter)
这是一个由30个小物体组成的阵列的测试结果。我在jsbence.me上运行它: