¿Eliminar cadenas vacías de la matriz mientras se mantiene un registro sin bucle?

90

Esta pregunta se hizo aquí: elimine las cadenas vacías de la matriz mientras mantiene un registro de los índices con cadenas no vacías

Si nota lo dado como @Baz lo expuso;

"I", "am", "", "still", "here", "", "man"

"y a partir de esto deseo producir las siguientes dos matrices:"

"I", "am", "still", "here", "man"

Todas las respuestas a esta pregunta se refieren a una forma de bucle.

Mi pregunta: ¿Existe la posibilidad de eliminar todos los indexes empty string sin ningún bucle? ... ¿hay alguna otra alternativa además de iterar la matriz?

¿Pueden ser algunos regexo algunos de los jQueryque no somos conscientes?

Todas las respuestas o sugerencias son muy apreciadas.

Agarre universal
fuente

Respuestas:

323
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter documentación


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

Documentación de funciones de flecha

Isaac
fuente
3
Sé exactamente cómo te sientes, lo usé hace meses, soluciona muchos problemas pequeños
Isaac
14
Las personas de @DiegoPlentz que todavía están ejecutando IE8 van a tener muchos más problemas que simplemente eliminar espacios en blanco en una matriz ... Casi nunca considero admitir ese navegador en estos días
Isaac
Esto es lo más cercano array.filter(!!)que podemos obtener actualmente :)
james_womack
2
Todo el crédito por esta respuesta debe ir a stackoverflow.com/questions/16701319/…
Isaac
BooleanSería bueno recibir alguna explicación .
robsch
18
var newArray = oldArray.filter(function(v){return v!==''});
haithamahmed
fuente
Fácilmente la mejor respuesta. Hace exactamente lo que pide la pregunta. No elimina los valores cero.
Bryan
9

TENGA EN CUENTA: La documentación dice:

filteres una extensión JavaScript del estándar ECMA-262; como tal , puede no estar presente en otras implementaciones del estándar . Puede solucionar esto insertando el siguiente código al comienzo de sus scripts, lo que permite el uso del filtro en implementaciones de ECMA-262 que no lo admiten de forma nativa. Este algoritmo es exactamente el especificado en ECMA-262, 5ª edición, asumiendo que fn.call evalúa el valor original de Function.prototype.call, y que Array.prototype.push tiene su valor original.

Por lo tanto, para evitar algunos dolores de cabeza, es posible que deba agregar este código a su secuencia de comandos al principio .

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}
ErickMejor
fuente
3
arr = arr.filter(v => v);

como se devuelve ves implicidad convertida en verdad

haind
fuente
2

Si está usando jQuery, grep puede ser útil:


var arr = [ a, b, c, , e, f, , g, h ];

arr = jQuery.grep(arr, function(n){ return (n); });

arr es ahora [ a, b, c, d, e, f, g];

sansid1983
fuente
2
jquery parece un montón de volumen para una tarea de baja categoría
Isaac
0

es decir, necesitamos tomar varias direcciones de correo electrónico separadas por comas, espacios o una nueva línea como se muestra a continuación.

    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);
Atif Hussain
fuente
.replace(" ","").split(" ")"reemplace todos los espacios con nada, luego intente dividir en cada espacio"
Isaac