Como posso remover elementos vazios de um array em JavaScript?
Existe uma maneira simples, ou preciso de fazer um loop através dele e removê-los manualmente?
EDIT: Esta pergunta foi respondida há quase nove anos, quando não existiam muitos métodos úteis incorporados no `Array.prototype'.
Agora, certamente, eu recomendaria que você utilizasse o método filtro
.
Tenha em mente que este método lhe devolverá uma nova matriz com os elementos que passam o critério da função de retorno de chamada que você fornece a ela.
Por exemplo, se você quiser remover valores 'nulos' ou 'indefinidos':
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);
Dependerá do que você considera "vazio", por exemplo, se você estivesse lidando com cordas, a função acima não removeria elementos que são uma corda vazia.
Um padrão típico que eu vejo frequentemente utilizado é remover elementos que são falsy, que incluem uma string vazia "",
0,
NaN,
null,
undefined, e
false`.
Você pode passar para o método "filtro", a função "booleano" do construtor, ou retornar o mesmo elemento na função critério do filtro, por exemplo:
var filtered = array.filter(Boolean);
Ou
var filtered = array.filter(function(el) { return el; });
Em ambos os casos, isso funciona porque o método filtro
no primeiro caso, chama o construtor Booleano
como uma função, convertendo o valor, e no segundo caso, o método filtro
internamente transforma o valor de retorno da callback implicitamente em Booleano
.
Se você está trabalhando com arrays esparsos, e está tentando se livrar dos "buracos", você pode usar o método filtro
passando uma chamada de retorno que retorna verdadeiro, por exemplo:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Resposta antiga: Não faças isso!
Eu uso este método, estendendo o protótipo de Array nativo:
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);
Ou você pode simplesmente empurrar os elementos existentes para outra matriz:
// 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,,,,]);
Você pode achar mais fácil fazer loop sobre seu array e construir um novo array fora dos itens que você quer manter do array do que tentando fazer loop e splice como foi sugerido, já que modificar o comprimento do array enquanto ele está sendo feito loop sobre pode introduzir problemas.
Podias fazer algo assim:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
Na verdade, esta é uma solução mais genérica:
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]
Você tem a idéia - você poderia então ter outros tipos de funções de filtragem. Provavelmente mais do que você precisa, mas eu estava me sentindo generoso... ;)
Experimenta isto. Passa o teu array e ele voltará com os elementos vazios removidos. *Atualizado para endereçar o bug apontado por Jason
function removeEmptyElem(ary) {
for (var i = ary.length - 1; i >= 0; i--) {
if (ary[i] == undefined) {
ary.splice(i, 1);
}
}
return ary;
}