¿Cómo elimino elementos vacíos de una matriz en JavaScript?
¿Hay alguna forma sencilla o necesito recorrerla y eliminarla manualmente?
javascript
arrays
node.js
Tamas Czinege
fuente
fuente
var a = [,,]
yvar a = [undefined, undefined]
. El primero está realmente vacío, pero el segundo en realidad tiene dos claves, pero conundefined
valores.Respuestas:
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
filter
mé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
null
oundefined
valores: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
, yfalse
.Puede pasar al
filter
método, laBoolean
función de constructor o devolver el mismo elemento en la función de criterios de filtro, por ejemplo:O
En ambos sentidos, esto funciona porque el
filter
método en el primer caso, llama alBoolean
constructor como una función, convirtiendo el valor, y en el segundo caso, elfilter
método convierte internamente el valor de retorno de la devolución de llamada implícitamenteBoolean
.Si está trabajando con matrices dispersas y está tratando de deshacerse de los "agujeros", puede usar el
filter
método pasando una devolución de llamada que devuelve verdadero, por ejemplo:Antigua respuesta: ¡No hagas esto!
Utilizo este método, extendiendo el prototipo nativo de matriz:
O simplemente puede insertar los elementos existentes en otra matriz:
fuente
splice
llamada es realmente costosa en navegadores antiguos porque tienen que renumerar todas las claves de la matriz para cerrar la brecha.Array.prototype
usoObject.defineProperty
para hacer que la nueva función sea una propiedad no enumerable y luego evitar el impacto en el rendimiento causado al poner.hasOwnProperty
en cada bucle.Formas simples:
o - (solo para elementos de matriz única del tipo "texto")
o - Forma clásica: iteración simple
a través de jQuery:
ACTUALIZACIÓN: solo otra forma rápida y genial (usando ES6):
Eliminar valores vacíos
fuente
arr = arr.filter(function(n){return n; });
foo.join("").split("")
solo parece funcionar si las cadenas son caracteres individualesarr.filter(e=>e)
y esto se puede encadenar por mapa, reducir, etc.Si necesita eliminar TODOS los valores vacíos ("", nulo, indefinido y 0):
Para eliminar valores vacíos y saltos de línea:
Ejemplo:
Regreso:
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:
Regreso:
fuente
function(e){return !!e}
!!e
incluirá NaN (a diferencia de 0), mientrase
que whereous no lo haría (como 0).var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);
elimina indefinido, "" y 0Simplemente un revestimiento:
o usando underscorejs.org :
fuente
Boolean
funciona como una función ...Boolean
como una función, simplemente devolverátrue
ofalse
si el valor es verdadero / falso.(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))Si tiene Javascript 1.6 o posterior, puede usar
Array.filter
unareturn true
función de devolución de llamada trivial , por ejemplo:ya que
.filter
automá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
filter
que se puede usar en intérpretes de JavaScript que no admiten la versión oficial.Tenga en cuenta que esto no eliminará
null
entradas ni entradas con unundefined
valor explícito , pero el OP solicitó específicamente entradas "faltantes".fuente
undefined
como su valor dado.Para eliminar agujeros, debe usar
Para eliminar los valores de agujero y falso (nulo, indefinido, 0, -0, NaN, "", falso, document.all):
Para eliminar agujeros, nulos e indefinidos:
fuente
[, ,]
arr.filter(x => x)
, JS verificará si x es verdadero o falso, es decirif (x)
, solo el valor de verdad se asignará a la nueva lista.La forma limpia de hacerlo.
fuente
undefined
; Esto básicamente elimina todos los valores falsos.ES6 simple
fuente
[1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
.Con subrayado / Lodash:
Caso de uso general:
Con envases vacíos:
Consulte la documentación de lodash para sin .
fuente
Sólo
ES6
y más reciente método versiones, suponga matriz es a continuación:Manera simple:
fuente
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:
fuente
@Alnitak
En realidad, Array.filter funciona en todos los navegadores si agrega algún código adicional. Vea abajo.
Este es el código que necesita agregar para IE, pero el filtro y la programación funcional vale la pena.
fuente
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);
.fuente
ES6:
fuente
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:
En realidad, aquí hay una solución más genérica:
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 ...;)
fuente
¿Qué pasa con esto (ES6) ?: Para eliminar el valor Falsy de una matriz.
fuente
Debe usar filter para obtener una matriz sin elementos vacíos. Ejemplo en ES6
fuente
Simplemente estoy añadiendo mi voz a las anteriores “llamar ES5 de
Array..filter()
con un constructor mundial” golf-corte, pero se sugiere emplearObject
en lugar deString
,Boolean
oNumber
como se sugirió anteriormente.Específicamente, los ES5
filter()
ya no activanundefined
elementos dentro de la matriz; Por lo tanto, una función que devuelve universalmentetrue
, que devuelve todos losfilter()
aciertos de elementos , necesariamente devolverá noundefined
elementos:Sin embargo, escribir
...(function(){return true;})
es más largo que escribir...(Object)
; y el valor de retorno delObject
constructor 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,Object
es una abreviatura defunction(){return true}
.fuente
someArray.filter(String);
es decir, en realidad es equivalente asomeArray.filter(function(x){ return String(x); });
. Si desea eliminar todos los valores falsossomeArray.filter(Boolean);
funciona para eliminar 0, -0, NaN, falso '', nulo e indefinido.Object
constructor en lugar delreturn true
método. @robocat, el OP solicitó que se eliminen los elementos vacíos, no los nulos.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.
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
fuente
["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123
Reemplazando esa función. .. con String, irónicamente, deja números pero daría el mismo resultado en su matriz dada.fuente
¿Qué hay de eso?
fuente
join() === join(',')
:)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)
fuente
for ... in
que realmente provoca la omisión de elementos faltantes. La pruebaundefined
solo sirve para eliminar elementos reales que se establecen explícitamente en ese valor.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:
fuente
arr.filter(e => e)
.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.devoluciones
fuente
'Uso indebido' del bucle for ... in (objeto-miembro). => Solo los valores verdaderos aparecen en el cuerpo del bucle.
fuente
for ... in
es lo que elimina las claves indefinidas de la matriz, pero en realidad no hay ningún código aquí para aceptar solo valores "verdaderos"Esto podría ayudarlo: https://lodash.com/docs/4.17.4#remove
fuente
Salida:
Eliminará el elemento vacío de la matriz y mostrará otro elemento.
fuente
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:
Compactación simple (eliminación de elementos vacíos de una matriz)
Con ES6:
Con Javascript simple ->
fuente
Filtrar entradas no válidas con una expresión regular
fuente
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 compatibilidadArray.prototype.filter()
en estos navegadores:fuente