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?

3voto

Kamil Kiełczewski Punkte 69048

Sie können den Filter mit Index und in Betreiber

let a = [1,,2,,,3];
let b = a.filter((x,i)=> i in a);

console.log({a,b});

3voto

ELLIOTTCABLE Punkte 15484

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]

3voto

KARTHIKEYAN.A Punkte 14230
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

3voto

Zalom Punkte 653

Entfernen aller leeren Elemente

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

Einfache Verdichtung (Entfernen leerer Elemente aus einem Array)

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)

2voto

GameAlchemist Punkte 18409

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