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 ?
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 ?
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]
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]
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]
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.
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,,,,]);
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]
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]
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.
@Koen Veuillez noter que !!e
inclura NaN (contrairement à 0) oùous e
ne serait pas (comme 0).
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]
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...
Si vous traitez Boolean
comme une fonction, il retournera simplement true
ou false
si la valeur est réelle/falsifiée.
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. ;)
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".
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;} ) ) ;
Oui, ça marche - mais tous les navigateurs ne disposent pas de JavaScript 1.6, donc ce n'est que ça.
+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 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.
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 = [,,]
yvar a = [undefined, undefined]
. La première est vraiment vide, mais la seconde a en fait deux clés, mais avecundefined
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 votrenull
proviennent du mappage d'un autre tableau avec la fonction map qui retournenull
pour certains éléments, essayez deArray.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.