2196 votes

Comment vider un tableau en JavaScript ?

Existe-t-il un moyen de vider un tableau et, si oui, éventuellement avec .remove() ?

Par exemple,

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

Comment puis-je le vider ?

1 votes

Ici un repère avec différentes possibilités : jsben.ch/#/7QyI1

4973voto

Philippe Leybaert Points 62715

Façons d'effacer un tableau existant A :

Méthode 1

(c'était ma réponse initiale à la question)

A = [];

Ce code va définir la variable A vers un nouveau tableau vide. C'est parfait si vous n'avez pas références au tableau original A n'importe où ailleurs, car cela crée en fait un tout nouveau tableau (vide). Vous devez faire attention avec cette méthode car si vous avez référencé ce tableau à partir d'une autre variable ou propriété, le tableau d'origine restera inchangé. N'utilisez cette méthode que si vous ne référencez le tableau que par sa variable d'origine. A .

C'est aussi la solution la plus rapide.

Cet exemple de code montre le problème que vous pouvez rencontrer en utilisant cette méthode :

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

Méthode 2 (comme Proposition de par Matthew Crumley )

A.length = 0

Cela effacera le tableau existant en fixant sa longueur à 0. Certains ont fait valoir que cela ne fonctionne pas dans toutes les implémentations de JavaScript, mais il s'avère que ce n'est pas le cas. Elle fonctionne également en "mode strict" dans ECMAScript 5 car la propriété de longueur d'un tableau est une propriété de lecture/écriture.

Méthode 3 (comme Proposition de par Anthony )

A.splice(0,A.length)

Utilisation de .splice() fonctionnera parfaitement, mais comme l .splice() retournera un tableau avec tous les éléments supprimés, elle retournera en fait une copie du tableau original. Les tests de référence suggèrent que cela n'a aucun effet sur les performances.

Méthode 4 (comme Proposition de par tanguy_k )

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

Cette solution n'est pas très succincte, et c'est aussi la solution la plus lente, contrairement aux benchmarks précédents référencés dans la réponse originale.

Performance

De toutes les méthodes de nettoyage d'un dispositif existant Les méthodes 2 et 3 sont très similaires en termes de performances et sont beaucoup plus rapides que la méthode 4. Voir cette repère .

Comme l'a souligné Diadistis dans leur réponse ci-dessous, les repères originaux qui ont été utilisés pour déterminer les performances des quatre méthodes décrites ci-dessus étaient défectueux. Le benchmark original réutilisait le tableau effacé, de sorte que la deuxième itération effaçait un tableau déjà vide.

Le benchmark suivant corrige cette faille : http://jsben.ch/#/hyj65 . Il montre clairement que les méthodes #2 (propriété de longueur) et #3 (splice) sont les plus rapides (sans compter la méthode #1 qui ne modifie pas le tableau original).


Cette question a été un sujet brûlant et a suscité de nombreuses controverses. Il existe en fait de nombreuses réponses correctes et comme cette réponse a été marquée comme la réponse acceptée depuis très longtemps, je vais inclure toutes les méthodes ici. Si vous votez pour cette réponse, merci d'upvoter également les autres réponses que j'ai référencées.

213 votes

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

383 votes

> 0 est plus lisible IMHO. Et il n'y a pas de différence de performance entre les deux.

2 votes

Var a = [1,2,3] ; var b = a ; a = [] ; console.log(b.length) ; var c = [1,2,3] ; var d = c ; while(c.length){ c.pop() ; } console.log(d.length) ;

2571voto

Matthew Crumley Points 47284

Si vous devez conserver le tableau original parce que vous avez d'autres références à celui-ci qui doivent être mises à jour également, vous pouvez l'effacer sans créer un nouveau tableau en fixant sa longueur à zéro :

A.length = 0;

22 votes

Que dit la norme ECMAScript 5 à ce sujet ?

233 votes

@Pacerier : Cela fonctionne toujours dans ES5. Extrait de la section 15.4 : "...chaque fois que la propriété longueur est modifiée, chaque propriété dont le nom est un indice de tableau dont la valeur n'est pas inférieure à la nouvelle longueur est automatiquement supprimée".

2 votes

@einar : Les tableaux JavaScript s'étendent toujours pour s'adapter à ce que vous y mettez, donc quand vous appelez myarray.push(whatever) il ajoute un à la longueur. Ainsi, définir la longueur tronque le tableau, mais ce n'est pas permanent.

312voto

tanguy_k Points 1475

Voici la mise en œuvre la plus rapide tandis que en gardant le même tableau ("mutable") :

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

Pour info, il ne peut pas être simplifié en while (array.pop()) : les tests échoueront.

FYI Carte et Définir définir clear() il aurait été logique d'avoir clear() pour Array aussi.

Version TypeScript :

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

Les tests correspondants :

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

Voici la mise à jour de jsPerf : http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152

jsPerf hors ligne. Repère similaire : https://jsben.ch/hyj65

5 votes

TT votre réponse est la seule qui soit correcte et rapide (en même temps) mais qui a beaucoup moins de "upvotes". Eh bien, il semble que les gens aiment les belles solutions qui sont lentes :/

0 votes

@naomik Mais c'est une des fonctionnalités de base, qui aurait dû être là par défaut.

7 votes

@thefourtheye Bonne solution pour les performances, bien que je sois d'accord avec @naomik, vous ne devriez pas modifier les objets natifs. Dire qu'il devrait être là n'est pas le sujet, le problème est que vous modifiez globaux ce qui est mauvais. Si vous fournissez votre code pour que d'autres l'utilisent, il ne doit pas avoir d'effets secondaires imprévus. Imaginez qu'une autre bibliothèque également modifié le Array.prototype et qu'il faisait quelque chose de légèrement différent, alors tout au long de votre code [].clear() était légèrement erronée. Ce ne serait pas drôle à déboguer. Donc, le message général est : Ne modifiez pas les globaux.

237voto

Anthony Points 527

Une solution plus optimale et plus adaptée aux navigateurs croisés consistera à utiliser la balise splice pour vider le contenu du tableau A comme ci-dessous :

A.splice(0, A.length);

54 votes

Pourquoi cela est-il plus convivial pour les navigateurs ? Quels navigateurs ont des problèmes avec A.length ?

0 votes

Comme l'a dit @alex, splice renvoie un nouveau tableau. Ce n'est pas quelque chose que vous voudriez faire dans un REPL . Vous pouvez toujours void l'expression mais ce n'est pas une solution élégante.

2 votes

C'est la réponse la plus correcte puisque cela "efface le contenu du tableau et conserve la référence à l'objet tableau original".

65voto

kenshou.html Points 71

Test de performance :

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 votes

Il n'est pas très utile d'ajouter les pourcentages de changement si vous n'indiquez pas également votre plate-forme. Sur ma machine, la pop n'est que très légèrement plus rapide dans Chrome 34, mais plus lente que [] dans le dernier Firefox.

2 votes

Testé dans Firefox 39.0 32-bit sur Windows NT 6.3 64-bit, le a=[] est le plus rapide !

1 votes

Bien sûr, la création d'une nouvelle instance du tableau est plus rapide que de le boucler et de l'éclater... donc si l'éclatement est plus rapide en chrome, cela signifie que la création d'un nouveau tableau est un bug.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X