Comment supprimer des éléments vides d'un tableau en JavaScript?
Existe-t-il un moyen simple ou dois-je le parcourir et les supprimer manuellement?
javascript
arrays
node.js
Tamas Czinege
la source
la source
var a = [,,]
etvar a = [undefined, undefined]
. Le premier est vraiment vide, mais le second a en fait deux clés, mais avec desundefined
valeurs.Réponses:
EDIT: Cette question a été répondue il y a près de neuf ans alors qu'il n'y avait pas beaucoup de méthodes intégrées utiles dans le
Array.prototype
.Maintenant, certainement, je vous recommanderais d'utiliser la
filter
méthode.Gardez à l'esprit que cette méthode vous renverra un nouveau tableau avec les éléments qui répondent aux critères de la fonction de rappel que vous lui fournissez.
Par exemple, si vous souhaitez supprimer des valeurs
null
ouundefined
:Cela dépendra de ce que vous considérez comme "vide" par exemple, si vous avez affaire à des chaînes, la fonction ci-dessus ne supprimera pas les éléments qui sont une chaîne vide.
Un modèle typique que je vois souvent utilisé est d'éliminer les éléments qui sont falsy , qui comprennent une chaîne vide
""
,0
,NaN
,null
,undefined
etfalse
.Vous pouvez passer à la
filter
méthode, à laBoolean
fonction constructeur ou renvoyer le même élément dans la fonction de critère de filtre, par exemple:Ou
Dans les deux cas, cela fonctionne parce que la
filter
méthode dans le premier cas, appelle leBoolean
constructeur en tant que fonction, convertissant la valeur et dans le second cas, lafilter
méthode transforme en interne la valeur de retour du rappel implicitement enBoolean
.Si vous travaillez avec des tableaux clairsemés et que vous essayez de vous débarrasser des "trous", vous pouvez utiliser la
filter
méthode en passant un rappel qui renvoie vrai, par exemple:Ancienne réponse: ne fais pas ça!
J'utilise cette méthode, étendant le prototype natif d'Array:
Ou vous pouvez simplement pousser les éléments existants dans un autre tableau:
la source
splice
appel est vraiment cher sur les anciens navigateurs car ils doivent renuméroter toutes les clés du tableau pour combler l'écart.Array.prototype
utilisantObject.defineProperty
pour faire de la nouvelle fonction une propriété non énumérable , puis éviter les performances affectées par l'insertion.hasOwnProperty
de chaque boucle.Des moyens simples:
ou - (uniquement pour les éléments de tableau simples de type "texte")
ou - Méthode classique: itération simple
via jQuery:
MISE À JOUR - juste un autre moyen rapide et cool (en utilisant ES6):
Supprimer les valeurs vides
la source
arr = arr.filter(function(n){return n; });
foo.join("").split("")
ne semble fonctionner que si les chaînes sont des caractères uniquesarr.filter(e=>e)
et cela peut être enchaîné par carte, réduire, etc.Si vous devez supprimer TOUTES les valeurs vides ("", null, non défini et 0):
Pour supprimer des valeurs vides et des sauts de ligne:
Exemple:
Revenir:
MISE À JOUR (basée sur le commentaire d'Alnitak)
Dans certaines situations, vous souhaiterez peut-être conserver "0" dans le tableau et supprimer tout le reste (null, non défini et ""), c'est une façon:
Revenir:
la source
function(e){return !!e}
!!e
cela inclura NaN (contrairement à 0) oùe
non (comme 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
supprime undefined, "" et 0Un seul revêtement:
ou en utilisant underscorejs.org :
la source
Boolean
fonctionne en fonction ...Boolean
comme une fonction, elle retournera simplementtrue
oufalse
si la valeur est vraiment / fausse.(true).constructor === Boolean
. Et puis dites-moi si nous pouvons le faire avec d'autres build-ins dans JS. ;)) (bien sûr exclu les 5 autres constructeurs intégrés. (String, Array, Object, Function, Number))Si vous avez Javascript 1.6 ou une version ultérieure, vous pouvez utiliser
Array.filter
unereturn true
fonction de rappel triviale , par exemple:car
.filter
saute automatiquement les éléments manquants dans le tableau d'origine.La page MDN liée ci-dessus contient également une belle version de vérification des erreurs
filter
qui peut être utilisée dans les interpréteurs JavaScript qui ne prennent pas en charge la version officielle.Notez que cela ne supprimera pas les
null
entrées ni les entrées avec uneundefined
valeur explicite , mais l'OP a spécifiquement demandé des entrées "manquantes".la source
undefined
pour valeur donnée.Pour retirer les trous, vous devez utiliser
Pour supprimer les valeurs de trou et de falsification (null, indéfini, 0, -0, NaN, "", false, document.all):
Pour supprimer le trou, nul et non défini:
la source
[, ,]
arr.filter(x => x)
, JS vérifiera si x est véridique ou faux, c'estif (x)
-à- dire que seule la valeur véridique sera affectée à la nouvelle liste.La manière propre de le faire.
la source
undefined
; cela supprime essentiellement toutes les valeurs de falsification.ES6 simple
la source
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Avec Underscore / Lodash:
Cas d'utilisation général:
Avec des vides:
Voir la documentation de lodash sans .
la source
ES6
Méthode des versions justes et plus récentes, supposons que le tableau est ci-dessous:Manière simple:
la source
Si l'utilisation d'une bibliothèque est une option, je sais que underscore.js a une fonction appelée compact () http://documentcloud.github.com/underscore/ il a également plusieurs autres fonctions utiles liées aux tableaux et aux collections.
Voici un extrait de leur documentation:
la source
@Alnitak
En fait, Array.filter fonctionne sur tous les navigateurs si vous ajoutez du code supplémentaire. Voir ci-dessous.
C'est le code que vous devez ajouter pour IE, mais le filtre et la programmation fonctionnelle valent la peine.
la source
Étant donné que personne d'autre ne l'a mentionné et que la plupart des gens ont souligné dans leur projet, vous pouvez également utiliser
_.without(array, *values);
.la source
ES6:
la source
Vous trouverez peut-être plus facile de boucler sur votre tableau et de créer un nouveau tableau à partir des éléments que vous souhaitez conserver du tableau qu'en essayant de boucler et d'épisser comme cela a été suggéré, depuis la modification de la longueur du tableau pendant qu'il est en boucle plus peut introduire des problèmes.
Vous pourriez faire quelque chose comme ça:
En fait, voici une solution plus générique:
Vous avez l'idée - vous pourriez alors avoir d'autres types de fonctions de filtre. Probablement plus que ce dont vous avez besoin, mais je me sentais généreux ...;)
la source
Qu'en est-il (ES6): pour supprimer la valeur Falsy d'un tableau.
la source
Vous devez utiliser le filtre pour obtenir un tableau sans éléments vides. Exemple sur ES6
la source
Je suis tout simplement ajouter ma voix au - dessus de « appel ES5 de
Array..filter()
avec un constructeur mondial » golf-hack, mais je suggère d' utiliser auObject
lieu deString
,Boolean
ouNumber
comme suggéré ci - dessus.Plus précisément, les ES5
filter()
ne se déclenchent pas déjà pour lesundefined
éléments du tableau; donc une fonction qui renvoie universellementtrue
, qui retourne tous les élémentsfilter()
hits, ne retournera nécessairement que des non-undefined
éléments:Cependant, l'écriture
...(function(){return true;})
est plus longue que l'écriture...(Object)
; et la valeur de retour duObject
constructeur sera, en toutes circonstances , une sorte d'objet. Contrairement aux constructeurs de boxe primitifs suggérés ci-dessus, aucune valeur d'objet possible n'est falsey, et donc dans un cadre booléen,Object
est un raccourci pourfunction(){return true}
.la source
someArray.filter(String);
est en fait équivalent àsomeArray.filter(function(x){ return String(x); });
. Si vous souhaitez supprimer toutes les valeurs de falsification, vous pouvezsomeArray.filter(Boolean);
supprimer 0, -0, NaN, false, '', null et indéfini.Object
constructeur par opposition à lareturn true
méthode. @robocat l'OP a demandé que les éléments vides soient supprimés, pas les valeurs nulles.Lors de l'utilisation de la réponse la plus votée ci-dessus, premier exemple, j'obtenais des caractères individuels pour des longueurs de chaîne supérieures à 1. Ci-dessous est ma solution à ce problème.
Au lieu de ne pas revenir si indéfini, nous retournons si la longueur est supérieure à 0. J'espère que cela aide quelqu'un là-bas.
Retour
la source
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Remplacer cette fonction. .. avec String, ironiquement, laisse des nombres mais donnerait le même résultat dans votre tableau donné.la source
Que dire de cela:
la source
join() === join(',')
:)Cela fonctionne, je l'ai testé dans AppJet (vous pouvez copier-coller le code sur son IDE et appuyer sur "recharger" pour le voir fonctionner, pas besoin de créer de compte)
la source
for ... in
qui provoque en fait le saut des éléments manquants. Le test deundefined
sert uniquement à supprimer les éléments réels qui sont explicitement définis sur cette valeur.Une autre façon de le faire est de tirer parti de la propriété length du tableau: empaquetez les éléments non nuls sur la «gauche» du tableau, puis réduisez la longueur. Il s'agit d'un algorithme sur place - n'alloue pas de mémoire, tant pis pour le garbage collector -, et il a un très bon comportement meilleur / moyen / pire cas.
Cette solution, par rapport aux autres ici, est entre 2 à 50 fois plus rapide sur Chrome, et 5 à 50 fois plus rapide sur Firefox, comme vous pouvez le voir ici: http://jsperf.com/remove-null-items-from-array
Le code ci-dessous ajoute la méthode «removeNull» non énumérable au tableau, qui renvoie «this» pour la connexion en guirlande:
la source
arr.filter(e => e)
.smart
- comme le verbe, pour provoquer une forte douleur cuisante. Cela est pertinent en raison de la douleur physique si j'arme mon téléphone en raison de votre commentaire.Retour
la source
'Utilisation abusive' de la boucle for ... in (objet-membre). => Seules les valeurs véridiques apparaissent dans le corps de la boucle.
la source
for ... in
est ce qui supprime les clés non définies du tableau, mais vous n'avez en fait aucun code ici pour accepter autrement uniquement les valeurs "véridiques"Cela pourrait vous aider: https://lodash.com/docs/4.17.4#remove
la source
Production:
Il supprimera l'élément vide du tableau et affichera un autre élément.
la source
Suppression de tous les éléments vides
Si un tableau contient des objets, des tableaux et des chaînes vides à côté d'autres éléments vides, nous pouvons les supprimer avec:
Compactage simple (suppression des éléments vides d'un tableau)
Avec ES6:
Avec Javascript simple ->
la source
Filtrer les entrées non valides avec une expression régulière
la source
La meilleure façon de supprimer les éléments vides est d'utiliser
Array.prototype.filter()
, comme déjà mentionné dans d'autres réponses.Malheureusement,
Array.prototype.filter()
n'est pas pris en charge par IE <9. Si vous devez toujours prendre en charge IE8 ou une version encore plus ancienne d'IE, vous pouvez utiliser le polyfill suivant pour ajouter la priseArray.prototype.filter()
en charge de ces navigateurs:la source