Wie kann ich leere Elemente aus einem Array in JavaScript entfernen?
Gibt es einen einfachen Weg, oder muss ich eine Schleife durchlaufen und sie manuell entfernen?
EDIT: Diese Frage wurde vor fast neun Jahren beantwortet, als es noch nicht viele nützliche eingebaute Methoden in Array.prototype
gab.
Jetzt würde ich Ihnen auf jeden Fall empfehlen, die Methode "filter" zu verwenden.
Denken Sie daran, dass diese Methode Ihnen ein neues Array mit den Elementen zurückgibt, die die Kriterien der Rückruffunktion erfüllen, die Sie ihr zur Verfügung stellen.
Zum Beispiel, wenn Sie null
oder undefined
Werte entfernen wollen:
var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
var filtered = array.filter(function (el) {
return el != null;
});
console.log(filtered);
Es hängt davon ab, was Sie als "leer" betrachten. Wenn Sie beispielsweise mit Strings arbeiten, würde die obige Funktion keine Elemente entfernen, die ein leerer String sind.
Ein typisches Muster, das oft verwendet wird, ist das Entfernen von Elementen, die falsy sind, was eine leere Zeichenkette ""
, 0
, NaN
, null
, undefined
und false
einschließt.
Sie können der Methode Filter
die Konstruktorfunktion Boolean
übergeben oder dasselbe Element beispielsweise in der Funktion Filterkriterien zurückgeben:
var filtered = array.filter(Boolean);
Oder
var filtered = array.filter(function(el) { return el; });
In beiden Fällen funktioniert dies, weil die "Filter"-Methode im ersten Fall den "Boolean"-Konstruktor als Funktion aufruft und den Wert umwandelt, und im zweiten Fall wandelt die "Filter"-Methode den Rückgabewert des Rückrufs intern implizit in "Boolean" um.
Wenn Sie mit spärlichen Arrays arbeiten und versuchen, die "Löcher" loszuwerden, können Sie die Methode filter
verwenden, die einen Callback übergibt, der z.B. true zurückgibt:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Alte Antwort: Tun Sie das nicht!
Ich verwende diese Methode, indem ich den nativen Array-Prototyp erweitere:
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);
Oder Sie können die vorhandenen Elemente einfach in ein anderes Array verschieben:
// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
var newArray = new Array();
for (var i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
Möglicherweise ist es einfacher, eine Schleife über Ihr Array zu ziehen und ein neues Array aus den Elementen zu erstellen, die Sie aus dem Array behalten wollen, als zu versuchen, eine Schleife zu ziehen und zu spleißen, wie es vorgeschlagen wurde, da die Änderung der Länge des Arrays, während es in einer Schleife geführt wird, Probleme verursachen kann.
Sie könnten etwa so vorgehen:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
Hier ist eigentlich eine allgemeinere Lösung:
function removeElementsFromArray(someArray, filter) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(filter(someArray[index]) == false) {
newArray.push(someArray[index]);
}
}
return newArray;
}
// then provide one or more filter functions that will
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
return (item == null || typeof(item) == "undefined");
}
// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);
// results == [1,2,3,3,4,4,5,6]
Sie verstehen die Idee - Sie könnten dann andere Arten von Filterfunktionen haben. Wahrscheinlich mehr als Sie brauchen, aber ich war großzügig... ;)
Versuchen Sie dies. Übergeben Sie Ihr Array und es wird mit entfernten leeren Elementen zurückgegeben. *Aktualisiert, um den von Jason aufgezeigten Fehler zu beheben
function removeEmptyElem(ary) {
for (var i = ary.length - 1; i >= 0; i--) {
if (ary[i] == undefined) {
ary.splice(i, 1);
}
}
return ary;
}