2009-11-19 13 views
231

Duplicar posibles:
Javascript StartsWithVerifica si la cadena comienza con algo?

Sé que puedo hacer como^= a ver si hay una identificación comienza por algo, y trató de usar que para esto, pero él didn' t trabajo ... Básicamente, estoy recuperando la url y quiero establecer una clase de un elemento para nombres de rutas que parten de una determinada manera ...

Así,

var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087 

quiero para asegurarse de que para cada ruta que comienza con/sub/1, puedo configurar una clase para un elemento ...

if(pathname ^= '/sub/1') { //this didn't work... 
     ... 
+0

'/^\/sub \/1. * $/Gi.test (ruta)' devolverá un booleano como predicado. –

+1

Si vienes aquí 6 años después (como yo), la [publicación original y duplicada Javascript StartsWith] (http://stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith- otra cadena) proporciona una respuesta muy clara, utilizando Ecmascript 6 startWith() función, que parece tener las mejores actuaciones. – theFreedomBanana

Respuesta

341

Uso stringObject.substring

if (pathname.substring(0, 6) == "/sub/1") { 
    // ... 
} 
+15

-1: crea una cadena redundante adicional. – user1071136

+9

Aquí hay un caso de prueba para esto: http://jsperf.com/starts-with/2. El método de subcadena parece ser el más rápido en mi máquina (con V8). – Pijusn

+19

Esto se puede hacer más genérico como así: 'var x ="/sub/1 "; if (rutaname.substring (0, x.length) === x) { // ... }; '. De esta manera ya no depende de saber la longitud de 'x', ya que puede cambiar. –

79

Puede utilizar string.match() y una expresión regular para esto también:

if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes 

string.match() será devolver una matriz de subcadenas coincidentes si se encuentra, de lo contrario nula.

+22

+1 para no tener que especificar la longitud de la cadena de búsqueda – Mercurybullet

+0

¿Hay alguna manera? insertar dinámicamente una cadena url en el expr? p.ej. ¿escapando el/'s en la url? – Tjorriemorrie

+1

@Tjorriemorrie Puede usar la clase RegEx para lograr esto, como var reUrlTester = new RegEx (your_url_string); if (reUrlTester.test (url)) {// usa la función de prueba para ver si la url coincide. – Cros

34

Un poco más de la función reutilizable:

beginsWith = function(needle, haystack){ 
    return (haystack.substr(0, needle.length) == needle); 
} 
170
String.prototype.startsWith = function(needle) 
{ 
    return this.indexOf(needle) === 0; 
}; 
+9

-1 ver comentarios aquí para una razón válida para no usar este tipo de implementación: http: // stackoverflow.com/a/1978419/560287 –

+12

+1 indexOf es perfecto! Solo sugiero que no agregue métodos a objetos que no le pertenecen. – collimarco

+1

Esta es la respuesta perfecta (índice de la cosa) que la que está marcada como la respuesta. –

22

En primer lugar, permite ampliar el objeto de cadena. Gracias a Ricardo Peres por el prototipo, creo que usar la variable 'cadena' funciona mejor que 'aguja' en el contexto de hacerlo más legible.

String.prototype.beginsWith = function (string) { 
    return(this.indexOf(string) === 0); 
}; 

Luego lo usa así. ¡Precaución! Hace que el código sea extremadamente legible.

var pathname = window.location.pathname; 
if (pathname.beginsWith('/sub/1')) { 
    // Do stuff here 
} 
+4

Realmente no agrego nada. – ratbum

+0

En mi humilde opinión ** indexOf ** busca en toda la cadena si no encuentra una coincidencia inmediata en el comienzo: por lo tanto, su ineficacia aumenta con cadenas muy largas para buscar. –

Cuestiones relacionadas