JavaScriptで配列を空にするにはどうすればよいですか?

2009年08月05日に質問されました。  ·  閲覧回数 2.9M回  ·  ソース

akano1 picture
2009年08月05日

配列を空にする方法はありますか?もしそうなら.remove()

例えば、

A = [1,2,3,4];

どうすればそれを空にできますか?

回答

Philippe Leybaert picture
2009年08月05日
4644

既存の配列をクリアする方法A

方法1

(これは質問に対する私の最初の答えでした)

A = [];

このコードは、変数Aを新しい空の配列に設定します。 これは、元の配列Aへの参照が他の場所にない場合に最適です。これは、実際にはまったく新しい(空の)配列を作成するためです。 この配列を別の変数またはプロパティから参照した場合、元の配列は変更されないままになるため、このメソッドには注意する必要があります。 これは、元の変数Aのみ配列を参照する場合にのみ使用してください。

これは最速のソリューションでもあります。

このコードサンプルは、この方法を使用するときに発生する可能性のある問題を示しています。

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

方法2Matthew Crumleyによって提案された)

A.length = 0

これにより、既存の配列の長さを0に設定してクリアします。これは、JavaScriptのすべての実装で機能するとは限らないと主張する人もいますが、そうではないことがわかりました。 配列の長さプロパティは読み取り/書き込みプロパティであるため、ECMAScript5で「厳密モード」を使用する場合にも機能します。

方法3Anthonyによって提案された)

A.splice(0,A.length)

.splice()すると完全に機能しますが、 .splice()関数は削除されたすべての項目を含む配列を返すため、実際には元の配列のコピーを返します。 ベンチマークは、これがパフォーマンスにまったく影響を与えないことを示唆しています。

方法4tanguy_kによって提案された)

while(A.length > 0) {
    A.pop();
}

このソリューションはそれほど簡潔ではなく、元の回答で参照されていた以前のベンチマークとは異なり、最も遅いソリューションでもあります。

パフォーマンス

既存のアレイをクリアするすべての方法の中で、方法2と3はパフォーマンスが非常に似ており、方法4よりもはるかに高速です。このベンチマークを参照してください。

以下の回答でDiadistisが指摘しているように、上記の4つの方法のパフォーマンスを決定するために使用された元のベンチマークには欠陥がありました。 元のベンチマークはクリアされた配列を再利用したため、2回目の反復ではすでに空の配列がクリアされていました。

次のベンチマークはこの欠陥を修正します: http


これはホットな話題であり、多くの論争の原因となっています。 実際には多くの正解があり、この回答は非常に長い間受け入れられた回答としてマークされているため、ここではすべての方法を含めます。 この回答に投票する場合は、私が参照した他の回答にも賛成してください。

Matthew Crumley picture
2009年08月06日
2502

更新する必要のある他の参照があるために元の配列を保持する必要がある場合は、長さをゼロに設定することで、新しい配列を作成せずに元の配列をクリアできます。

A.length = 0;
tanguy_k picture
2013年06月26日
294

ここでは、同じ配列(「可変」)を最も高速に動作する実装を示します。

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

参考までに、 while (array.pop())簡略化することはできません。テストは失敗します。

参考までに、マップセットclear()定義しますが、配列にclear()があるのは論理的だと思われます。

TypeScriptバージョン:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

対応するテスト:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

ここで更新されたjsPerf: http //jsperf.com/array-destroy/32

Anthony picture
2011年11月15日
225

よりクロスブラウザフレンドリーでより最適なソリューションは、以下のようにspliceメソッドを使用して配列Aのコンテンツを空にすることです。

A.splice(0, A.length);

Bekim Bacaj picture
2016年04月30日
113

今までに2739以上の賛成票があった回答は、誤解を招き、正しくありません。

問題は、「既存のアレイをどのように空にするか」です。 例: A = [1,2,3,4]

  1. A = []が答えです」と言うのは無知で絶対に間違っています。 [] == []falseです。

    これは、これら2つの配列が、独自の2つのIDを持つ、2つの別個の個別のオブジェクトであり、それぞれが独自にデジタル世界で独自のスペースを占めるためです。


あなたのお母さんがあなたにゴミ箱を空にするように頼んだとしましょう。

  • 求められたことをしたかのように新しいものを持ち込むことはありません。
  • 代わりに、ゴミ箱を空にします。
  • 充填された缶を新しい空の缶と交換したり、充填された缶からラベル「A」を取り出して、 A = [1,2,3,4]; A = [];ように新しい缶に貼り付けたりすることはありません。

配列オブジェクトを空にすることは、これまでで最も簡単なことです。

A.length = 0;

このように、「A」の下の缶は空であるだけでなく、新品同様にきれいです!


  1. さらに、缶が空になるまで手でゴミを取り除く必要はありません! 次のように、缶が空になるまでゴミを拾わないように、既存のものを完全に1ターンで空にするように求められました。

    while(A.length > 0) {
        A.pop();
    }
    
  2. また、左手をゴミ箱の下部に置き、右手を上にして、次のように内容を引き出すことができるようにします。

    A.splice(0, A.length);
    

いいえ、空にするように求められました。

A.length = 0;

これは、特定のJavaScript配列の内容を正しく空にする唯一のコードです。

kenshou.html picture
2014年05月14日
63

性能テスト:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest
leech picture
2012年12月11日
36

これをJavaScriptファイルに追加して、配列を「クリア」できるようにすることができます。

Array.prototype.clear = function() {
    this.splice(0, this.length);
};

次に、次のように使用できます。

var list = [1, 2, 3];
list.clear();

または、何かを破壊しないようにしたい場合:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

多くの人が、ネイティブオブジェクト(Arrayなど)を変更するべきではないと考えています。私は同意する傾向があります。 これを処理する方法を決定する際には注意してください。

Diadistis picture
2015年02月17日
19

while; pop / shiftのパフォーマンスに関しては、回答とコメントの両方で多くの混乱と誤った情報があります。 while / popソリューションのパフォーマンスは(予想どおり)

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}

正しく機能する新しいテストを作成しました:

http://jsperf.com/empty-javascript-array-redux

警告:このバージョンのテストでも、アレイのクローン作成はテスト時間の大部分を占めるため、実際の違いを確認することはできません。 それでも、 spliceが配列をクリアする最速の方法であることを示しています( []は最速ですが、実際には既存の配列をクリアしないため、考慮していません)。

Alireza picture
2017年05月24日
19

これを行う関数を簡単に作成したり、長さを変更したり、再利用のためにremove()関数としてネイティブ配列に追加したりすることもできます。

あなたがこの配列を持っていると想像してください:

var arr = [1, 2, 3, 4, 5]; //the array

OK、これを実行するだけです:

arr.length = 0; //change the length

結果は次のとおりです。

[] //result

配列を空にする簡単な方法...

また、ループを使用する必要はありませんが、それを行うための別の方法です。

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

あなたが考えることができるトリッキーな方法もあります、例えばこのようなもの:

arr.splice(0, arr.length); //[]

したがって、arrに5つのアイテムがある場合、0から5つのアイテムをスプライスします。つまり、配列には何も残りません。

また、たとえば、単にアレイを再割り当てするような他の方法もあります。

arr = []; //[]

配列関数を見ると、これを行う方法は他にもたくさんありますが、最も推奨される方法は長さを変更することです。

そもそも言ったように、あなたの質問に対する答えなので、remove()のプロトタイプを作成することもできます。 上記のメソッドの1つを選択して、JavaScriptのArrayオブジェクトにプロトタイプを作成するだけです。

Array.prototype.remove = Array.prototype.remove || function() {
  this.splice(0, this.length);
};

このように呼び出すだけで、JavaScriptアプリケーションの配列を空にすることができます。

arr.remove(); //[]
Bendeg&#250;z picture
2013年02月23日
15
Array.prototype.clear = function() {
    this.length = 0;
};

そしてそれを呼んでください: array.clear();