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 ?
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 ?
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.
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) ;
@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".
@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.
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
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 :/
@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.
Pourquoi cela est-il plus convivial pour les navigateurs ? Quels navigateurs ont des problèmes avec A.length ?
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.
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".
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
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.
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 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.
1 votes
Ici un repère avec différentes possibilités : jsben.ch/#/7QyI1