Eliminar elementos vacíos de un array en Javascript

¿Cómo se eliminan los elementos vacíos de un array en JavaScript?

¿Existe una forma sencilla, o tengo que hacer un bucle y eliminarlos manualmente?

Solución

EDIT: Esta pregunta fue respondida hace casi nueve años, cuando no había muchos métodos incorporados útiles en el Array.prototype.

Ahora, ciertamente, te recomendaría usar el método filter.

Ten en cuenta que este método te devolverá un nuevo array con los elementos que pasen los criterios de la función callback que le proporciones.

Por ejemplo, si quieres eliminar los valores 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);

Dependerá de lo que consideres "vacío", por ejemplo, si se trata de cadenas, la función anterior no eliminaría los elementos que sean una cadena vacía.

Un patrón típico que veo a menudo es eliminar elementos que son falsos, que incluyen una cadena vacía "", 0, NaN, null, undefined, y false.

Puedes pasar al método filter, la función constructora Boolean, o devolver el mismo elemento en la función de criterios de filtrado, por ejemplo:

var filtered = array.filter(Boolean);

O

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

En ambos casos, esto funciona porque el método filter en el primer caso, llama al constructor Boolean como una función, convirtiendo el valor, y en el segundo caso, el método filter internamente convierte el valor de retorno de la llamada de retorno implícitamente en Boolean.

Si estás trabajando con arrays dispersos, y estás tratando de deshacerte de los "agujeros", puedes utilizar el método filter pasando una llamada de retorno que devuelva true, por ejemplo:

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

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

Respuesta antigua: ¡No hagas esto!

Yo uso este método, extendiendo el prototipo nativo de 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);

O simplemente puedes empujar los elementos existentes en otro 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,,,,]);
Comentarios (18)

Puede que te resulte más fácil hacer un bucle sobre tu matriz y construir una nueva matriz con los elementos que quieres conservar de la matriz que intentar hacer un bucle y empalmar como se ha sugerido, ya que modificar la longitud de la matriz mientras se hace el bucle puede introducir problemas.

Podrías hacer algo así:

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

En realidad aquí hay una solución más 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]

Usted consigue la idea - usted podría entonces tener otros tipos de funciones de filtro. Probablemente más de lo que necesitas, pero me sentía generoso... ;)

Comentarios (0)

Prueba esto. Pásale tu array y lo devolverá con los elementos vacíos eliminados. *Actualizado para corregir el error señalado por Jason

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