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?
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?
Ich schließe mich einfach der obigen Aussage "Rufen Sie die ES5 Array..filter()
mit einem globalen Konstruktor" Golf-Hack, aber ich schlage vor, die Object
anstelle von String
, Boolean
, oder Number
wie oben vorgeschlagen.
Genauer gesagt, die ES5 filter()
bereits nicht auslöst für undefined
Elemente innerhalb des Arrays; daher kann eine Funktion, die universell true
die folgende Ergebnisse liefert alle Elemente filter()
Treffer, wird zwangsläufig nur Nicht-Treffer zurückgeben. undefined
Elemente:
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
Allerdings ist das Schreiben von ...(function(){return true;})
ist länger als das Schreiben ...(Object)
; und der Rückgabewert der Object
Konstruktor wird, unter alle Umstände eine Art von Objekt. Im Gegensatz zu den oben vorgeschlagenen primitiven Boxing-Konstruktoren ist kein möglicher Objektwert falsch und somit boolesch, Object
ist eine Kurzform für function(){return true}
.
> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
Wenn ein Array neben leeren Objekten, Arrays und Strings auch andere leere Elemente enthält, können wir diese mit entfernen:
const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]
let filtered = JSON.stringify(
arr.filter((obj) => {
return ![null, undefined, ''].includes(obj)
}).filter((el) => {
return typeof el != "object" || Object.keys(el).length > 0
})
)
console.log(JSON.parse(filtered))
Mit ES6:
const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]
let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })
console.log(filtered)
Mit einfachem Javascript ->
var arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]
var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })
console.log(filtered)
Eine andere Möglichkeit besteht darin, die Längeneigenschaft des Arrays auszunutzen: Packen Sie die Nicht-Null-Elemente auf die "linke" Seite des Arrays und reduzieren Sie dann die Länge. Es handelt sich um einen In-Place-Algorithmus, der keinen Speicher zuweist, was schlecht für den Garbage Collector ist, und er hat ein sehr gutes Best/Average/Worst Case Verhalten.
Diese Lösung ist im Vergleich zu anderen hier zwischen 2 und 50 Mal schneller auf Chrome, und 5 bis 50 Mal schneller auf Firefox, 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 'this' für die Verkettung zurückgibt:
var removeNull = function() {
var nullCount = 0 ;
var length = this.length ;
for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
// no item is null
if (!nullCount) { return this}
// all items are null
if (nullCount == length) { this.length = 0; return this }
// mix of null // non-null
var idest=0, isrc=length-1;
length -= nullCount ;
while (true) {
// find a non null (source) slot on the right
while (!this[isrc]) { isrc--; nullCount--; }
if (!nullCount) { break } // break if found all null
// find one null slot on the left (destination)
while ( this[idest]) { idest++ }
// perform copy
this[idest]=this[isrc];
if (!(--nullCount)) {break}
idest++; isrc --;
}
this.length=length;
return this;
};
Object.defineProperty(Array.prototype, 'removeNull',
{ value : removeNull, writable : true, configurable : true } ) ;
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.