Leere Zeichenfolgen aus dem Array entfernen, während Aufzeichnung ohne Schleife?


90

Diese Frage wurde hier gestellt: Entfernen Sie leere Zeichenfolgen aus dem Array, während Sie Indizes mit nicht leeren Zeichenfolgen aufzeichnen

Wenn Sie das gegebene bemerken würden, wie @Baz es auslegte;

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

"und daraus möchte ich die folgenden zwei Arrays erzeugen:"

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

Alle Antworten auf diese Frage bezogen sich auf eine Form der Schleife.

Meine Frage: Gibt es eine Möglichkeit , alle indexes ohne Schleifen zu entfernen empty string ?... gibt es eine andere Alternative als das Iterieren des Arrays?

Kann einige regexoder einige seinjQuery , die wir nicht kennen?

Alle Antworten oder Vorschläge werden sehr geschätzt.

Antworten:


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

filter Dokumentation


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

Dokumentation der Pfeilfunktionen


3
Ich weiß genau, wie du dich fühlst, ich habe es vor Monaten benutzt, behebt so viele kleine Probleme
Isaac

14
@DiegoPlentz Leute, die noch IE8 ausführen, werden viel mehr Probleme haben, als nur Leerzeichen in einem Array zu entfernen ... Ich denke heutzutage kaum daran, diesen Browser zu unterstützen
Isaac

Dies ist die nächste, array.filter(!!)die wir derzeit bekommen können :)
james_womack

2
Alle Gutschriften für diese Antwort sollten an stackoverflow.com/questions/16701319/…
Isaac

Eine Erklärung dazu Booleanwäre schön.
Robsch

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

Einfach die beste Antwort. Tut genau das, was die Frage stellt. Entfernt keine Nullwerte.
Bryan

9

BITTE BEACHTEN SIE: Die Dokumentation sagt:

filterist eine JavaScript-Erweiterung des ECMA-262-Standards; als solches ist es möglicherweise in anderen Implementierungen des Standards nicht vorhanden . Sie können dies umgehen, indem Sie den folgenden Code am Anfang Ihrer Skripte einfügen und die Verwendung von Filtern in ECMA-262-Implementierungen ermöglichen, die ihn nicht nativ unterstützen. Dieser Algorithmus ist genau der in ECMA-262, 5. Ausgabe, angegebene, vorausgesetzt, fn.call ergibt den ursprünglichen Wert von Function.prototype.call und Array.prototype.push hat seinen ursprünglichen Wert.

Um Herzschmerz zu vermeiden, müssen Sie diesen Code möglicherweise zu Beginn zu Ihrem Skript hinzufügen .

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

wie zurückgegeben vwird Implizität in Wahrheit umgewandelt


2

Wenn Sie jQuery verwenden, kann grep hilfreich sein:


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

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

arr ist jetzt [ a, b, c, d, e, f, g];


2
jquery scheint eine Menge Sperrigkeit für eine niedere Aufgabe zu sein
Isaac

0

Das heißt, wir müssen mehrere E-Mail-Adressen verwenden, die durch Komma, Leerzeichen oder Zeilenumbruch getrennt sind (siehe unten).

    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(" ")"Ersetzen Sie alle Leerzeichen durch nichts und versuchen Sie dann, sie an jedem Leerzeichen aufzuteilen"
Isaac

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.