Rimuovere le stringhe vuote dall'array mantenendo la registrazione senza loop?


90

Questa domanda è stata posta qui: rimuovere le stringhe vuote dall'array tenendo traccia degli indici con stringhe non vuote

Se notassi il dato come @Baz lo ha disposto;

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

"e da questo desidero produrre i seguenti due array:"

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

Tutte le risposte a questa domanda si riferivano a una forma di looping.

La mia domanda: esiste la possibilità di rimuovere tutti gli indexes con empty string senza alcun loop? ... c'è qualche altra alternativa oltre all'iterazione dell'array?

Possono essere alcuni regexo alcuni di jQuerycui non siamo a conoscenza?

Tutte le risposte o suggerimenti sono molto apprezzati.

Risposte:


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 documentazione


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

Documentazione delle funzioni freccia


3
So esattamente come ti senti, l'ho usato mesi fa, risolve tanti piccoli problemi
Isaac

14
@DiegoPlentz le persone che stanno ancora utilizzando IE8 avranno molti più problemi della semplice rimozione di spazi vuoti in un array ... Non ho quasi mai pensato di supportare quel browser in questi giorni
Isaac

Questo è il più vicino a array.filter(!!)quello che possiamo attualmente ottenere :)
james_womack

2
Tutto il merito di questa risposta dovrebbe andare a stackoverflow.com/questions/16701319/…
Isaac

Qualche spiegazione in merito Booleansarebbe carina.
robsch

18
var newArray = oldArray.filter(function(v){return v!==''});

Facilmente la migliore risposta. Fa esattamente quello che chiede la domanda. Non rimuove i valori zero.
Bryan

9

NOTA BENE: La documentazione dice:

filterè un'estensione JavaScript dello standard ECMA-262; come tale potrebbe non essere presente in altre implementazioni dello standard . Puoi aggirare questo problema inserendo il seguente codice all'inizio degli script, consentendo l'uso del filtro nelle implementazioni ECMA-262 che non lo supportano nativamente. Questo algoritmo è esattamente quello specificato in ECMA-262, 5a edizione, assumendo che fn.call restituisca il valore originale di Function.prototype.call e che Array.prototype.push abbia il suo valore originale.

Quindi, per evitare un po 'di angoscia, potresti dover aggiungere questo codice al tuo script all'inizio .

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

come restituito vè l'implicito convertito in verità


2

Se stai usando jQuery, grep può essere utile:


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

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

arr è ora [ a, b, c, d, e, f, g];


2
jquery sembra un sacco di ingombro per un compito umile
Isaac

0

cioè dobbiamo prendere più indirizzi email separati da virgola, spazi o nuova riga come sotto.

    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(" ")"sostituire tutti gli spazi con niente, quindi provare a dividere in ogni spazio"
Isaac

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.