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.

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


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!==''});

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;
  };
}

3
arr = arr.filter(v => v);

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


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];


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);

.replace(" ","").split(" ")"remplacez tous les espaces par rien, puis essayez de diviser à chaque espace"
Isaac

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.