如何快速从数组中删除一个特定条目?
这个数组很大,并且包含字符串。
我不仅仅想将 Array[5] 设为 null,而是希望数组大小减少一,并且 array[5] 应该有 array[6] 的内容。
如何快速从数组中删除一个特定条目?
这个数组很大,并且包含字符串。
我不仅仅想将 Array[5] 设为 null,而是希望数组大小减少一,并且 array[5] 应该有 array[6] 的内容。
如果您不关心数组中元素的顺序(但只是想让它变短1个),可以将数组的最后一个元素复制到要删除的索引处,然后弹出最后一个元素。
array[index] = array[array.length-1];
array.pop();
如果可以重新排列数组的顺序,我会猜测这种方法在CPU时间上更快。
编辑:你应该针对你特定的情况进行基准测试;我最近就是这样做的,只使用splice更快。(可能是因为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);
根据您的情况,如果您想优先考虑性能,可以考虑使用字典而不是数组。
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];
splice
返回一个数组,因此您需要使用array.splice(5, 1)[0];
。 - Alex Dean