Supprimer les chaînes vides du tableau tout en conservant un enregistrement Sans boucle?

90

Cette question a été posée ici: Supprimer les chaînes vides du tableau tout en conservant un enregistrement des index avec des chaînes non vides

Si vous remarquez le donné comme @Baz l'a présenté;

"I", "am", "", "still", "here", "", "man"

"et à partir de là, je souhaite produire les deux tableaux suivants:"

"I", "am", "still", "here", "man"

Toutes les réponses à cette question faisaient référence à une forme de bouclage.

Ma question: y a-t-il une possibilité de supprimer tous les indexes avec empty string sans aucune boucle? ... y a-t-il une autre alternative que l'itération du tableau?

Peut-être certains regexou certains jQuerydont nous ne sommes pas au courant?

Toutes les réponses ou suggestions sont très appréciées.

Prise universelle
la source

Réponses:

323
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter Documentation


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

Documentation des fonctions de la flèche

Isaac
la source
3
Je sais exactement ce que vous ressentez, je l'ai utilisé il y a des mois, corrige tellement de petits problèmes
Isaac
14
Les gens @DiegoPlentz qui utilisent toujours IE8 vont avoir beaucoup plus de problèmes que de simplement supprimer les espaces vides dans un tableau ... Je n'envisage presque jamais de supporter ce navigateur ces jours-ci
Isaac
C'est le plus proche de ce array.filter(!!)que nous pouvons actuellement obtenir :)
james_womack
2
Tout le crédit pour cette réponse doit aller à stackoverflow.com/questions/16701319/…
Isaac
Une explication Booleanserait bien.
robsch
18
var newArray = oldArray.filter(function(v){return v!==''});
haithamahmed
la source
Facilement la meilleure réponse. Fait exactement ce que la question demande. Ne supprime pas les valeurs nulles.
Bryan
9

VEUILLEZ NOTER: La documentation dit:

filterest une extension JavaScript de la norme ECMA-262; en tant que tel, il peut ne pas être présent dans d'autres implémentations de la norme . Vous pouvez contourner ce problème en insérant le code suivant au début de vos scripts, permettant l'utilisation du filtre dans les implémentations ECMA-262 qui ne le prennent pas en charge de manière native. Cet algorithme est exactement celui spécifié dans ECMA-262, 5e édition, en supposant que fn.call est évalué à la valeur d'origine de Function.prototype.call, et que Array.prototype.push a sa valeur d'origine.

Donc, pour éviter un chagrin d'amour, vous devrez peut-être ajouter ce code à votre script au début .

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}
ErickBest
la source
3
arr = arr.filter(v => v);

comme renvoyé vest l'implicité convertie en vérité

haind
la source
2

Si vous utilisez jQuery, grep peut être utile:


var arr = [ a, b, c, , e, f, , g, h ];

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

arr est maintenant [ a, b, c, d, e, f, g];

sansid1983
la source
2
jquery semble être beaucoup encombrant pour une tâche subalterne
Isaac
0

c'est-à-dire que nous devons prendre plusieurs adresses e-mail séparées par des virgules, des espaces ou une nouvelle ligne comme ci-dessous.

    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);
Atif Hussain
la source
.replace(" ","").split(" ")"remplacez tous les espaces par rien, puis essayez de diviser à chaque espace"
Isaac