34

Array()の途中から特定のエントリを削除する最速の方法は何ですか

配列は文字列を持つ大きな配列です。

Array [5] = nullに設定したくはありませんが、代わりに配列サイズを1つ減らし、array[5]にarray[6]などのコンテンツを含める必要があります。

4

5 に答える 5

67

これをサポートするベンチマークはありませんが、ネイティブのArray.spliceメソッドが最速であると想定されます...

したがって、インデックス 5 のエントリを削除するには:

array.splice(5, 1);
于 2009-03-12T12:38:24.747 に答える
32

配列内のアイテムの順序を気にしない場合 (ただし、1 つ短くしたい場合) は、配列の最後の要素を削除するインデックスにコピーしてから、最後の要素を削除できます

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

配列の並べ替えを回避できれば、これは CPU 時間の点でより高速であると思います。

編集:特定のケースのベンチマークを行う必要があります。私は最近これを行いましたが、スプライスするだけの方が高速でした. (おそらく、Chrome が実際には配列を単一の連続バッファーとして格納していないためです。)

于 2009-03-12T12:30:13.813 に答える
5

Array.splice() 「配列に要素を追加し、配列から要素を削除します」 :

myArr.splice(indexToRemove, 1); // only removing one index, thus the 1
于 2009-03-12T12:39:10.640 に答える
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() を何度も呼び出す必要がある場合にのみ、カスタム アルゴリズムを実装する価値があります。限られた数の要素を削除する 2 番目のテストは、http: //jsfiddle.net/sansegot/ZeEFJ/1/にあります。

于 2013-04-04T14:14:28.803 に答える
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];
于 2009-03-13T01:35:40.450 に答える