Array()の途中から1つの特定のエントリを削除する最も速い方法は何ですか
配列は文字列を持つ大きなものです。
私は単にArray [5] = nullを設定したくありませんが、代わりに配列サイズを1減らし、array [5]にarray [6]などのコンテンツを含める必要があります。
これをサポートするベンチマークはありませんが、ネイティブの Array.splice メソッドが最速であると想定されます...
したがって、インデックス5のエントリを削除するには:
array.splice(5, 1);
配列内のアイテムの順序を気にしない場合(ただし、1だけ短くしたい場合)、配列の最後の要素を削除するインデックスにコピーして、pop最後の要素。
array[index] = array[array.length-1];
array.pop();
配列を並べ替えることができれば、CPU時間的にはこれがより高速になると思います。
編集:あなたはあなたの特定のケースのためにベンチマークする必要があります。私は最近これを行い、スプライスするだけの方が高速でした。 (おそらくChromeは実際には配列を単一の連続したバッファとして格納していないためです。)
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()を何度も呼び出す必要がある場合のみ、カスタムアルゴリズムを実装する価値があります。限られた数の要素を削除する2番目のテストは、次の場所にあります。 http://jsfiddle.net/sansegot/ZeEFJ/1/
Array.splice() "配列に要素を追加し、配列から要素を削除します":
myArr.splice(indexToRemove, 1); // only removing one index, thus the 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];