¿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.

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


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!==''});

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;
  };
}

3
arr = arr.filter(v => v);

como se devuelve ves implicidad convertida en verdad


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];


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);

.replace(" ","").split(" ")"reemplace todos los espacios con nada, luego intente dividir en cada espacio"
Isaac

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.