Come posso svuotare un array in JavaScript?


2197

C'è un modo per svuotare un array e, se possibile, con .remove()?

Per esempio,

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

Come posso svuotarlo?


1
qui un punto di riferimento con diverse possibilità: jsben.ch/#/7QyI1
EscapeNetscape

Risposte:


4415

Modi per cancellare un array esistente A:

Metodo 1

(questa era la mia risposta originale alla domanda)

A = [];

Questo codice imposterà la variabile Asu un nuovo array vuoto. Questo è perfetto se non si hanno riferimenti all'array originaleA altrove perché in realtà crea un array nuovo (vuoto). Dovresti stare attento con questo metodo perché se hai fatto riferimento a questo array da un'altra variabile o proprietà, l'array originale rimarrà invariato. Utilizzalo solo se fai riferimento all'array solo con la sua variabile originale A.

Questa è anche la soluzione più veloce.

Questo esempio di codice mostra il problema che si può verificare durante l'utilizzo di questo metodo:

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']

Metodo 2 (come suggerito da Matthew Crumley )

A.length = 0

Questo cancellerà l'array esistente impostando la sua lunghezza su 0. Alcuni hanno sostenuto che questo potrebbe non funzionare in tutte le implementazioni di JavaScript, ma si scopre che non è così. Funziona anche quando si utilizza la "modalità rigorosa" in ECMAScript 5 perché la proprietà length di un array è una proprietà read / write.

Metodo 3 (come suggerito da Anthony )

A.splice(0,A.length)

L'uso .splice()funzionerà perfettamente, ma poiché la .splice()funzione restituirà un array con tutti gli elementi rimossi, restituirà effettivamente una copia dell'array originale. I benchmark suggeriscono che ciò non ha alcun effetto sulle prestazioni.

Metodo 4 (come suggerito da tanguy_k )

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

Questa soluzione non è molto concisa, ed è anche la soluzione più lenta, contrariamente ai benchmark precedenti a cui si fa riferimento nella risposta originale.

Prestazione

Di tutti i metodi per cancellare un array esistente , i metodi 2 e 3 sono molto simili nelle prestazioni e sono molto più veloci del metodo 4. Vedi questo benchmark .

Come sottolineato da Diadistis nella loro risposta di seguito, i parametri di riferimento originali utilizzati per determinare le prestazioni dei quattro metodi sopra descritti erano imperfetti. Il benchmark originale ha riutilizzato l'array eliminato, quindi la seconda iterazione stava eliminando un array che era già vuoto.

Il seguente benchmark corregge questo difetto: http://jsben.ch/#/hyj65 . Mostra chiaramente che i metodi # 2 (proprietà length) e # 3 (splice) sono i più veloci (senza contare il metodo # 1 che non cambia l'array originale).


Questo è stato un argomento caldo e causa di molte controversie. In realtà ci sono molte risposte corrette e poiché questa risposta è stata contrassegnata come risposta accettata per molto tempo, includerò qui tutti i metodi. Se voti per questa risposta, per favore vota anche le altre risposte a cui ho fatto riferimento.


184
while (A.length) { A.pop(); }, non c'è bisogno di> 0
Ivan Black

327
> 0è più leggibile IMHO. E non c'è differenza di prestazioni tra i due.
Philippe Leybaert,

10
@daghan, non è affatto chiaro cosa stai cercando di dire. bcontiene un riferimento al vecchio array anche dopo che ne aè stato assegnato uno nuovo. ce dcontinua a fare riferimento allo stesso array. Si prevede pertanto la differenza di risultati.
shovavnik,

9
Il metodo 1 # @DiegoJancic non conta perché non cancella l'array. Ne crea uno nuovo. Non dovrebbe essere incluso in un benchmark.
Philippe Leybaert,

44
Non è possibile utilizzare while(A.pop())nel caso in cui un elemento dell'array sia falso. Prendiamo ad esempio A = [2, 1, 0, -1, -2] si tradurrebbe in A uguale a [2, 1]. Anche while(A.pop() !== undefined)non funziona perché puoi avere un array con undefined come uno dei valori. Probabilmente perché il compilatore non lo ha ottimizzato.
Jonathan Gawrych,

2461

Se è necessario mantenere l'array originale perché ci sono altri riferimenti che dovrebbero essere aggiornati, è possibile cancellarlo senza creare un nuovo array impostando la lunghezza su zero:

A.length = 0;

18
cosa dice questo ECMAScript 5 Standard?
Pacerier,

213
@Pacerier: funziona ancora in ES5. Dalla sezione 15.4: "... ogni volta che la proprietà length viene cambiata, ogni proprietà il cui nome è un indice di array il cui valore non è inferiore alla nuova lunghezza viene automaticamente eliminata"
Matthew Crumley,

2
@einar: gli array JavaScript si espandono sempre per adattarsi a qualsiasi cosa tu li inserisca, quindi quando lo chiami myarray.push(whatever)ne aggiunge uno alla lunghezza. Quindi l'impostazione della lunghezza tronca l'array, ma non è permanente.
Matthew Crumley,

12
@LosManos Anche in modalità rigorosa, lengthè una proprietà speciale, ma non di sola lettura, quindi funzionerà comunque.
Matthew Crumley,

11
@MattewCrumley Ho fatto alcuni test e sembra che a.length = 0 non sia per cancellare in modo efficiente l'intero array. jsperf.com/length-equal-0-or-new-array Penso che se hai un riferimento (e non hai aggiunto proprietà extra che vuoi conservare), è meglio creare un nuovo array e lasciare vecchio a il Garbage Collector, che verrà eseguito quando appropriato.
Paul Brewczynski,

289

Qui l'implementazione più veloce di lavoro pur mantenendo lo stesso array ( "mutabile"):

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

Cordiali saluti non può essere semplificato while (array.pop()): i test falliranno.

FYI Map e Set definiscono clear(), sarebbe logico avere anche clear()per Array .

Versione TypeScript:

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

I test corrispondenti:

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);
  });
});

Qui il jsPerf aggiornato: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


5
TT la tua risposta è l'unica che corregge e digiuna (allo stesso tempo) ma ha alcuni "voti" molto meno. Bene, sembra che alla gente piacciano le soluzioni carine che sono lente: /
obenjiro,

@naomik Ma questa è una delle funzionalità di base, che avrebbe dovuto essere lì per impostazione predefinita.
thefourtheye

7
@thefourtheye Buona soluzione per le prestazioni, anche se sono d'accordo con @naomik, non dovresti modificare oggetti nativi. Dire che dovrebbe essere lì è accanto al punto, il problema è che stai modificando i globali , il che è male. Se stai fornendo il tuo codice per essere utilizzato da altri, non dovrebbe avere effetti collaterali imprevisti. Immaginate se un'altra libreria anche modificato la Array.prototypee che stava facendo qualcosa di leggermente diverso, allora tutto in tutto il codice [].clear()era leggermente sbagliata. Non sarebbe divertente eseguire il debug. Quindi, il messaggio generale è: non modificare i globali.
jpillora,

3
@thefourtheye Il punto centrale di non modificare l'ambito globale è perché non saprai se il codice di qualcun altro sta già (o sarà) usando il nome. Suggerisco una funzione nell'ambito locale. Quindi, all'interno di IIFE dell'applicazione / libreria , eseguire function clear(arr) { while(arr.length) arr.pop(); }, quindi cancellare gli array con clear(arr)invece di arr.clear().
jpillora,

2
Si scopre che questo metodo è molto più lento di .splice()e .length=0. I parametri di riferimento non erano corretti. Vedi la mia risposta aggiornata.
Philippe Leybaert,

216

Una soluzione più cross-browser e più ottimale sarà quella di utilizzare il splicemetodo per svuotare il contenuto dell'array A come di seguito:

A.splice(0, A.length);


49
Perché è più amichevole tra browser? Quali browser hanno problemi con A.length?
Stricjux,

4
@ jm2 quello che stai dicendo non è del tutto vero. In realtà modifica l'array in questione e successivamente tutti i riferimenti vengono interessati. Vedi il test sul mio jsFiddle: jsfiddle.net/shamasis/dG4PH
Shamasis Bhattacharya,

3
@alex no, non splicemodifica l'array e restituisce le voci eliminate. Leggi prima i documenti: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
David Hellsing,

3
Potremmo evitare la matrice risultante venga restituito utilizzando l' operatore virgola : A.splice(0, A.length),0;. Ciò lascerebbe un valore di ritorno 0proprio come A.length = 0;farebbe. L'array risultante viene comunque creato e dovrebbe rallentare l'esecuzione dello script: ( jsperf ~ 56% più lento). L'implementazione del browser influirà su questo, anche se non vedo alcun motivo per cui splicesarebbe più veloce dell'impostazione length.
Evan Kennedy,

8
Ho anche scoperto che A.splice(0)funziona anche.
corwin.amber,

97

Le risposte che non hanno ora meno di 2739 voti sono fuorvianti e errate.

La domanda è: "Come svuoti l'array esistente?" Ad esempio per A = [1,2,3,4].

  1. Dire " A = []è la risposta" è ignorante e assolutamente errato. [] == []è falso .

    Questo perché questi due array sono due oggetti separati, individuali, con le loro due identità, che occupano il loro spazio nel mondo digitale, ognuno per conto proprio.


Diciamo che tua madre ti chiede di svuotare il cestino.

  • Non ne porti uno nuovo come se avessi fatto ciò che ti era stato chiesto.
  • Invece, svuoti il ​​cestino.
  • Non si sostituisce quello riempito con una nuova lattina vuota e non si prende l'etichetta "A" dalla lattina riempita e si attacca a quella nuova come in A = [1,2,3,4]; A = [];

Svuotare un oggetto array è la cosa più semplice di sempre:

A.length = 0;

In questo modo, la lattina sotto "A" non è solo vuota, ma anche pulita come nuova!


  1. Inoltre, non è necessario rimuovere manualmente la spazzatura finché la lattina non è vuota! Ti è stato chiesto di svuotare quello esistente, completamente, in un turno, per non raccogliere la spazzatura fino a quando la lattina non si svuota, come in:

    while(A.length > 0) {
        A.pop();
    }
  2. Né, per mettere la mano sinistra nella parte inferiore della spazzatura, tenendola con la destra in alto per poter estrarre il suo contenuto come in:

    A.splice(0, A.length);

No, ti è stato chiesto di svuotarlo:

A.length = 0;

Questo è l'unico codice che svuota correttamente il contenuto di un determinato array JavaScript.


11
L'unico problema con la soluzione suggerita è che il cestino esiste ancora, è solo che hai cambiato la bacheca dicendo che non c'è cestino. Un riferimento al vecchio array dovrebbe ancora esistere. Puoi essere sicuro che Garbage Collector impostando .length = 0 rimuoverà anche tutti i riferimenti all'array e alle sue proprietà? Penso che lo faccia, ma per me è una magia. Un metodo .clear () è desiderabile per evitare confusione per non dire altro.
mmm

8
Non ho mai dichiarato che questa soluzione sia sbagliata. Il problema è che l'intero thread non è assolutamente necessario. Oltre 3000 voti mostrano che cercare di capire quale sia il modo migliore dovrebbe renderlo un valido caso sufficiente per gli sviluppatori di crack head EMCA di aggiungere un tale metodo. Nessuno dovrebbe dover capire. Esistono tre o quattro modi diversi per farlo. In alcuni benchmark, le soluzioni di lunghezza sono molto più lente di altre. Inoltre, l'idea di impostare .length = 0, per qualsiasi sviluppatore ragionevole non sarebbe soddisfacente.
mmm

2
Perché per ottenere ciò che dovrebbe, tutti i riferimenti devono essere rimossi. .length = 0 non è nemmeno una chiamata di metodo, quindi se ci sono altre azioni intraprese quando è impostato su 0 (che è presente nella maggior parte dei browser attraverso la definizione di setter) lo considererei ancora troppo magico per fidarsi effettivamente di ciò che supponeva fare.
mmm

7
Pertanto, preferirei cancellarlo da solo. Un metodo chiaro può essere prototipato ma è semplicemente brutto. Il mio punto è che questa implementazione dovrebbe già essere presente in modo che oltre 10.000 sviluppatori non debbano passare ore a leggere solo questo thread, senza considerare tutti gli altri che hanno dedicato più tempo al benchmarking.
mmm

1
c'è solo un modo per svuotare l'array riempirlo con nuovi dati in entrata e scartarlo di nuovo. Tutti gli altri non lo sono o sono ridicolmente inefficienti e imperdonabilmente affamati di CPU. L'unica alternativa pratica è il A(n) = A.splice( 0, A.length );caso in cui sia necessario eseguire il backup dei contenuti precedenti. ps Array.lengthè una proprietà / metodo read-write nel caso in cui tu abbia perso quel fatto di base. Significa che puoi espanderlo a una nuova lunghezza, non puoi tagliarlo a qualsiasi lunghezza tu voglia, e tra l'altro puoi scartare tutti i membri accorciandone la lunghezza a 0. È un coltello svizzero dell'array.
Bekim Bacaj,

63

Test della prestazione:

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
L'aggiunta delle variazioni percentuali non è molto utile senza notare anche la tua piattaforma. Sulla mia macchina il pop è solo leggermente più veloce in Chrome 34 ma in realtà più lento di [] nell'ultimo Firefox.
Matt Styles,

2
Test in Firefox 39.0 a 32 bit su Windows NT 6.3 a 64 bit, a = [] è il più veloce!
Reza-S4,

5
C'è sicuramente qualcosa di sospetto in questo risultato del test su Chrome. Come diavolo può il loop scoppiettante essere molto più veloce delle altre 3 soluzioni?
Chqrlie,

9
@chqrlie Non lo è. È il metodo più lento. Il test di riferimento è difettoso.
Philippe Leybaert,

15
Elimina questa risposta perché è errata e collega a un test imperfetto privo di significato come prova falsa.
James Wakefield,

35

Puoi aggiungerlo al tuo file JavaScript per consentire la "cancellazione" delle matrici:

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

Quindi puoi usarlo in questo modo:

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

O se vuoi essere sicuro di non distruggere qualcosa:

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

Molte persone pensano che non dovresti modificare oggetti nativi (come Array), e sono propenso a concordare. Si prega di usare cautela nel decidere come gestirlo.


1
@naomik Puoi spiegare il tuo ragionamento sul perché fare una cosa del genere è disapprovato?
Non definito

17
È "malvisto" per modificare le funzioni primitive javascript come Array e String. È possibile che si verifichi il sovraccarico di una funzione già esistente e il cestino della classe di oggetti. Potrebbe esserci un oscuro motore JavaScript che ha già clear () e si aspetta che si comporti in modo diverso. Il passo con attenzione è tutto ciò che dico.
Design di Adrian,

Che ne dici del problema in cui improvvisare una foreach sui membri di un array inizierà improvvisamente a includere una clearchiave?
ErikE


19

C'è un sacco di confusione e disinformazione riguardo al tempo; prestazioni pop / shift sia nelle risposte che nei commenti. La soluzione while / pop ha (come previsto) le prestazioni peggiori . Quello che sta realmente accadendo è che l'installazione viene eseguita una sola volta per ogni campione che esegue lo snippet in un ciclo. per esempio:

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
    }
}

Ho creato un nuovo test che funziona correttamente:

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

Avvertenza: anche in questa versione del test non è possibile vedere la vera differenza perché la clonazione dell'array impiega la maggior parte del tempo di test. Indica ancora che spliceè il modo più veloce per cancellare l'array (non tenendo []in considerazione perché mentre è il più veloce non sta effettivamente cancellando l'array esistente).


Ottimo punto! Aggiornerò la risposta originale con i risultati di benchmark corretti.
Philippe Leybaert,

Non posso credere che nessuno abbia notato quell'errore di riferimento. Con oltre mezzo milione di visualizzazioni, ti aspetteresti che qualcuno se ne accorga. Grande lavoro Diadistis
Philippe Leybaert,

15

Se sei interessato all'allocazione della memoria, puoi confrontare ogni approccio usando qualcosa come questo jsfiddle in congiunzione con la scheda della timeline degli strumenti di sviluppo di Chrome. Si consiglia di utilizzare l'icona del cestino in basso per forzare una raccolta di rifiuti dopo aver 'cancellato' l'array. Questo dovrebbe darti una risposta più definita per il browser che preferisci. Molte risposte qui sono vecchie e non mi affiderei a loro, ma piuttosto testerei come nella risposta di @ tanguy_k sopra.

(per un'introduzione alla scheda di cui sopra è possibile controllare qui )

Stackoverflow mi costringe a copiare il jsfiddle quindi eccolo qui:

<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>

E dovresti notare che potrebbe dipendere dal tipo di elementi dell'array, poiché javascript gestisce le stringhe in modo diverso rispetto ad altri tipi primitivi, per non parlare delle matrici di oggetti. Il tipo può influire su ciò che accade.


15

Puoi facilmente creare una funzione per farlo, cambiare la lunghezza o persino aggiungerla all'array nativo come remove()funzione per il riutilizzo.

Immagina di avere questo array:

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

OK, esegui semplicemente questo:

arr.length = 0; //change the length

e il risultato è:

[] //result

modo semplice per svuotare un array ...

Usando anche il loop che non è necessario ma solo un altro modo per farlo:

/* 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(); 
  }
}

Ci sono anche modi difficili a cui puoi pensare, ad esempio qualcosa del genere:

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

Quindi, se arr ha 5 oggetti, ne separerà 5 da 0, il che significa che nulla rimarrà nell'array.

Anche altri modi come semplicemente riassegnare l'array per esempio:

arr = []; //[]

Se si osservano le funzioni dell'array, esistono molti altri modi per farlo, ma quello più consigliato potrebbe essere la modifica della lunghezza.

Come ho detto in primo luogo, puoi anche prototipare remove () in quanto è la risposta alla tua domanda. puoi semplicemente scegliere uno dei metodi sopra e prototiparlo sull'oggetto Array in JavaScript, qualcosa del tipo:

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

e puoi semplicemente chiamarlo così per svuotare qualsiasi array nella tua applicazione javascript:

arr.remove(); //[]

lunghezza arr = 0; // cambia la lunghezza
Ajay Malhotra il

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

E chiamalo: array.clear();


77
Si prega di non incoraggiare la modifica degli oggetti nativi.
Grazie

21
perché le persone hanno questa tendenza ad afferrare la risposta accettata e metterla in una funzione prototipo? Lo fai davvero nei tuoi progetti? Hai una vasta libreria di aggiunte di prototipi che includi in ogni progetto?
Nurettin,

4
Perché non solo digitare array.length = 0?
Design di Adrian,

10
@naomik "Per favore, non incoraggiare la modifica degli oggetti nativi." - Sono completamente d'accordo con questo, ma solo ripetere la frase da sola risulta arrogante. Qualcuno che propone una soluzione del genere probabilmente non è a conoscenza delle conseguenze e lasciar cadere questa linea su di esse invece di fornire una breve spiegazione o un collegamento non trasmette un significato diverso da "noi, le persone più intelligenti di te, ti diciamo di non farlo, perché conosciamo meglio " .
John Weisz,


12

A.splice(0);

Ho appena fatto questo su un codice su cui sto lavorando. Ha cancellato l'array.


No, hai appena scambiato un contenitore array denominato con uno anonimo appena creato. `var A = [1,2,3,4]; var B; B = A.splice (0); console.log (A); console.log (B); '
Bekim Bacaj,

12

Se stai usando

a = []; 

Quindi stai assegnando un nuovo riferimento di array a a, se il riferimento in a è già assegnato a qualsiasi altra variabile, allora non svuoterà anche quell'array e quindi Garbage Collector non raccoglierà quella memoria.

Per es.

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

o

a.length = 0;

Quando specifichiamo a.length, stiamo solo ripristinando i limiti dell'array e la memoria per gli elementi dell'array restanti sarà connessa da Garbage Collector.

Invece di queste due soluzioni sono migliori.

a.splice(0,a.length)

e

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

Secondo la precedente risposta di kenshou.html, il secondo metodo è più veloce.


10
Oltre a sbagliarmi a.length, non vedo cosa aggiunge questa nuova risposta al thread?
Bergi,

@Bergi Voglio solo concentrarmi sull'effettiva rappresentazione della memoria sull'array
Laxmikant Dange

Hai qualche fonte per confermare quali motori JS creeranno un nuovo array quando a.length=0;viene eseguito? Come funzionerebbero quei motori a.length=500;e a.length=4;?
joeytwiddle,

L'ho provato sulla maggior parte dei browser, come IE, Firefox, Chrome, sta creando un nuovo array. Se si imposta una lunghezza maggiore di 0, verrà creato un array con elementi non definiti, ovvero conterrà solo alcune posizioni di memoria.
Laxmikant Dange,

1
var a = [1]; var b = a; a.length = 0; console.log(b)stampa Array [ ], quindi non sembra che stia creando un nuovo array per me.
John Montgomery,

9

Usa una versione modificata del suggerimento iniziale di Jan :

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

12
Perché vorresti fare una cosa del genere? Perché aggiungere altre due variabili e un mucchio di codice per fare la stessa cosa?
Killah,

6

Se usi le costanti, non hai scelta:

const numbers = [1, 2, 3]

Non puoi riassegnare:

numbers = []

Puoi solo troncare:

numbers.length = 0

5

inserisci qui la descrizione dell'immagine

Per svuotare una posizione di memoria corrente di un array usare: 'myArray.length = 0'o'myArray.pop() UN-till its length is 0'

  • length: È possibile impostare la proprietà length per troncare un array in qualsiasi momento. Quando si estende un array modificandone la proprietà length, aumenta il numero di elementi effettivi.
  • pop() : Il metodo pop rimuove l' ultimo elemento da un array e restituisce il valore restituito.
  • shift(): Il metodo shift rimuove l'elemento sull'indice zero e sposta i valori su indici consecutivi verso il basso, quindi restituisce il valore rimosso.

Esempio:

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() | [] Creare un array con una nuova posizione di memoria utilizzando Array constructoro 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() : Usando la funzione slice otteniamo una copia superficiale degli elementi dall'array originale, con un nuovo indirizzo di memoria, in modo che qualsiasi modifica su cloneArr non influisca su un array | originale originale.

    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);

"lunghezza: si apre fino a quando la lunghezza di un array è di dimensione specificata." Chi ti ha detto questa assurdità?
Bekim Bacaj,

@BekimBacaj In sostanza, fa lo stesso effetto. Probabilmente avrebbe dovuto dirlo length = ?invece di solo length.
Tuupertunut,

@BekimBacaj ho aggiornato la mia risposta, ho solo ipotizzato che la lunghezza si apra alla lunghezza, ma ho corretto ora che la lunghezza tronca o aumenta la dimensione di un array.
Yash,

3

Sono sorpreso che nessuno l'abbia ancora suggerito:

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

Questo produce un array in uno stato abbastanza diverso dalle altre soluzioni. In un certo senso, l'array è stato "svuotato":

xs
=> Array [ <4 empty slots> ]

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

xs.length
=> 4

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

È possibile produrre un array equivalente con [,,,,]oArray(4)


7
Potrebbe essere una buona risposta a una domanda diversa: "Come convertire tutti gli elementi di un array in elementi non definiti".
Ruben,

Sebbene internamente vi sia una differenza tra elementi indefiniti e slot vuoti ("buchi")
Cauterite,

-9

Utilizzare di seguito se è necessario svuotare Angular 2+ FormArray.

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

10
Questo è irrilevante e nemmeno JavaScript.
Emile Bergeron,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.