Rimuovere gli elementi vuoti da un array in Javascript

Come rimuovo gli elementi vuoti da un array in JavaScript?

C'è un modo semplice o devo fare un ciclo e rimuoverli manualmente?

Soluzione

EDIT: A questa domanda è stata data una risposta quasi nove anni fa, quando non c'erano molti metodi integrati utili nel Array.prototype.

Ora, certamente, vi consiglierei di usare il metodo filter.

Tenete presente che questo metodo vi restituirà un nuovo array con gli elementi che superano i criteri della funzione di callback che gli fornite.

Per esempio, se volete rimuovere i valori null o undefined:

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

Dipenderà da cosa consideri come "vuoto" per esempio, se tu avessi a che fare con delle stringhe, la funzione di cui sopra non rimuoverebbe gli elementi che sono una stringa vuota.

Uno schema tipico che vedo spesso usato è quello di rimuovere gli elementi che sono falsy, che includono una stringa vuota "", 0, NaN, null, undefined, e false.

Puoi passare al metodo filter, la funzione costruttore Boolean, o restituire lo stesso elemento nella funzione dei criteri del filtro, per esempio:

var filtered = array.filter(Boolean);

Oppure

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

In entrambi i modi, questo funziona perché il metodo filter nel primo caso, chiama il costruttore Boolean come funzione, convertendo il valore, e nel secondo caso, il metodo filter trasforma internamente il valore di ritorno della callback implicitamente in Boolean.

Se state lavorando con array sparsi, e state cercando di sbarazzarvi dei "buchi", potete usare il metodo filter passando una callback che restituisce true, per esempio:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

Vecchia risposta: Non farlo!

Io uso questo metodo, estendendo il prototipo nativo di Array:

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

Oppure puoi semplicemente spingere gli elementi esistenti in un altro array:

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

Potreste trovare più facile fare un loop sul vostro array e costruire un nuovo array con gli elementi che volete mantenere dall'array, piuttosto che provare a fare un loop e splice come è stato suggerito, poiché modificare la lunghezza dell'array mentre è in loop può introdurre problemi.

Potreste fare qualcosa del genere:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

In realtà ecco una soluzione più generica:

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]

Hai capito l'idea - potresti poi avere altri tipi di funzioni di filtro. Probabilmente è più di quanto hai bisogno, ma mi sentivo generoso... ;)

Commentari (0)

Provate questo. Passategli il vostro array e ritornerà con gli elementi vuoti rimossi. *Aggiornato per risolvere il bug segnalato da Jason

function removeEmptyElem(ary) {
    for (var i = ary.length - 1; i >= 0; i--) {
        if (ary[i] == undefined)  {
            ary.splice(i, 1);
        }       
    }
    return ary;
}
Commentari (5)