从Array()中间删除一个条目的最快方法

时间:2009-03-12 12:23:46

标签: actionscript-3 flex flex3

从Array()中间删除一个特定条目的最快方法是什么

数组很大,有字符串。

我不想只设置Array [5] = null,而是将数组大小减少一个,而array [5]应该包含array [6]等的内容。

5 个答案:

答案 0 :(得分:51)

没有任何基准来支持这一点,但人们会认为原生的Array.splice方法是最快的......

因此,要删除索引5处的条目:

array.splice(5, 1);

答案 1 :(得分:24)

如果您不关心数组中项目的顺序(但只是希望它缩短1),您可以将数组的最后一个元素复制到要删除的索引,然后 pop < / em>关闭最后一个元素。

array[index] = array[array.length-1];
array.pop();

如果你可以放弃重新排序数组,我猜这会更快,CPU时间更快。

编辑:您应该根据具体情况进行基准测试;我最近这样做了,拼接更快。 (可能是因为Chrome实际上并没有将数组存储为单个连续缓冲区。)

答案 2 :(得分:3)

Array.splice() “向数组添加元素并从中删除元素”

myArr.splice(indexToRemove, 1); // only removing one index, thus the 1

答案 3 :(得分:3)

我测试了Array.prototype.splice()并发现它在大型数组上非常慢。

更快的删除元素的方法是将要保留的元素复制到新数组,同时跳过要删除的元素。完成复制后,只需使用新数组覆盖旧数组。

在我的测试中,我从包含100.000项的数组中删除了所有其他元素。该测试将Array.prototype.splice()与其他方法进行了比较。结果如下:

855 ms = splice
  7 ms = manual copying without preserving the original array
 14 ms = manual copying with preserving the original array

这是最后一个方法的代码:

var arrB = [],
    i=varA.length,
    j=0;

// copy even items to a new array
while(i > 0) {
    i-=2; // skip two elements
    arrB[j++] = arrA[i];
}

// clear the old array
arrA.splice(0, arrA.length);

// copy values back to the old array
// array is preserved (references to the array don't need to be updated)
arrA.push.apply(arrA, arrB);

可以在jsFiddle:http://jsfiddle.net/sansegot/eXvgb/3/

上找到实际测试

如果您只需要删除一些项目,结果就会大不相同 - 在这种情况下,Array.prototype.splice()会更快(虽然差异不是很大)!只有当你需要多次调用splice()时,才有必要实现自定义算法。 第二个测试,其中有限数量的元素将被删除可以在这里找到: http://jsfiddle.net/sansegot/ZeEFJ/1/

答案 4 :(得分:1)

根据您的情况,如果您想优先考虑性能,可以考虑使用Dictionary而不是Array。

var dict:Dictionary = new Dictionary();

// The following value/key set should be customized so you can 
// get use of them in your specific case.

dict[item1] = item1;
dict[item2] = item2;

...

delete dict[item1];