1650 Stimmen

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?

1819voto

vsync Punkte 101339

Ein paar einfache Möglichkeiten:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];

arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

oder - (nur für einzeln Array-Elemente vom Typ "Text")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

oder - Klassischer Weg: einfache Iteration

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values
// [1,2,3,3,[],Object{},5,6]

jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr, n => n == 0 || n);
// [1, 2, 3, 3, 0, 4, 4, 5, 6]

1495voto

Christian C. Salvadó Punkte 763569

EDITAR: Diese Frage wurde vor fast neun Jahren beantwortet, als es noch nicht viele nützliche integrierte Methoden in der Array.prototype .

Natürlich würde ich Ihnen empfehlen, die filter Methode.

Beachten Sie, dass diese Methode Ihnen ein neues Array mit den Elementen, die die Kriterien der von Ihnen angegebenen Rückruffunktion erfüllen.

Wenn Sie zum Beispiel Folgendes entfernen möchten null o undefined Werte:

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 Zeichenketten arbeiten, würde die obige Funktion keine Elemente entfernen, die eine leere Zeichenkette sind.

Ein typisches Muster, das häufig verwendet wird, besteht darin, Elemente zu entfernen, die falsy die eine leere Zeichenkette enthalten "" , 0 , NaN , null , undefined y false .

Sie können an den filter Methode, die Boolean Konstruktorfunktion, oder geben Sie dasselbe Element z.B. in der Filterkriterienfunktion zurück:

var filtered = array.filter(Boolean);

Oder

var filtered = array.filter(function(el) { return el; });

In beiden Fällen funktioniert dies, weil die filter im ersten Fall, ruft die Methode Boolean Konstruktor als eine Funktion, die den Wert umwandelt, und im zweiten Fall wird der filter Methode intern den Rückgabewert des Rückrufs implizit in Boolean .

Wenn Sie mit spärlichen Arrays arbeiten und versuchen, die "Löcher" loszuwerden, können Sie die filter Methode, 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 und erweitere den nativen Array-Prototyp:

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

267voto

lepe Punkte 23471

Wenn Sie ALLE leeren Werte ("", null, undefiniert und 0) entfernen müssen:

arr = arr.filter(function(e){return e}); 

Um leere Werte und Zeilenumbrüche zu entfernen:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Beispiel:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Rückkehr:

["hello", 1, 100, " "]

UPDATE (basierend auf dem Kommentar von Alnitak)

In manchen Situationen möchten Sie vielleicht "0" im Array behalten und alles andere (null, undefiniert und "") entfernen, dies ist eine Möglichkeit:

arr.filter(function(e){ return e === 0 || e });

Rückkehr:

["hello", 0, 1, 100, " "]

146voto

Andreas Louv Punkte 44118

Einfach nur ein Liner:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

oder mit underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

139voto

Alnitak Punkte 324207

Wenn Sie Javascript 1.6 oder höher haben, können Sie Array.filter mit einer trivialen return true Rückruf-Funktion, z.B.:

arr = arr.filter(function() { return true; });

seit .filter überspringt automatisch fehlende Elemente im ursprünglichen Array.

Die oben verlinkte MDN-Seite enthält auch eine schöne Version zur Fehlerprüfung von filter die in JavaScript-Interpretern verwendet werden können, die die offizielle Version nicht unterstützen.

Beachten Sie, dass dadurch nicht die null Einträge noch Einträge mit einem expliziten undefined Wert, aber der Auftraggeber hat ausdrücklich um "fehlende" Einträge gebeten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X