Wie entferne ich leere Elemente aus einem Array in JavaScript?
Gibt es einen einfachen Weg oder muss ich ihn durchlaufen und manuell entfernen?
javascript
arrays
node.js
Tamas Czinege
quelle
quelle
var a = [,,]
undvar a = [undefined, undefined]
. Ersteres ist wirklich leer, aber letzteres hat tatsächlich zwei Schlüssel, aber mitundefined
Werten.Antworten:
EDIT: Diese Frage wurde vor fast neun Jahren beantwortet, als es in der nicht viele nützliche eingebaute Methoden gab
Array.prototype
.Nun würde ich Ihnen sicherlich empfehlen, die
filter
Methode zu verwenden.Beachten Sie, dass diese Methode Ihnen ein neues Array mit den Elementen zurückgibt, die die Kriterien der von Ihnen bereitgestellten Rückruffunktion erfüllen.
Zum Beispiel, wenn Sie
null
oderundefined
Werte entfernen möchten :Dies hängt davon ab, was Sie als "leer" betrachten. Wenn Sie sich beispielsweise mit Zeichenfolgen befassen, werden mit der obigen Funktion keine Elemente entfernt, die eine leere Zeichenfolge sind.
Ein typisches Muster , dass ich oft gebraucht wird Elemente zu entfernen, die falsy , die einen leeren String enthalten
""
,0
,NaN
,null
,undefined
, undfalse
.Sie können an die
filter
Methode, dieBoolean
Konstruktorfunktion, übergeben oder dasselbe Element in der Filterkriterienfunktion zurückgeben, zum Beispiel:Oder
In beiden
filter
Fällen funktioniert dies, da die Methode im ersten Fall denBoolean
Konstruktor als Funktion aufruft und den Wert konvertiert. Im zweiten Fall wandelt diefilter
Methode den Rückgabewert des Rückrufs intern implizit in umBoolean
.Wenn Sie mit spärlichen Arrays arbeiten und versuchen, die "Löcher" zu beseitigen, können Sie die
filter
Methode verwenden, die einen Rückruf übergibt, der true zurückgibt, zum Beispiel:Alte Antwort: Tu das nicht!
Ich verwende diese Methode, um den nativen Array-Prototyp zu erweitern:
Oder Sie können die vorhandenen Elemente einfach in ein anderes Array verschieben:
quelle
splice
Anruf ist in älteren Browsern sehr teuer, da alle Array-Schlüssel neu nummeriert werden müssen, um die Lücke zu schließen.Array.prototype
Object.defineProperty
.hasOwnProperty
Einfache Wege:
oder - (nur für einzelne Array-Elemente vom Typ "Text")
oder - Klassischer Weg: einfache Iteration
über jQuery:
UPDATE - nur ein weiterer schneller und cooler Weg (mit ES6):
Leere Werte entfernen
quelle
arr = arr.filter(function(n){return n; });
foo.join("").split("")
scheint nur zu funktionieren, wenn die Zeichenfolgen einzelne Zeichen sindarr.filter(e=>e)
und dies kann durch Karte, Verkleinerung usw. verkettet werden.Wenn Sie ALLE leeren Werte entfernen müssen ("", null, undefined und 0):
So entfernen Sie leere Werte und Zeilenumbrüche:
Beispiel:
Rückkehr:
UPDATE (basierend auf Alnitaks Kommentar)
In einigen Situationen möchten Sie möglicherweise "0" im Array behalten und alles andere (null, undefiniert und "") entfernen. Dies ist eine Möglichkeit:
Rückkehr:
quelle
function(e){return !!e}
!!e
NaN (im Gegensatz zu 0) enthalten iste
, wo nicht (wie 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
entfernt undefinierte "" und 0Einfach ein Liner:
oder mit underscorejs.org :
quelle
Boolean
als Funktion funktioniert ...Boolean
als Funktion behandeln, wird einfach zurückgegebentrue
oderfalse
ob der Wert wirklich / falsch ist.(true).constructor === Boolean
. Und dann sagen Sie mir, ob wir dies mit anderen Build-Ins in JS tun können. ;)) (natürlich ausgeschlossen die anderen 5 eingebauten Konstruktoren. (String, Array, Objekt, Funktion, Nummer))Wenn Sie Javascript 1.6 oder höher haben, können Sie
Array.filter
eine einfachereturn true
Rückruffunktion verwenden, z.da
.filter
fehlende Elemente im ursprünglichen Array automatisch übersprungen werden.Die oben verlinkte MDN-Seite enthält auch eine nette Version zur Fehlerprüfung
filter
, die in JavaScript-Interpreten verwendet werden kann, die die offizielle Version nicht unterstützen.Beachten Sie, dass dadurch weder
null
Einträge noch Einträge mit einem explizitenundefined
Wert entfernt werden, das OP jedoch speziell "fehlende" Einträge angefordert hat.quelle
undefined
als gegebenen Wert.Zum Entfernen von Löchern sollten Sie verwenden
Zum Entfernen von Loch- und Falschwerten (null, undefiniert, 0, -0, NaN, "", false, document.all):
Zum Entfernen von Loch, Null und undefiniert:
quelle
[, ,]
arr.filter(x => x)
JS wird geprüft, ob x wahr oder falsch ist, dhif (x)
, der neuen Liste wird nur der Wahrheitswert zugewiesen.Der saubere Weg, es zu tun.
quelle
undefined
; Dadurch werden grundsätzlich alle falschen Werte entfernt.Einfaches ES6
quelle
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Mit Unterstrich / Lodash:
Allgemeiner Anwendungsfall:
Mit Leergut:
Siehe lodash Dokumentation für ohne .
quelle
Angenommen
ES6
, das Array befindet sich in der Methode für gerechte und neuere Versionen:Einfacher Weg:
quelle
Wenn die Verwendung einer Bibliothek eine Option ist, von der ich weiß, dass underscore.js eine Funktion namens compact () http://documentcloud.github.com/underscore/ hat, hat es auch einige andere nützliche Funktionen in Bezug auf Arrays und Sammlungen.
Hier ist ein Auszug aus ihrer Dokumentation:
quelle
@ Alnitak
Tatsächlich funktioniert Array.filter in allen Browsern, wenn Sie zusätzlichen Code hinzufügen. Siehe unten.
Dies ist der Code, den Sie für den IE hinzufügen müssen, aber Filter und funktionale Programmierung sind imo wert.
quelle
Da es sonst niemand erwähnt hat und die meisten Leute Unterstriche in ihr Projekt aufgenommen haben, können Sie es auch verwenden
_.without(array, *values);
.quelle
ES6:
quelle
Möglicherweise fällt es Ihnen leichter, eine Schleife über Ihr Array zu erstellen und aus den Elementen, die Sie aus dem Array entfernen möchten, ein neues Array zu erstellen, als wie vorgeschlagen zu schleifen und zu verbinden, da Sie die Länge des Arrays während der Schleife ändern über kann Probleme verursachen.
Sie könnten so etwas tun:
Eigentlich ist hier eine allgemeinere Lösung:
Sie haben die Idee - Sie könnten dann andere Arten von Filterfunktionen haben. Wahrscheinlich mehr als du brauchst, aber ich fühlte mich großzügig ...;)
quelle
Was ist damit (ES6): So entfernen Sie den Falsy-Wert aus einem Array.
quelle
Sie sollten Filter verwenden, um ein Array ohne leere Elemente zu erhalten. Beispiel auf ES6
quelle
Ich füge einfach meine Stimme zu den oben „nennen ES5 ist
Array..filter()
mit einem globalen Konstruktor“ Golf-Hack, aber ich schlage vor , mitObject
stattString
,Boolean
oderNumber
wie oben vorgeschlagen.Insbesondere werden ES5- Elemente
filter()
bereits nicht fürundefined
Elemente innerhalb des Arrays ausgelöst . so eine Funktion , die allgemein zurückkehrttrue
, die zurückgibt alle Elementefilter()
Hits, wird zwangsläufig nur nicht zurückkehrenundefined
Elemente:Das Ausschreiben
...(function(){return true;})
ist jedoch länger als das Schreiben...(Object)
. und der Rückgabewert desObject
Konstruktors ist unter keinen Umständen eine Art Objekt. Im Gegensatz zu den oben vorgeschlagenen primitiven Boxkonstruktoren ist kein möglicher Objektwert falsey und daher in einer booleschen UmgebungObject
eine Abkürzung fürfunction(){return true}
.quelle
someArray.filter(String);
tatsächlich äquivalent zusomeArray.filter(function(x){ return String(x); });
. Wenn Sie alle falschen Werte entfernen möchtensomeArray.filter(Boolean);
, werden 0, -0, NaN, false, '', null und undefined entfernt.Object
Konstruktors im Gegensatz zurreturn true
Methode wundere . @robocat Das OP hat darum gebeten, leere Elemente zu entfernen, keine Nullen.Bei Verwendung der Antwort mit der höchsten Bewertung oben, dem ersten Beispiel, wurden einzelne Zeichen für Zeichenfolgenlängen größer als 1 angezeigt. Nachfolgend ist meine Lösung für dieses Problem aufgeführt.
Anstatt nicht zurückzukehren, wenn es nicht definiert ist, kehren wir zurück, wenn die Länge größer als 0 ist. Ich hoffe, das hilft jemandem da draußen.
Kehrt zurück
quelle
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Ersetzen Sie diese Funktion. .. mit String lässt ironischerweise Zahlen in, würde aber in Ihrem angegebenen Array das gleiche Ergebnis liefern.quelle
Was ist damit:
quelle
join() === join(',')
:)Dies funktioniert, ich habe es in AppJet getestet (Sie können den Code kopieren und in die IDE einfügen und auf " Neu laden" klicken, um zu sehen, dass es funktioniert. Sie müssen kein Konto erstellen.)
quelle
for ... in
tatsächlich das Überspringen fehlender Elemente verursacht. Der Test fürundefined
dient nur dazu, reale Elemente zu entfernen, die explizit auf diesen Wert festgelegt sind.Eine andere Möglichkeit besteht darin, die Eigenschaft length des Arrays zu nutzen: Packen Sie die Nicht-Null-Elemente links vom Array und reduzieren Sie dann die Länge. Es handelt sich um einen In-Place-Algorithmus, der keinen Speicher zuweist, was für den Garbage Collector zu schlecht ist. Er weist ein sehr gutes Best- / Average- / Worst-Case-Verhalten auf.
Diese Lösung ist im Vergleich zu anderen hier in Chrome 2- bis 50-mal schneller und in Firefox 5- bis 50-mal schneller, wie Sie hier sehen können: http://jsperf.com/remove-null-items-from-array
Der folgende Code fügt dem Array die nicht aufzählbare Methode 'removeNull' hinzu, die für die Verkettung 'this' zurückgibt:
quelle
arr.filter(e => e)
.smart
- wie dem Verb - abhängen , um einen scharfen stechenden Schmerz zu verursachen. Dies ist aufgrund der körperlichen Schmerzen relevant, wenn ich mein Telefon aufgrund Ihres Kommentars mit Waffen bewaffne.kehrt zurück
quelle
'Missbrauch' der for ... in (Objektelement-) Schleife. => Im Rumpf der Schleife erscheinen nur wahrheitsgemäße Werte.
quelle
for ... in
die undefinierten Schlüssel aus dem Array entfernt, aber Sie haben hier eigentlich keinen Code, um ansonsten nur "wahrheitsgemäße" Werte zu akzeptierenDies könnte Ihnen helfen: https://lodash.com/docs/4.17.4#remove
quelle
Ausgabe:
Das leere Element wird aus dem Array entfernt und ein anderes Element angezeigt.
quelle
Alle leeren Elemente entfernen
Wenn ein Array neben anderen leeren Elementen leere Objekte, Arrays und Strings enthält, können wir sie entfernen mit:
Einfaches Komprimieren (Entfernen leerer Elemente aus einem Array)
Mit ES6:
Mit einfachem Javascript ->
quelle
Herausfiltern ungültiger Einträge mit einem regulären Ausdruck
quelle
Der beste Weg, leere Elemente zu entfernen, ist die Verwendung
Array.prototype.filter()
, wie bereits in anderen Antworten erwähnt.Wird leider
Array.prototype.filter()
nicht von IE <9 unterstützt. Wenn Sie IE8 oder eine noch ältere Version von IE weiterhin unterstützen müssen, können Sie die folgende Polyfüllung verwenden , um Unterstützung fürArray.prototype.filter()
diese Browser hinzuzufügen :quelle