从 Array() 中间删除一个特定条目的最快方法是什么
数组很大,有字符串。
我不想只设置 Array[5] = null,而是应该将数组大小减少 1,并且 array[5] 应该具有 array[6] 等的内容。
从 Array() 中间删除一个特定条目的最快方法是什么
数组很大,有字符串。
我不想只设置 Array[5] = null,而是应该将数组大小减少 1,并且 array[5] 应该具有 array[6] 等的内容。
如果您不关心数组中项目的顺序(但只是希望它缩短 1),您可以将数组的最后一个元素复制到要删除的索引,然后将最后一个元素弹出。
array[index] = array[array.length-1];
array.pop();
如果您可以摆脱对数组的重新排序,我想这会更快,在 CPU 时间方面。
编辑:您应该针对您的具体情况进行基准测试;我最近这样做了,只是拼接更快。(大概是因为 Chrome 实际上并没有将数组存储为单个连续缓冲区。)
Array.splice() “向数组添加元素并从数组中删除元素”:
myArr.splice(indexToRemove, 1); // only removing one index, thus the 1
我测试了 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/
根据您的情况,如果您想优先考虑性能,您可以考虑使用字典而不是数组。
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];