Pregunta Eliminar elementos vacíos de una matriz en Javascript


¿Cómo elimino elementos vacíos de una matriz en JavaScript?

¿Hay una manera directa, o necesito recorrerlo y eliminarlos manualmente?


711
2017-11-11 15:48


origen


Respuestas:


Utilizo este método, extendiendo el prototipo 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);

O simplemente puede insertar los elementos existentes en otra 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,,,,]);

487
2017-11-11 16:12



Maneras simples:

var arr = [1,2,,3,,3,null,,0,,undefined,4,,4,,5,,6,,,,];

// (filter - JS 1.6 and above)
arr = arr.filter(function(n){ return n != undefined }); 

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]

//or - (only for arrays items which are numbers is numbers' strings)**
arr = arr.filter(Number) // [1, 3, 3, 4, 4, 5, 6]

// ES6 style (Firefox FTW)
arr.filter(n => true) // [1, 2, 3, 3, null, 0, undefined, 4, 4, 5, 6]

// or if "null" values are to be removed:
arr.filter(n => n)

o - (solo para soltero elementos de matriz de tipo "texto")

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

o - Forma clásica: iteración simple

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


a través de jQuery:

var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


ACTUALIZAR: solo otra manera rápida y genial (usando ES6):

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;
delete temp; // discard the variable

arr // [1, 2, 3, 3, 4, 4, 5, 6]

Eliminar valores vacíos

['foo', '',, ' ', true, [], [1], {}, undefined].filter(String)

// ["foo", " ", true, [1], Object {}, undefined]

Eliminar los valores de falsy

Otro método que elimina el "falsy" valores de cadena vacía "", 0 y undefined

[1, 2,, 3,, 3,undefined,,"",false,null,0,NaN, 4," ", 4,true, 5,, 6,,,,].filter(Boolean);

// [1, 2, 3, 3, 4, " ", 4, true, 5, 6]

1137
2017-10-28 01:41



Si necesita eliminar TODOS los valores vacíos ("", nulo, indefinido y 0):

arr = arr.filter(function(e){return e}); 

Para eliminar valores vacíos y saltos de línea:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

Ejemplo:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

Regreso:

["hello", 1, 100, " "]

ACTUALIZACIÓN (basado en el comentario de Alnitak)

En algunas situaciones, es posible que desee mantener "0" en la matriz y eliminar todo lo demás (nulo, indefinido y ""), esta es una forma:

arr.filter(function(e){ return e === 0 || e });

Regreso:

["hello", 0, 1, 100, " "]

202
2017-12-10 09:25



Simplemente un trazador de líneas:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

o usando underscorejs.org:

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

121
2017-11-11 16:29



Si tienes Javascript 1.6 o posterior, puedes usar Array.filter usando un trivial return true función de devolución de llamada, por ejemplo:

arr = arr.filter(function() { return true; });

ya que .filter salta automáticamente los elementos faltantes en la matriz original.

La página MDN vinculada anteriormente también contiene una buena versión de comprobación de errores de filter que se puede usar en intérpretes de JavaScript que no son compatibles con la versión oficial.

Tenga en cuenta que esto no eliminará null entradas ni entradas con un explícito undefined valor, pero el OP específicamente solicitó entradas "faltantes".


108
2018-03-26 16:57



La forma limpia de hacerlo.

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]

46
2018-01-09 07:28



Para eliminar agujeros, debes usar

arr.filter(() => true)

Para eliminar valores de agujero, y, falsy (nulo, indefinido, 0, -0, NaN, "", falso, document.all):

arr.filter(x => x)

Para eliminar el agujero, nulo e indefinido:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]


36
2018-03-22 20:24



Simple ES6

['a','b','',,,'w','b'].filter(v => v);

23
2017-11-30 18:25