Eliminar elementos vacíos de una matriz en Javascript

1145

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

¿Hay alguna forma sencilla o necesito recorrerla y eliminarla manualmente?

Tamas Czinege
fuente
14
Sería útil que su pregunta especificara exactamente lo que quiere decir con "elementos vacíos", ya que la mayoría de las respuestas aquí interpretan que incorrectamente (en mi humilde opinión) significa elementos "falsey". NB: hay una diferencia entre lo que obtienes var a = [,,]y var a = [undefined, undefined]. El primero está realmente vacío, pero el segundo en realidad tiene dos claves, pero con undefinedvalores.
Alnitak

Respuestas:

1065

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

Ahora, ciertamente, te recomendaría que uses el filtermétodo.

Tenga en cuenta que este método le devolverá una nueva matriz con los elementos que pasan los criterios de la función de devolución de llamada que le proporciona.

Por ejemplo, si desea eliminar nullo undefinedvalores:

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 considere "vacío", por ejemplo, si se trata de cadenas, la función anterior no eliminaría los elementos que son una cadena vacía.

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

Puede pasar al filtermétodo, la Booleanfunción de constructor o devolver el mismo elemento en la función de criterios de filtro, por ejemplo:

var filtered = array.filter(Boolean);

O

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

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

Si está trabajando con matrices dispersas y está tratando de deshacerse de los "agujeros", puede usar el filtermétodo pasando una devolución de llamada que devuelve verdadero, por ejemplo:

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

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

Antigua respuesta: ¡No hagas esto!

Utilizo este método, extendiendo el prototipo nativo de matriz:

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,,,,]);
CMS
fuente
110
ADVERTENCIA: La segunda opción eliminará cualquier elemento de una matriz considerada "falsa", es decir, los valores de falso, 0, nulo e indefinido. Esta matriz terminaría sin nada en absoluto: [nulo ,,, 0, 0,0,0, falso, nulo, 0] aunque podría querer los elementos con valores de 0, como en esta matriz: [ 1,0,1,0,0,1]
Jason Bunting
55
Me doy cuenta de eso, por eso solo hablé de la segunda opción. En cuanto al primero, tiene un alcance tan estrecho que dudaría en hacerlo parte del prototipo del Array. Vea la respuesta de Alnitak en esta página para algo que sería más ideal. Sin embargo, el tuyo sí permite encadenar, obviamente.
Jason Bunting
1
Su primera solución es realmente buena si no tiene acceso al método de "filtro". De lo contrario, creo que la respuesta de Alnitak es mejor.
Joe Pineda
2
@AlfaTek: aparte de los navegadores más nuevos, # 2 tendrá el mejor rendimiento, porque las matrices en JS no son realmente matrices. La splicellamada es realmente costosa en navegadores antiguos porque tienen que renumerar todas las claves de la matriz para cerrar la brecha.
Alnitak
1
@David no, en el código moderno debe extender de forma segura el Array.prototypeuso Object.definePropertypara hacer que la nueva función sea una propiedad no enumerable y luego evitar el impacto en el rendimiento causado al poner .hasOwnPropertyen cada bucle.
Alnitak el
1382

Formas simples:

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


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

o - (solo para elementos de matriz única del 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]


ACTUALIZACIÓN: solo otra forma 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;

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

Eliminar valores vacíos

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]
vsync
fuente
34
El primer soporte de IE para el filtro es el modo estándar IE9.
yincrash el
14
para javascript puro debería serarr = arr.filter(function(n){return n; });
ilumin
19
foo.join("").split("")solo parece funcionar si las cadenas son caracteres individuales
Atav32
99
Su código JavaScript puro tiene un error. Si la matriz tiene un valor con "0", el valor se filtrará porque "0" es falso. Lo que desea es: arr.filter (function (n) {return (n! == undefined && n! == null);});
John Kurlak
55
ES6 puede hacerlo aún más simple arr.filter(e=>e)y esto se puede encadenar por mapa, reducir, etc.
Sheepy
242

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 cualquier otra cosa (nulo, indefinido y ""), esta es una forma:

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

Regreso:

["hello", 0, 1, 100, " "]
lepe
fuente
Sí, esto es bueno porque quita "" también.
Vladimirs
3
La función de prueba podría ser un poco más explícita:function(e){return !!e}
Koen.
44
@Koen Tenga en cuenta que !!eincluirá NaN (a diferencia de 0), mientras eque whereous no lo haría (como 0).
Sheepy
En realidad no responde la pregunta que se hizo.
Alnitak
2
O el uso var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);elimina indefinido, "" y 0
Mark Schultheiss
134

Simplemente un revestimiento:

[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]
andlrc
fuente
1
Esto es realmente genial, aunque tengo una nueva pregunta: parece que está usando un nombre de clase como una llamada a función, ¿es eso un encasillamiento? No he visto esto antes y no estoy seguro de por qué pasar Booleanfunciona como una función ...
Andrew
8
Si lo trata Booleancomo una función, simplemente devolverá trueo falsesi el valor es verdadero / falso.
andlrc
8
No estás tratando el booleano como una función; que es una función. (Una función completamente normal, excepto que está implementada de forma nativa). Alguien necesita investigar un poco sobre el modelo de objetos de JavaScript. ;)
ELLIOTTCABLE
@ELLIOTTCABLE Im sólo va a dejar esto aquí, (true).constructor === Boolean. Y luego dime si podemos hacer esto con otros complementos en JS. ;)) (por supuesto excluyó a los otros 5 constructores integrados. (Cadena, matriz, objeto, función, número))
andlrc
1
Fallarán ambos si hay un valor 0 en la matriz
Sai Ram el
129

Si tiene Javascript 1.6 o posterior, puede usar Array.filteruna return truefunción de devolución de llamada trivial , por ejemplo:

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

ya que .filterautomáticamente omite los elementos que faltan en la matriz original.

La página MDN vinculada anteriormente también contiene una buena versión de verificación de errores filterque se puede usar en intérpretes de JavaScript que no admiten la versión oficial.

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

Alnitak
fuente
¡Tienes razón! Puede ser tan simple como esto (¡y funciona!): Test3 = [1,2,, 3,, 3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4,, 4,, 5 ,, 6, indefinido ,, nulo ,,]; printp ("Usando el filtrado nativo de la matriz:", test3.filter (function (value) {return (value == undefined)? 0: 1;}));
Joe Pineda
3
+1 Como dijo Alnitak, tienen el código que se puede usar en el caso de no tener js 1.6 disponible
Sameer Alibhai
3
@katsh He aclarado - el código anterior hace el trabajo para eliminar las entradas para que no exista valor en absoluto, que (he posteriormente) aprendido es semánticamente diferente al caso de una llave que existe pero que tiene undefinedcomo su valor dado.
Alnitak
44
Para eliminar entradas indefinidas o nulas, simplemente realice una pequeña modificación ... arr = arr.filter (function (v) {return v;});
Alan CN
44
@AlanCN has perdido completamente mi punto. El OP solicitó eliminar las entradas faltantes , mientras que la mayor parte de las respuestas aquí (incorrectamente) eliminan las entradas "falsey".
Alnitak
65

Para eliminar agujeros, debe usar

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

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

arr.filter(x => x)

Para eliminar agujeros, nulos e indefinidos:

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]

tsh
fuente
3
Esto debería estar arriba en la respuesta. ¿Puedes ampliar lo que quieres decir con agujeros / agujero ...?
samayo
2
Los agujeros de @samayo son elementos de matriz sin llenar, es decir[, ,]
Jimmy Obonyo Abor el
Al usar arr.filter(x => x), JS verificará si x es verdadero o falso, es decir if (x), solo el valor de verdad se asignará a la nueva lista.
KuanYu Chu
56

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"]
Tomás Senart
fuente
55
Los elementos vacíos son undefined; Esto básicamente elimina todos los valores falsos.
pimvdb
33

ES6 simple

['a','b','',,,'w','b'].filter(v => v);
ML13
fuente
1
Esto no funciona: [1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v).
cremallera
22

Con subrayado / Lodash:

Caso de uso general:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

Con envases vacíos:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

Consulte la documentación de lodash para sin .

c4urself
fuente
El problema con #compact es que elimina cualquier valor falso. Entonces, si su matriz contiene 0 valores, también se eliminarán.
Samuel Brandão
21

Sólo ES6y más reciente método versiones, suponga matriz es a continuación:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

Manera simple:

 const clearArray = arr.filter( i => i );
AmerllicA
fuente
16

Si usar una biblioteca es una opción, sé que underscore.js tiene una función llamada compact () http://documentcloud.github.com/underscore/ también tiene varias otras funciones útiles relacionadas con matrices y colecciones.

Aquí hay un extracto de su documentación:

_.compact (matriz)

Devuelve una copia de la matriz con todos los valores falsos eliminados. En JavaScript, falso, nulo, 0, "", indefinido y NaN son falsos.

_.compact ([0, 1, falso, 2, '', 3]);

=> [1, 2, 3]

Luis perez
fuente
También elimina elementos definidos como elementos no vacíos como 0.
Timothy Gu
15

@Alnitak

En realidad, Array.filter funciona en todos los navegadores si agrega algún código adicional. Vea abajo.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

Este es el código que necesita agregar para IE, pero el filtro y la programación funcional vale la pena.

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}
Erik Johansson
fuente
Esta debería ser la respuesta aceptada, ya que funciona de fábrica. Muchas gracias.
Tony
@ Tony no, no debería, porque un elemento con una cadena vacía no es lo mismo que un "elemento vacío", siendo este último lo que solicitó el OP.
Alnitak
14

Como nadie más lo mencionó y la mayoría de las personas tienen subrayado incluido en su proyecto, también puede usarlo _.without(array, *values);.

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]
Josh Bedo
fuente
12

ES6:

let newArr = arr.filter(e => e);
Kanan Farzali
fuente
8

Es posible que le resulte más fácil recorrer su matriz y crear una nueva matriz a partir de los elementos que desea mantener de la matriz que intentando hacer un bucle y unir como se ha sugerido, ya que modifica la longitud de la matriz mientras está en bucle. sobre puede introducir problemas.

Podrías hacer algo como esto:

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 tiene la idea: podría tener otros tipos de funciones de filtro. Probablemente más de lo que necesitas, pero me sentía generoso ...;)

Jason Bunting
fuente
7

¿Qué pasa con esto (ES6) ?: Para eliminar el valor Falsy de una matriz.

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]
VIJAY P
fuente
6

Debe usar filter para obtener una matriz sin elementos vacíos. Ejemplo en ES6

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);
Gapur Kassym
fuente
3

Simplemente estoy añadiendo mi voz a las anteriores “llamar ES5 de Array..filter()con un constructor mundial” golf-corte, pero se sugiere emplear Objecten lugar de String, BooleanoNumber como se sugirió anteriormente.

Específicamente, los ES5 filter()ya no activan undefinedelementos dentro de la matriz; Por lo tanto, una función que devuelve universalmente true, que devuelve todos losfilter() aciertos de elementos , necesariamente devolverá no undefinedelementos:

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

Sin embargo, escribir ...(function(){return true;})es más largo que escribir ...(Object); y el valor de retorno del Objectconstructor será, bajo cualquier circunstancia , algún tipo de objeto. A diferencia de los constructores de boxeo primitivo sugeridos anteriormente, ningún valor de objeto posible es falsey y, por lo tanto, en un entorno booleano, Objectes una abreviatura de function(){return true}.

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]
ELLIOTTCABLE
fuente
1
CUIDADO: filter (String) y filter (Object) no filtran nulos o números. Debido a que un constructor también es una función, puede pasar String para filtrar, someArray.filter(String);es decir, en realidad es equivalente a someArray.filter(function(x){ return String(x); });. Si desea eliminar todos los valores falsos someArray.filter(Boolean);funciona para eliminar 0, -0, NaN, falso '', nulo e indefinido.
robocat
1
Buena respuesta, aunque me pregunto sobre la sobrecarga de rendimiento de llamar al Objectconstructor en lugar del return truemétodo. @robocat, el OP solicitó que se eliminen los elementos vacíos, no los nulos.
Alnitak
Prefiero la solución más corta y clara, excepto en lazos cerrados. Preferencia personal, supongo. (=
ELLIOTTCABLE
3

Cuando utilicé la respuesta más votada arriba, primer ejemplo, estaba obteniendo caracteres individuales para longitudes de cadena superiores a 1. A continuación se muestra mi solución para ese problema.

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

En lugar de no regresar si no está definido, devolvemos si la longitud es mayor que 0. Espero que ayude a alguien por ahí.

Devoluciones

["some string yay", "Other string yay"]
John Miller
fuente
+1 ya que esto es muy práctico y es exactamente lo que generalmente necesito para trabajar con matrices de cadenas, pero tenga en cuenta que esto elimina los números (si no están en forma de cadena) ya que no tienen una longitud. ["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123Reemplazando esa función. .. con String, irónicamente, deja números pero daría el mismo resultado en su matriz dada.
aamarks
3
var data = [null, 1,2,3];
var r = data.filter(function(i){ return i != null; })

console.log(r) 

[1,2,3]

KARTHIKEYAN.A
fuente
¡Esta es la forma obviamente correcta de hacerlo y debe estar en la cima!
Martin Andersson
2

¿Qué hay de eso?

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6
JessyNinja
fuente
66
join() === join(','):)
pimvdb
1

Esto funciona, lo probé en AppJet (puede copiar y pegar el código en su IDE y presionar "volver a cargar" para verlo funcionar, no es necesario crear una cuenta)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

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

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
Joe Pineda
fuente
1
Esto solo parece funcionar "por accidente", ya que es el acto de enumerar las claves a través de lo for ... inque realmente provoca la omisión de elementos faltantes. La prueba undefinedsolo sirve para eliminar elementos reales que se establecen explícitamente en ese valor.
Alnitak
1

Otra forma de hacerlo es aprovechar la propiedad de longitud de la matriz: empaque los elementos no nulos en la 'izquierda' de la matriz y luego reduzca la longitud. Es un algoritmo in situ -no asigna memoria, demasiado malo para el recolector de basura-, y tiene muy buen comportamiento de mejor / promedio / peor caso.

Esta solución, en comparación con otras aquí, es entre 2 y 50 veces más rápida en Chrome y de 5 a 50 veces más rápida en Firefox, como puede ver aquí: http://jsperf.com/remove-null-items-from-array

El siguiente código agrega el método 'removeNull' no enumerable a la matriz, que devuelve 'this' para encadenamiento:

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;
GameAlchemist
fuente
Buena respuesta, ¡aunque sería bueno ver algunos casos de prueba para mostrarlo en acción!
Alnitak
2
Esta respuesta es muy fascinante, pero me recuerda de mirar a una computadora construida en 1945, cuando tengo un teléfono inteligente: arr.filter(e => e).
agm1984
@ agm1984 su teléfono inteligente no es inteligente
Hernán Eche
Eso puede depender de su definición de smart--como el verbo, para causar un agudo dolor punzante. Esto es relevante debido al dolor físico si uso mi teléfono como arma debido a su comentario.
agm1984
1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

devoluciones

[0, 1, 2, 3, "four"]
sqram
fuente
1

'Uso indebido' del bucle for ... in (objeto-miembro). => Solo los valores verdaderos aparecen en el cuerpo del bucle.

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);
michael.zech
fuente
El código es correcto, el comentario es incorrecto. El acto de usar for ... ines lo que elimina las claves indefinidas de la matriz, pero en realidad no hay ningún código aquí para aceptar solo valores "verdaderos"
Alnitak
1

Esto podría ayudarlo: https://lodash.com/docs/4.17.4#remove

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };
Sandeep M
fuente
1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

Salida:

Estoy trabajando en nodejs

Eliminará el elemento vacío de la matriz y mostrará otro elemento.

Jitendra virani
fuente
salida: 'Estoy trabajando en nodejs'. eliminará el elemento vacío de la matriz y mostrará otro elemento.
Jitendra virani
Mejoré tu respuesta. Intente dar una respuesta simple, clara y legible;)
GGO
1

Eliminar todos los elementos vacíos

Si una matriz contiene objetos, matrices y cadenas vacíos junto con otros elementos vacíos, podemos eliminarlos con:

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

Compactación simple (eliminación de elementos vacíos de una matriz)

Con ES6:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

Con Javascript simple ->

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

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)

Zlatko Alomerovic
fuente
0

Filtrar entradas no válidas con una expresión regular

array = array.filter(/\w/);
filter + regexp
lcabral
fuente
¿Esto funciona? muestra un error TypeError: [object RegExp] no es una función
FreeLightman
0

La mejor manera de eliminar elementos vacíos es usar Array.prototype.filter(), como ya se mencionó en otras respuestas.

Lamentablemente, Array.prototype.filter()no es compatible con IE <9. Si aún necesita admitir IE8 o una versión aún más antigua de IE, puede usar el siguiente polyfill para agregar compatibilidad Array.prototype.filter()en estos navegadores:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
John Slegers
fuente