2008-10-13 13 views
38

La pregunta lo dice todo; JS no parece tener un método nativo trim().¿Cuál es la mejor manera de recortar() en javascript

+0

Gracias por todas las grandes respuestas. No creo que haya una sola respuesta que sea significativamente mejor que todas las demás, así que ¿puedo dejar que la democracia decida en lugar de "Aceptar la respuesta"? – MDCore

+1

La democracia decidirá por conteo de votos, pero igual puede seleccionar la que usó al final como la respuesta a su problema; son dos conceptos ligeramente diferentes. –

+0

@jdk Buen punto. Hecho. – MDCore

Respuesta

15

sé que esta pregunta es antigua pero ahora, Javascript en realidad no tienen un .trim nativa()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

+1

¡Tienes razón! Nativo siempre es mejor. Es solo desde IE9 en adelante, pero en pocos años tampoco importará mucho. – MDCore

+0

@MDCore gracias por aceptar mi respuesta y mencionar la versión mínima de IE. Pero a qué se refiere cuando dice que no importará en unos años, ¿está diciendo que el javascript se volverá obsoleto? –

+1

@KR Así que hice esta pregunta hace cinco años y medio. Desde entonces, trim() se ha convertido en una función estándar. Consideré simplemente señalar que estamos * casi * allí en términos de soporte de IE, pero en otros cinco años y medio eso será discutible. Prefiero que la gente use las funciones nativas y use una de las muchas otras respuestas si están atrapadas con IE8. – MDCore

30

acuerdo con this page el mejor enfoque versátil es

return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 

Por supuesto, si usted está usando jQuery, se le proporcionará un método de ajuste optimizado.

+4

\ s \ s * es redundante. – eyelidlessness

+0

Según la página vinculada, la única diferencia entre \ s + y \ s \ s * es que este último es un poco más rápido. – Pat

+1

Si continúa leyendo, el trim11 modificado mencionado al final del artículo es un mejor método para cadenas más largas. –

1

La respuesta a tantas preguntas JavaScript: jQuery

$j.trim(string) 



Nota: lo anterior supone que su jQuery ha sido configurado con:

<script type="text/javascript">$j = jQuery.noConflict();</script> 

que es mucho más sensible que "$ ", y mucho menos detallado que escribir" jQuery "cada vez.

+0

El objeto jQuery. Mucho más sensato que solo usar $.

+1

¿Por qué '$ j' es más sensible que' $ '? – Ben

7

Una versión un poco más pequeña de @ Pat's.

return str.replace(/^\s+|\s+$/g, ''); 
+0

Creo que necesita ejecutar eso en el texto en su llamada al método. ;) –

6

Para ltrim, sustituir los espacios anclados en el inicio de la cadena con nada:

str2 = str.replace(/^\s+/,''); 

Para rtrim, sustituir los espacios anclados al final de la cadena sin nada:

str2 = str.replace(/\s+$/,''); 

Para el ajuste:

str2 = str.replace(/^\s+|\s+$/g,''); 

Todos estos usan expresiones regulares para hacer el trabajo real.

8

Como un par de otros ya han señalado, generalmente es mejor hacer este tipo de cosas mediante el uso de una biblioteca JS de terceros. No es que trim() sea una función complicada para crear usted mismo, pero hay tantas funciones que no son nativas de JavaScript que pueda necesitar y se escriba usted mismo al final, pronto se vuelve más rentable utilizar una biblioteca.

Por supuesto, otra ventaja del uso de una biblioteca JS es que los autores hacen un gran esfuerzo para garantizar que las funciones funcionen en todos los navegadores principales, de modo que pueda codificar a una interfaz estándar y olvidarse de las irritantes diferencias Internet Explorer y todos los otros navegadores.

0

En realidad, con jQuery esto parece ser cierto:

jQuery.trim(string) 

(Reference)

41

La forma más corta para jQuery:

string = $.trim(string); 

Link

18

Bueno, como muchos de las personas siempre dice, la función de ajuste funciona bastante bien , pero si no desea utilizar un marco completo solo para realizar un ajuste, puede ser útil echarle un vistazo a su implementación.Así que aquí está:

function(text) { return (text || "").replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, "");} 

Las principales ventajas que veo en esta implementación, en comparación con otra solución ya que aquí se propone son:

  • La bandera 'g' que le permite perfom un ajuste en una cadena multilínea
  • La sintaxis (texto || "") que asegura que la función siempre funcionará, incluso si el argumento pasado es nulo o indefinido.
+0

mejor respuesta aquí –

+0

La bandera 'g' no tiene uso aquí sin la bandera' m'. –

1

Microsoft .NET también tiene la función String.trim como parte de JavaScript Base Type Extensions. Se podría usar si está codificando la aplicación ASP.NET.

+0

buen punto alexander! –

5

¿Por qué no modificas el prototipo de cadena? ¿Por qué no robar la función de recorte de una biblioteca de código abierto, como hice aquí con YUI? (¿Usted realmente necesita para cargar y toda marco para este sencillo TAKS?) Póngalos juntos y se obtiene lo siguiente:

String.prototype.trim = function() { 
    try { 
     return this.replace(/^\s+|\s+$/g, ""); 
    } catch(e) { 
     return this; 
    } 
} 

var s = " hello "; 
alert(s.trim() == "hello"); // displays true 
1

utilizo este.

String.prototype.trim = function() { 
     return this.replace(/^\s+|\s+$/g,""); 
    } 
5

Uso Ariel Flesler's fast trim function:

// Licensed under BSD 
function myBestTrim(str){ 
var start = -1, 
    end = str.length; 
while(str.charCodeAt(--end) < 33); 
while(str.charCodeAt(++start) < 33); 
return str.slice(start, end + 1); 
}; 

Mi solución, sin embargo, sería esto (porque el objeto String en Firefox 3.5 o superior ya tiene un trim method):

String.prototype.trim = String.prototype.trim || function() { 
    var start = -1, 
     end = this.length; 

    while(this.charCodeAt(--end) < 33); 
    while(this.charCodeAt(++start) < 33); 

    return this.slice(start, end + 1); 
}; 
+0

¿Estás bromeando? no puede ser rápido, ya que usa toneladas de funciones dentro de – Jasper

0

usar esto:

Trabajar con funciones.

function trim($) { 
       return (typeof $ == "function" ? $() : $).replace(/[\s]*/g,"") 
     } 

     code example: 

     trim((function(){ return "a b"})) // ab 

     trim(" a b") //ab 
0

permite utilizar las siguientes ...

function trim(str) { 
    try { 
     if (str && typeof(str) == 'string') { 
      return str.replace(/^\s*|\s*$/g, ""); 
     } else { 
      return ''; 
     } 
    } catch (e) { 
     return str; 
    } 
} 
4

Hice una velocidad-función de cortar en mente. Esta función supera claramente a los 24 competidores (de los cuales muchos usan expresiones regulares) y también a native string.trim() de Chrome y Chromium (!) Y realiza tan rápido como el ajuste de Safari(). Los resultados de los exámenes aquí: http://jsperf.com/mega-trim-test/7

function trim27(str) { 
    var c; 
    for (var i = 0; i < str.length; i++) { 
    c = str.charCodeAt(i); 
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12) 
    continue; else break; 
    } 
    for (var j = str.length - 1; j >= i; j--) { 
    c = str.charCodeAt(j); 
    if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12) 
    continue; else break; 
    } 
    return str.substring(i, j + 1); 
} 

La función recorta caracteres "\ n \ \ t \ f r", pero es fácil de añadir más espacios en blanco caracteres, por ejemplo. aquellos que regexp usan como espacios en blanco (s) con solo un rendimiento menor perdido (vea http://jsperf.com/mega-trim-test/8).

Editar: El trim27 anterior() recorta sólo los caracteres más comunes ("\ n \ r \ t \ f"), pero para recortar todos los espacios en blanco posibles, que incluyen a continuación un nuevo mytrim función():

if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1) 
    var mytrim = function(str) { 
     var c; 
     for (var i = 0; i < str.length; i++) { 
      c = str.charCodeAt(i); 
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279) 
      continue; else break; 
     } 
     for (var j = str.length - 1; j >= i; j--) { 
      c = str.charCodeAt(j); 
      if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279) 
      continue; else break; 
     } 
     return str.substring(i, j + 1); 
    }; 
    else var mytrim = function(str) { 
     return str.trim(); 
    } 

usarlo de esta manera:

var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed" 

el mytrim anteriormente() hace lo siguiente:

  • Vestiduras 26 espacios en blanco diferentes (todos de 2 5 espacios en blanco mencionados en http://perfectionkills.com/whitespace-deviations/ y, adicionalmente, uFEFF, que es ESPACIO SIN ANCHO DE ANCHURA CERO.
  • Hace que los resultados de recorte sean uniformes en todos los navegadores.
  • Utiliza ajuste nativo() si está disponible Y tiene la capacidad de recortar los 27 espacios en blanco diferentes. La excepción es Chrome y Chromium, que tienen un ajuste nativo tan lento() que, en lugar de nativos, usamos nuestro ajuste personalizado.
  • Y LO MÁS IMPORTANTE: No es hermoso y no es corto, pero ES CLARAMENTE MÁS RÁPIDO que cualquiera de las 24 alternativas competitivas en http://jsperf.com/mega-trim-test/12 (excepción: bastante viejo Firefox 3.6.25 en Windows 7 ejecuta mytrim() bastante lentamente por razones desconocidas)
0

Probablemente este no sea el más rápido, y podría violar lo que ".trim()" probablemente debería ser, pero no me gustan los RegExs (principalmente porque toma mucho tiempo descubrir lo que realmente significan/do) y me gusta tener algo que sé que funcionará independientemente de si tengo jQuery o no (sin mencionar la versión correcta, ya que probé $ .trim (myVar) con jQuery 1.4.2 y no funciona), y se librará de todos los espacios adicionales, no sólo al final, la reconstrucción de las cosas como debe ser:

function Trim(obj) { 
    var coll = ""; 
    var arrObj = obj.split(' '); 

    for (var i=0;i<arrObj.length;i++) { 
     if (arrObj[i] == "") { 
      arrObj.splice(i,1); // removes array indices containing spaces 
     } 
    } 
    //alert(arrObj.length); // should be equal to the number of words 
    // Rebuilds with spaces in-between words, but without spaces at the end 
    for (var i=0;i<arrObj.length;i++) { 
     if (arrObj[i] != "" && i != arrObj.length-1) 
      coll += arrObj[i] + " "; 
     if (arrObj[i] != "" && i == arrObj.length-1) 
      coll += arrObj[i]; 
    } 

    return coll; 
} 
0

Esta es una vieja pregunta, pero ninguna de estas funcionó para mí. Solo necesitaba recortar el espacio en blanco inicial y final y esto es lo que hice. Mi etiqueta div tenía una id = fecha de inicio.

$("#start-date").text().trim() 
1

yo uso esto con JavaScript nativo

// Adding trim function to String object if its not there 
if(typeof String.prototype.trim !== 'function') { 
    String.prototype.trim = function() { 
    return this.replace(/^\s+|\s+$/g, ''); 
    } 
} 

uso como éste

var myString = "     some text     "; 

alert(myString.trim()); 
Cuestiones relacionadas