Leere Elemente aus einem Array in Javascript entfernen

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?

Lösung

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,,,,]);
Kommentare (18)

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

Kommentare (0)

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;
}
Kommentare (5)