¿Cómo escribiría el equivalente de C # String.StartsWith
en JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Nota: Esta es una vieja pregunta, y como se señaló en los comentarios ECMAScript 2015 (ES6) introdujo el .startsWith
método. Sin embargo, al momento de escribir esta actualización (2015) , el soporte del navegador está lejos de ser completo .
fuente
Otra alternativa con
.lastIndexOf
:Esto mira hacia atrás
haystack
para ver si ocurreneedle
desde el índice0
dehaystack
. En otras palabras, solo verifica sihaystack
comienza conneedle
.En principio, esto debería tener ventajas de rendimiento sobre otros enfoques:
haystack
.fuente
"aba".lastIndexOf ("a")
es 2 como señala, pero"aba".lastIndexOf ("a", 0)
es 0, lo cual es correctofuente
.lastIndexOf(input, 0)
compara los primeros N caracteres, mientras que.substring(0, input.length) === input
cuenta N, subcadena los datos a N longitud y luego compara esos N caracteres. A menos que haya optimización de código, esta segunda versión no puede ser más rápida que la otra. Sin embargo, no me malinterpretes, nunca encontraría algo mejor de lo que sugeriste. :)lastIndexOf
comenzado en el índice 0, no en el final. Eso también me hizo tropezar, inicialmente. Sin embargo, verificar con qué comienza una cadena es una tarea tan común que JavaScript realmente debería tener una API adecuada para ella, no todas las expresiones idiomáticas y alternativas que ve en esta página, por inteligentes que sean.Sin una función auxiliar, solo usando el
.test
método regex :Para hacer esto con una cadena dinámica en lugar de una codificada (suponiendo que la cadena no contendrá ningún carácter de control regexp):
Deberías consultar ¿Existe una función RegExp.escape en Javascript? si existe la posibilidad de que los caracteres de control regexp aparezcan en la cadena.
fuente
/^he/i
Mejor solución:
Y aquí está el final Con si lo necesitas también:
Para aquellos que prefieren crear un prototipo en String:
Uso:
Con método:
fuente
Solo quería agregar mi opinión sobre esto.
Creo que podemos usar así:
fuente
indexOf
que dejará de buscar una cadena completa cuando encuentre la primera ocurrencia. Lo he comprobadoAquí hay una pequeña mejora en la solución de CMS:
Comprobar si la función ya existe en caso de que un futuro navegador la implemente en código nativo o si es implementada por otra biblioteca. Por ejemplo, la Biblioteca de prototipos ya implementa esta función.
El uso
!
es un poco más rápido y más conciso que=== 0
aunque no tan legible.fuente
String.prototype
es una mala idea, ya que no llegan a acercarse al cumplimiento de la especificación paraString.prototype.startsWith
. Cualquier código que intente usar el método ES6 puede fallar si está haciendo esto; bien puede ver si el método ya está definido, ver si lo está (mal, por usted) y no agregar una cuña que cumpla con las especificaciones, lo que lleva a un comportamiento incorrecto más adelante.También echa un vistazo a underscore.string.js . Viene con un montón de métodos útiles de prueba y manipulación de cadenas, incluido un
startsWith
método. De los documentos:fuente
_.string.startsWith
Recientemente me hice la misma pregunta.
Hay varias soluciones posibles, aquí hay 3 válidas:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(agregado después de ver la respuesta de Mark Byers )usando un bucle:
No he encontrado la última solución que hace uso de un bucle.
Sorprendentemente, esta solución supera a los primeros 3 por un margen significativo.
Aquí está la prueba jsperf que realicé para llegar a esta conclusión: http://jsperf.com/startswith2/2
Paz
ps: ecmascript 6 (armonía) introduce un
startsWith
método nativo para cadenas.Solo piense cuánto tiempo se habría ahorrado si hubieran pensado incluir este método tan necesario en la versión inicial.
Actualizar
Como Steve señaló (el primer comentario sobre esta respuesta), la función personalizada anterior arrojará un error si el prefijo dado es más corto que toda la cadena. Lo arregló y agregó una optimización de bucle que se puede ver en http://jsperf.com/startswith2/4 .
Tenga en cuenta que hay 2 optimizaciones de bucle que Steve incluyó, la primera de las dos mostró un mejor rendimiento, por lo que publicaré ese código a continuación:
fuente
Dado que esto es tan popular, creo que vale la pena señalar que hay una implementación para este método en ECMA 6 y en preparación para eso se debe usar el polyfill 'oficial' para evitar futuros problemas y lágrimas.
Afortunadamente, los expertos de Mozilla nos proporcionan uno:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Tenga en cuenta que esto tiene la ventaja de ser ignorado con gracia en la transición a ECMA 6.
fuente
La mejor solución es dejar de usar las llamadas de la biblioteca y simplemente reconocer que está trabajando con dos matrices. Una implementación manual es corta y también más rápida que cualquier otra solución que he visto aquí.
Para las comparaciones de rendimiento (éxito y fracaso), consulte http://jsperf.com/startswith2/4 . (Asegúrese de verificar las versiones posteriores que pueden haber superado la mía).
fuente
Acabo de enterarme de esta biblioteca de cadenas:
http://stringjs.com/
Incluya el archivo js y luego use la
S
variable como esta:También se puede usar en NodeJS instalándolo:
Luego requiriéndolo como la
S
variable:La página web también tiene enlaces a bibliotecas de cadenas alternativas, si esta no te gusta.
fuente
Básicamente necesitaba una forma rápida de encontrar si una aguja larga está dentro de un pajar largo y son muy similares, excepto por los últimos caracteres.
Aquí está el código que he escrito que para cada función (empalme, subcadena, comienza con, etc.) prueba tanto cuando devuelven falso como verdadero contra una cadena de pajar (
nestedString
) de 1,000,0001 caracteres y una cadena de aguja falsa o verdadera de 1,000,000 caracteres (testParentStringFalse
ytestParentStringTrue
, respectivamente):Ejecuté esta prueba de referencia en Chrome 75 , Firefox 67 , Safari 12 y Opera 62 .
No he incluido Edge e IE porque no los tengo en esta máquina, pero si alguien de ustedes quiere ejecutar el script contra Edge y al menos IE 9 y compartir la salida aquí, me daría mucha curiosidad ver los resultados.
Solo recuerde que necesita volver a crear las 3 cadenas largas y guardar el script en un archivo que luego abre en su navegador, ya que copiar / pegar en la consola del navegador lo bloqueará ya que la longitud de cada cadena es> = 1,000,000).
Aquí están las salidas:
Chrome 75 (
substring
gana):Firefox 67 (
indexOf
gana):Safari 12 (
slice
gana por resultados falsos,startsWith
gana por resultados verdaderos, también Safari es el más rápido en términos de tiempo total para ejecutar la prueba completa):Opera 62 (
substring
gana. Los resultados son similares a los de Chrome y no me sorprende, ya que Opera se basa en Chromium y Blink):Resulta que cada navegador tiene sus propios detalles de implementación (aparte de Opera, que se basa en Chrome y Blink de Chrome).
Por supuesto, podría y debería realizarse una prueba adicional con diferentes casos de uso (por ejemplo, cuando la aguja es realmente corta en comparación con el pajar, cuando el pajar es más corto que la aguja, etc.), pero en mi caso necesitaba comparar cadenas muy largas y Quería compartirlo aquí.
fuente
fuente
Según las respuestas aquí, esta es la versión que estoy usando ahora, ya que parece ofrecer el mejor rendimiento basado en las pruebas de JSPerf (y es funcionalmente completo hasta donde puedo decir).
Esto se basó en beginWith2 desde aquí: http://jsperf.com/startswith2/6 . Agregué un pequeño ajuste para una pequeña mejora en el rendimiento, y desde entonces también agregué una verificación para que la cadena de comparación sea nula o indefinida, y la convertí para agregarla al prototipo de cadena usando la técnica en la respuesta de CMS.
Tenga en cuenta que esta implementación no es compatible con el parámetro "posición" que se menciona en esta página de la Red de desarrolladores de Mozilla , pero de todos modos no parece ser parte de la propuesta de ECMAScript.
fuente
No estoy seguro de JavaScript pero en mecanografiado hice algo como
Supongo que también debería funcionar en js. ¡Espero que ayude!
fuente
Si está trabajando
startsWith()
yendsWith()
debe tener cuidado con los espacios iniciales. Aquí hay un ejemplo completo:fuente
startsWith()
yendsWith()
funciones. ¡Nada más!También puede devolver todos los miembros de una matriz que comienzan con una cadena creando su propio prototipo / extensión al prototipo de matriz, también conocido como
Y para usarlo:
fuente