Come rimuovo gli elementi vuoti da un array in JavaScript?
C'è un modo semplice o devo fare un ciclo e rimuoverli manualmente?
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,,,,]);
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... ;)
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;
}