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


2197

配列を空にする方法はあり.remove()ますか?

例えば、

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

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


1
ここでは、さまざまな可能性を備えたベンチマーク:jsben.ch
#

回答:


4414

既存の配列をクリアする方法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のすべての実装ではこれが機能しない可能性があると主張する人もいますが、そうではないことがわかりました。配列のlengthプロパティは読み取り/書き込みプロパティであるため、ECMAScript 5で「strictモード」を使用する場合にも機能します。

方法3(として提案によってアンソニー

A.splice(0,A.length)

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

方法4tanguy_kの提案による)

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

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

パフォーマンス

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

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

次のベンチマークはこの欠陥を修正します:http : //jsben.ch/#/hyj65。メソッド#2(長さプロパティ)と#3(スプライス)が最速であることを明確に示しています(元の配列を変更しないメソッド#1はカウントしません)。


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


184
while (A.length) { A.pop(); }、必要なし> 0
Ivan Black

327
> 0より読みやすい私見です。また、2つの間にパフォーマンスの違いはありません。
Philippe Leybaert 2014

10
@daghan、あなたが何を言おうとしているのかはまったく明確ではありません。新しいb配列aが割り当てられた後でも、古い配列への参照を保持します。同じ配列cd引き続き参照します。したがって、出力の違いが予想されます。
shovavnik 2014

9
@DiegoJancicメソッド#1は、配列をクリアしないため、カウントされません。新しいものを作成します。ベンチマークに含めるべきではありません。
Philippe Leybaert、2014年

44
while(A.pop())配列の項目が誤っている場合は使用できません。たとえば、A = [2、1、0、-1、-2]の場合、Aは[2、1]になります。でも、while(A.pop() !== undefined)あなたが値の一つとして、未定義の配列を持つことができるので、動作しません。おそらくコンパイラが最適化していないのでしょう。
Jonathan Gawrych、2015年

2461

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

A.length = 0;

17
ECMAScript 5 Standardはこれについて何と言っていますか?
パセリエ

212
@Pacerier:ES5でも動作します。セクション15.4から:「... lengthプロパティが変更されるたびに、名前が新しい長さ以上の値を持つ配列インデックスであるすべてのプロパティが自動的に削除されます」
Matthew Crumley '21 / 06/21

2
@einar:JavaScriptの配列は常に、配置したものに合わせて拡張されるため、呼び出すmyarray.push(whatever)と長さが1加算されます。したがって、長さを設定すると配列が切り捨てられますが、永続的なものではありません。
Matthew Crumley、2011年

12
@LosManosストリクトモードでもlength特別なプロパティですが、読み取り専用ではないため、引き続き機能します。
Matthew Crumley、2013年

11
@MattewCrumley私はいくつかのテストを行いました、そしてそれはa.length = 0が配列全体を効率的にクリアするのではないようです。jsperf.com/length-equal-0-or-new-array参照が1つある場合(および保持する追加のプロパティを追加していない場合)、新しい配列を作成し、ガベージコレクタ。適切なときに実行されます。
Paul Brewczynski 2013年

289

ここで、同じ配列(「可変」)を維持しながら、最も速く機能する実装

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

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

参考までに、MapSetの定義clear()ではclear()Arrayについても同様に論理的に考えられます。

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 http://jsperf.com/array-destroy/152


5
TTあなたの答えは(同時に)正確で速い唯一の回答ですが、「賛成票」ははるかに少なくなります。まあ、人々は遅い遅いきれいなソリューションが好きなようです:/
obenjiro

@naomikしかし、これは基本的な機能の1つであり、デフォルトで存在していたはずです。
thefourtheye 2013

7
@thefourtheyeパフォーマンスの良い解決策ですが、@ naomikには同意しますが、ネイティブオブジェクトは変更しないでください。ポイントの横にあるべきだと言って、問題はあなたがグローバルを変更していることです、それは悪いです。他の人が使用できるようにコードを提供している場合は、予期しない副作用が発生することはありません。別のライブラリもを変更しArray.prototype、それがわずかに異なる何かを行っていたとしたら、コード全体[].clear()が少し間違っていたとします。これはデバッグするのが楽しくありません。したがって、一般的なメッセージは次のとおりです。グローバルを変更しないでください。
jpillora 2013

3
@thefourtheyeグローバルスコープを変更しないことの要点は、他の誰かのコードがその名前をすでに使用している(または使用する予定である)どうかわからないためです。ローカルスコープ内の関数をお勧めします。したがって、アプリケーション/ライブラリのIIFE内でを実行してからfunction clear(arr) { while(arr.length) arr.pop(); }clear(arr)ではなくで配列をクリアしますarr.clear()
jpillora 2013

2
この方法は多くのより遅い判明.splice()して.length=0。ベンチマークは正しくありませんでした。私の更新された答えを見てください。
Philippe Leybaert、2015

216

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

A.splice(0, A.length);


49
なぜこれはよりブラウザに優しいのですか?A.lengthに問題があるブラウザーは何ですか?
stricjux

4
@ jm2あなたが言っていることは完全に真実ではありません。問題の配列を実際に変更し、その後すべての参照が影響を受けます。私のjsFiddleのテストを参照してください:jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya

3
@alexいいえ、splice変更しません。配列を変更し、削除したエントリを返します。最初のドキュメントを読む:developer.mozilla.org/en-US/docs/JavaScript/Reference/...を
デビッド・ヘルシング

3
私たちは、使用して返される結果の配列を防ぐことができるコンマ演算子をA.splice(0, A.length),0;。これにより、戻り値は0そのままにA.length = 0;なります。結果の配列は、まだ作成されなければならない遅く実行するスクリプトを引き起こす:(jsperf〜56%遅いです)。ブラウザの実装はこれに影響しますがsplice、設定よりも速い理由はわかりませんlength
エヴァンケネディ

8
私はまた、A.splice(0)うまくいくことも発見しました。
corwin.amber 2014

97

現在2739票以上の回答は誤解を招くものであり、正しくありません。

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

  1. A = []答えはそれだ」と言うのは無知でまったく間違いです。[] == []falseです。

    これは、これら2つの配列が2つの個別の個別のオブジェクトであり、独自の2つのIDを持ち、デジタルの世界で独自の空間を占有しているためです。


母親がゴミ箱を空にするように頼んだとしましょう。

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

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

A.length = 0;

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


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

    while(A.length > 0) {
        A.pop();
    }
  2. また、左手をゴミ箱の底に置き、右手を上にして持ち、次のようにコンテンツを引き出すことができます。

    A.splice(0, A.length);

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

A.length = 0;

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


11
提案された解決策の唯一の問題は、ゴミがまだ存在していることです。ゴミがないと言って掲示板を変更しただけです。古い配列への参照はまだ存在しているはずです。.length = 0を設定するときにガベージコレクターが配列とそのプロパティへのすべての参照も削除することを確認できますか?私はそれはそうだと思いますが、私にとってそれは魔法です。控えめに言っても混乱を避けるために.clear()メソッドが望ましい。
mmm

8
私はこの解決策が間違っているとは言いませんでした。問題は、このスレッド全体が完全に不要であることです。3000票を超える投票は、最善の方法を理解しようとすることは、EMCAクラックヘッド開発者がそのような方法を追加するのに十分有効なケースになるはずであることを示しています。だれもそれを理解する必要はありません。それを行うには3つ-4つの異なる方法があります。一部のベンチマークでは、長さのソリューションが他のソリューションよりもはるかに遅くなっています。さらに、合理的な開発者にとって、.length = 0を設定するという考えは満足できるものではありません。
mmm

2
それが何をすべきかを達成するために、すべての参照を削除する必要があります。.length = 0はメソッド呼び出しでさえないので、0に設定されているときに他のアクションが行われる場合(ほとんどのブラウザーではdefine setterを介して行われます)、実際にはそれが想定されていることを実際に信頼するにはあまりにも魔法であると考えますする。
mmm

7
したがって、私はそれを自分でクリアしたいと思います。明確なメソッドをプロトタイプ化することはできますが、それは見苦しいだけです。私のポイントは、1万人以上の開発者がこのスレッドだけを読むのに何時間も費やす必要がなく、ベンチマークにもっと時間を費やした他のすべての人を考慮せずに、この実装がすでに存在しているはずだということです。
mmm

1
配列を空にして新しい受信データで埋め、再度破棄する方法は1つだけです。他のすべてはそうでないか、途方もなく非効率的で、許されないほどCPUが空腹です。唯一の実用的な代替手段は、A(n) = A.splice( 0, A.length );以前のコンテンツをバックアップする必要がある場合です。ps Array.lengthは、その基本的な事実を見逃した場合の読み取り/書き込みプロパティ\メソッドです。つまり、新しい長さに拡張したり、好きな長さにトリミングしたりできません。また、長さを0に短くすることで、すべてのメンバーを破棄できます。これは、配列のスイスナイフです。
Bekim Bacaj

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

9
パーセンテージの変更を追加すると、プラットフォームに注意することなく、多くの用途がなくなります。私のマシンでは、ポップはChrome 34では非常にわずかに高速ですが、実際には最新のFirefoxの[]よりも低速です。
Matt Styles

2
Windows NT 6.3 64ビット上のFirefox 39.0 32ビットでのテストでは、a = []が最速です!
Reza-S4

5
Chromeでのこのテスト結果には間違いなく怪しいものがあります。飛び出るループを他の3つのソリューションよりもはるかに速くできるのはなぜですか?
chqrlie 2016年

9
@chqrlieそうではありません。これが最も遅い方法です。ベンチマークテストに欠陥があります。
Philippe Leybaert、2016年

15
この回答は誤りであり、偽の証拠として無意味な欠陥のあるテストにリンクしているため、この回答を削除してください。
ジェームズウェイクフィールド2017年

35

これを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);
    };
}

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


1
@naomikそのようなことをすることが嫌われる理由を説明できますか?
未定義

17
ArrayやStringのようなJavaScriptプリミティブ関数を変更することは「嫌われます」。おそらく、既存の関数をオーバーロードしてオブジェクトクラスを破棄する可能性があります。clear()がすでにあり、別の方法で動作することを期待しているあいまいなJavaScriptエンジンがある可能性があります。注意深く踏むだけです。
Adrianによるデザイン2014年

配列のメンバーに対してforeachを実行すると、突然clearキーが含まれるようになるという問題はどうですか?
ErikE 2015


19

回答とコメントの両方で、while; pop / shiftパフォーマンスに関する多くの混乱と誤った情報があります。while / popソリューションは(予想どおり)最悪のパフォーマンスを示します。実際に起こっていることは、ループでスニペットを実行するサンプルごとに1回だけセットアップが実行されることです。例えば:

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配列をクリアする最も速い方法であることを示しています([]これは最速ですが実際には既存の配列をクリアしないため、考慮していません)。


とても良い点!元の回答を正しいベンチマーク結果で更新します。
Philippe Leybaert、2015

誰もそのベンチマークエラーを発見したとは思えません。50万回を超える視聴回数があるので、誰かがそれに気付くはずです。すばらしい作品Diadistis
Philippe Leybaert、2015

15

メモリの割り当てに関心がある場合は、このjsfiddleのようなものをChrome開発ツールのタイムラインタブと組み合わせて使用して、各アプローチを比較できます。アレイを「クリア」した後、下部のごみ箱アイコンを使用してガベージコレクションを強制することができます。これにより、選択したブラウザに対してより明確な答えが得られます。ここでの回答の多くは古く、私はそれらに依存するのではなく、上記の@tanguy_kの回答のようにテストします。

(前述のタブの紹介については、ここでチェックできます

Stackoverflowは私にjsfiddleをコピーすることを強制するので、ここにあります:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

オブジェクトの配列は言うまでもなく、JavaScriptは他のプリミティブ型とは異なる方法で文字列を管理するため、配列要素の型に依存する可能性があることに注意してください。タイプは、何が起こるかに影響を与える可能性があります。


15

これを行う関数を簡単に作成したり、長さを変更したり、再利用する関数としてネイティブ配列に追加したりすることもでき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(); //[]

arr.length = 0; //長さを変更する
Ajay Malhotra

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

そしてそれを呼び出す: array.clear();


77
ネイティブオブジェクトの変更を推奨しないでください。
ありがとう

21
なぜ人々は受け入れられた答えをつかんでそれをプロトタイプ関数に入れる傾向があるのですか?実際にプロジェクトでこれを行っていますか?すべてのプロジェクトに含めるプロトタイプ追加の巨大なライブラリはありますか?
nurettin 2013年

4
array.length = 0と入力しないのはなぜですか?
Adrianによるデザイン

10
@naomik 「ネイティブオブジェクトの変更を奨励しないでください。」-私はこれに完全に同意しますが、単に文章を繰り返すだけで傲慢になります。そのような解決策を提案している誰かが結果を認識していない可能性が高く、簡単な説明やリンクを提供する代わりにこの行をドロップすると、「私たち、あなたより賢い人は、これを行わないように指示します。私たちはよりよく知っているからです。
John Weisz


12

A.splice(0);

私が取り組んでいるいくつかのコードでこれを実行しました。アレイをクリアしました。


名前付き配列コンテナーを新しく作成された匿名コンテナーと交換しただけではありません。`var A = [1,2,3,4]; var B; B = A.splice(0); console.log(A); console.log(B); '
Bekim Bacaj

12

使用している場合

a = []; 

次に、aに新しい配列参照を割り当てます。aの参照がすでに他の変数に割り当てられている場合、その配列も空にならず、ガベージコレクターがそのメモリを収集しません。

例のために。

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

または

a.length = 0;

を指定するa.lengthと、配列の境界をリセットするだけで、残りの配列要素のメモリはガベージコレクターによって接続されます。

これらの2つのソリューションの代わりに優れています。

a.splice(0,a.length)

そして

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

kenshou.htmlによる以前の回答のとおり、2番目の方法の方が高速です。


10
の誤りは別としてa.length、この新しい答えがスレッドに追加するものはわかりませんか?
Bergi、2014

@Bergi配列に関する実際のメモリ表現に焦点を当てたい
Laxmikant Dange

a.length=0;実行時に新しいJSエンジンが新しいアレイを作成することを確認するためのソースはありますか?どのようにそれらのエンジンは、のために行動するだろうa.length=500;a.length=4;
joeytwiddle 2014

IE、Firefox、Chromeなどのほとんどのブラウザーで試してみましたが、新しい配列が作成されています。長さを0より大きい値に設定すると、未定義の要素を持つ配列が作成されます。つまり、一部のメモリ位置が保持されます。
Laxmikant Dange 2014

1
var a = [1]; var b = a; a.length = 0; console.log(b)prints Array [ ]なので、新しい配列を作成しているようには見えません。
John Montgomery

9

Janの最初の提案の修正版を使用します。

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}

12
なぜそんなことをしたいのですか?同じことをするためになぜ2つの変数とたくさんのコードを追加するのですか?
キラー

6

定数を使用する場合、選択肢はありません。

const numbers = [1, 2, 3]

再署名できません:

numbers = []

切り捨てることしかできません:

numbers.length = 0

5

ここに画像の説明を入力してください

配列の現在のメモリ位置を空にするには、以下を使用します:'myArray.length = 0'または'myArray.pop() UN-till its length is 0'

  • length:lengthプロパティを設定して、いつでも配列を切り捨てることができます。lengthプロパティを変更して配列を拡張すると、実際の要素の数が増加します。
  • pop() :popメソッドは配列から最後の要素を削除し、削除された値を返すを返します。
  • shift():shiftメソッドは、0番目のインデックスの要素を削除し、連続するインデックスの値を下にシフトして、削除された値を返します。

例:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] Array constructorまたはを使用して、新しいメモリ位置で配列を作成しますarray literal

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
  • slice() :スライス関数を使用して、元の配列から要素の浅いコピーを取得し、新しいメモリアドレスを指定します。これにより、cloneArrを変更しても実際の配列には影響しません。

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);

「長さ:配列の長さが指定されたサイズになるまでポップします。」誰があなたにこのナンセンスを言ったのですか?
Bekim Bacaj

@BekimBacaj本質的には、同じ効果があります。たぶん、それlength = ?だけではなく言ったほうがいいでしょうlength
Tuupertunut 2017年

@BekimBacaj私は私の答えを更新しました、私は長さが長さまでポップすると仮定しましたが、長さを切り捨てるか、配列のサイズを増やすだけに修正しました。
Yash、2017年

3

まだ誰もこれを提案していないことに驚いています:

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

これにより、他のソリューションとはかなり異なる状態のアレイが生成されます。ある意味で、配列は「空」になっています。

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

[,,,,]またはで同等の配列を作成できますArray(4)


7
これは、「配列内のすべての要素を未定義の要素に変換する方法」という別の質問への良い答えになる可能性があります。
ルーベン

内部的には未定義の要素と空のスロット(「穴」)の間には違いがあります
Cauterite

-9

Angular 2+ FormArrayを空にする必要がある場合は、以下を使用してください。

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}

10
これは無関係であり、JavaScriptでさえありません。
エミールベルジェロン2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.