¿Dividir cadena por espacios en blanco, sin elementos vacíos?

39

Estoy tratando de explotar una cadena usando javascript para elegir términos de búsqueda, separados por espacios en blanco. Sin embargo, obtengo elementos de matriz vacíos si un término de búsqueda finaliza con un espacio en blanco, como se muestra a continuación.

¿Qué debo hacer en su lugar para evitar el posprocesamiento de esta matriz y la eliminación de elementos vacíos?

var str = "searchterm1 searchterm2";
console.log(str.split(" ")); // ["searchterm1", "searchterm2"]

var strb = "searchterm1 "; // Note the ending whitespace
console.log(strb.split(" ")); // ["searchterm1", ""]
1
  • con respecto a esta vieja pregunta. simplemente agrega .filter(e => e)al final de la división, para eliminar los elementos vacíos. esto es típico cuando se divide en líneas nuevas.
    Fattie
    10 de agosto a las 13:08
67

Simplemente puede hacer coincidir todas las secuencias de caracteres que no sean espacios:

str.match(/[^ ]+/g)
1
  • 13
    Si puede haber pestañas o nuevas líneas, puede hacer coincidir / \ S + / g. 4 feb 12 a las 16:00
38

No importa qué divisor, esto siempre funciona:

str.split(' ').filter(function(i){return i})
// With ES6
str.split(' ').filter(i => i)

La lógica del filtro también puede cambiar en algunos otros casos.

3
  • ¿Sabes por qué funciona esto? La documentación dice que el filter()método crea una nueva matriz con todos los elementos que pasan la prueba implementada por la función proporcionada. En este caso, los elementos vacíos parecen ser ignorados por este método y, por lo tanto, no están en la matriz resultante. No entiendo por qué esta prueba no se realiza para elementos vacíos.
    Frébo
    12/10/2016 a las 6:05
  • 7
    La respuesta es simple, si tiene más de un carácter de espacio, tendrá una cadena vacía ('') en sus resultados, y debido a que if('')es falso, el filterfiltro de función los elimina en el resultado final. 13/10/2016 a las 8:24
  • Si desea que su función de filtro devuelva un valor booleano en lugar de una cadena (aunque sorprendentemente esto no es un problema, incluso con Typecript), también puede hacerlo str.split(' ').filter(Boolean) 28 abr a las 6:19
2

Esto es un poco antiguo, pero para fines de documentación también hay otra forma ordenada.

someString.filter(Boolean);

// Example
['fds', '', 'aaaaa', 'AA', 'ffDs', "", 'd'].filter(Boolean);
// Output
["fds", "aaaaa", "AA", "ffDs", "d"]
1

Agregar función:

//Some browsers support trim so we check for that first
if(!String.prototype.trim) {  
  String.prototype.trim = function () {  
    return this.replace(/^\s+|\s+$/g,'');  
  };  
}

Luego llame a recortar en la cuerda:

var strb = "searchterm1 "; // Note the ending whitespace
console.log(strb.trim().split(" ")); // ["searchterm1"]
2
  • 1
    ¿Qué hay de varios espacios intermedios como "foo\x20\x20bar"?
    Gumbo
    4 feb 12 a las 16:09
  • @Gumbo str.trim().split(/ +/g)
    ggorlen
    20/12/20 a las 22:26
1

Si desea una función que pueda usar, simplemente extienda String:

 String.prototype.splitNoSpaces = function(){
     return this.split(' ').filter(function(i){return i});
 };

 //Now use it!
 var classString = "class1    class2 class3    class4";
 var classArray = classString.splitNoSpaces();

 //classArray[0] is class1
 //classArray[1] is class2
 //classArray[2] is class3
 //classArray[3] is class4

Gracias a @ user1079877 por la pista