1507 votes

Supprimer les éléments vides d'un tableau en Javascript

Comment supprimer les éléments vides d'un tableau en JavaScript ?

Existe-t-il un moyen simple, ou dois-je les parcourir en boucle et les supprimer manuellement ?

24 votes

Il serait utile que votre question précise exactement ce que vous entendez par "éléments vides", car la plupart des réponses ici l'interprètent incorrectement (IMHO) pour signifier des éléments "faux". NB : il y a une différence entre ce que vous obtenez pour var a = [,,] y var a = [undefined, undefined] . La première est vraiment vide, mais la seconde a en fait deux clés, mais avec undefined valeurs.

0 votes

Ce n'est pas tout à fait une réponse, mais je dirais que c'est une meilleure pratique d'essayer d'éviter null / undefined dans un tableau en premier lieu, autant que vous le pouvez. Par exemple, si votre null proviennent du mappage d'un autre tableau avec la fonction map qui retourne null pour certains éléments, essayez de Array.filter de ces éléments avant d'exécuter la carte. Rend votre code plus lisible et auto-documenté. Évidemment, cela ne fonctionne pas pour tous les cas d'utilisation, mais cela peut être appliqué à beaucoup d'entre eux.

1652voto

vsync Points 11280

Du pur javascript :

var arr = [1,2,,3,,3,null,,0,,undefined,4,,4,,5,,6,,,,];

arr = arr.filter(function(n){ return n != undefined }); // (JS 1.6 and above)

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]

ou - (uniquement pour les éléments de tableaux qui sont des nombres ou des chaînes de nombres)

arr = arr.filter(Number)

ou - (uniquement pour simple éléments du tableau de type "texte")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

ou - Méthode classique : itération simple

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]

via jQuery :

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return(n) });

arr // [1, 2, 3, 3, 4, 4, 5, 6]

MISE À JOUR - une autre façon rapide et cool (en utilisant ES6) :

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;
delete temp; // discard the variable

arr // [1, 2, 3, 3, 4, 4, 5, 6]

0 votes

Les autres réponses n'ont pas fonctionné pour moi parce que j'avais un tableau de tableaux. Mais ceci fonctionne très bien +1.

37 votes

Le premier support IE pour le filtre est le mode standard IE9.

18 votes

Pour du javascript pur, ce devrait être arr = arr.filter(function(n){return n; });

1431voto

CMS Points 315406

J'utilise cette méthode, en étendant le prototype natif de Array :

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("","One","Two","", "Three","","Four").clean("");

test2 = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
test2.clean(undefined);

Ou vous pouvez simplement pousser les éléments existants dans un autre tableau (l'exemple supprime toutes les valeurs "fausses") : undefined , null , 0 , false , NaN et '' ) :

function cleanArray(actual){
  var newArray = new Array();
  for(var i = 0; i<actual.length; i++){
      if (actual[i]){
        newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1,2,,3,,3,,,,,,4,,4,,5,,6,,,,]);

120 votes

AVERTISSEMENT : La deuxième option supprimera tous les éléments d'un tableau considéré comme "falsy", c'est-à-dire les valeurs false, 0, null & undefined. Ce tableau ne contiendrait plus rien du tout : [null,,,0,,0,0,0,0,false,null,0] même si je veux les éléments avec des valeurs de 0, comme dans ce tableau : [1,0,1,0,0,1]

0 votes

Oui la deuxième méthode, mais la première vous passez la valeur des éléments que vous voulez supprimer [null,,,0,,0,0,0,0,false,null,0].clean(null) == [0,0,0,0,0,false,0]

5 votes

Je m'en rends compte - c'est pourquoi je n'ai parlé que de la deuxième option. Quant à la première, elle a une portée si étroite que j'hésiterais à l'intégrer dans le prototype de l'Array. Voir la réponse d'Alnitak sur cette page pour quelque chose qui serait plus idéal. La vôtre permet cependant le chaînage, évidemment.

261voto

lepe Points 8959

Si vous devez supprimer TOUTES les valeurs vides ("", null, undefined et 0) :

arr = arr.filter(function(e){return e}); 

Exemple :

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Retour :

["hello", 1, 100, " "]

0 votes

Oui, c'est bien parce que ça enlève aussi les "".

3 votes

La fonction de test pourrait être un peu plus explicite : function(e){return !!e}

4 votes

@Koen Veuillez noter que !!e inclura NaN (contrairement à 0) oùous e ne serait pas (comme 0).

142voto

NULL Points 10442

Une seule ligne :

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

ou en utilisant underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

1 votes

C'est vraiment cool - J'ai une question de débutant cependant : il semble que vous utilisiez un nom de classe comme appel de fonction - est-ce que c'est du typecasting ? Je n'ai jamais vu cela auparavant et je ne suis pas sûr de comprendre pourquoi il faut passer. Boolean fonctionne comme une fonction...

9 votes

Si vous traitez Boolean comme une fonction, il retournera simplement true ou false si la valeur est réelle/falsifiée.

9 votes

Vous n'êtes pas traitement de booléen en tant que fonction ; il est une fonction. (Une fonction tout à fait normale, sauf qu'elle est implémentée de manière native.) Quelqu'un doit faire une petite recherche sur le modèle objet JavaScript. ;)

138voto

Alnitak Points 143355

Si vous avez Javascript 1.6 ou plus récent, vous pouvez utiliser Array.filter en utilisant une méthode triviale return true fonction de rappel, par exemple :

arr = arr.filter(function() { return true; });

depuis .filter ignore automatiquement les éléments manquants dans le tableau d'origine.

La page MDN dont le lien figure ci-dessus contient également une version de contrôle d'erreurs de l'application suivante filter qui peut être utilisé dans les interpréteurs JavaScript qui ne prennent pas en charge la version officielle.

Notez que cela ne supprimera pas null ni les entrées avec un undefined mais le PO a spécifiquement demandé des entrées "manquantes".

0 votes

Tu as raison ! Cela peut être aussi simple que ceci (et ça marche !): test3 = [1,2,,3,,3,,,,7,,,7,,,0,,,4,,4,,5,,6,,undefined,,null,,] ; printp( "Using array's native filtering : ", test3.filter( function(value){return (value==undefined) ? 0 : 1;} ) ) ;

0 votes

Oui, ça marche - mais tous les navigateurs ne disposent pas de JavaScript 1.6, donc ce n'est que ça.

3 votes

+1 Comme Alnitak l'a dit, ils ont le code qui peut être utilisé dans le cas de ne pas avoir js 1.6 disponible

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