Pregunta endsCon en JavaScript


¿Cómo puedo verificar si una cadena termina con un personaje en particular en JavaScript?

Ejemplo: tengo una cadena

var str = "mystring#";

Quiero saber si esa cadena está terminando con #. ¿Cómo puedo verificarlo?

  1. Hay un endsWith() método en JavaScript?

  2. Una solución que tengo es tomar la longitud de la cadena y obtener el último carácter y verificarlo.

¿Es esta la mejor manera o hay alguna otra manera?


1014
2017-11-11 11:15


origen


Respuestas:


ACTUALIZACIÓN (24 de noviembre de 2015):

Esta respuesta se publicó originalmente en el año 2010 (SEIS años atrás). Por favor, tome nota de estos comentarios perspicaces:


RESPUESTA ORIGINAL:

Sé que esta es una pregunta de hace un año ... pero también necesito esto y necesito que funcione en todos los navegadores, así que ... combinando la respuesta y los comentarios de todos y simplificándolo un poco:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • No crea una subcadena
  • Usa nativo indexOf función para resultados más rápidos
  • Omita las comparaciones innecesarias usando el segundo parámetro de indexOf saltear adelante
  • Funciona en Internet Explorer
  • NO complicaciones Regex

Además, si no te gusta rellenar elementos en los prototipos de la estructura de datos nativa, aquí hay una versión independiente:

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

EDITAR: Tal como lo señaló @hamish en los comentarios, si quiere equivocarse y comprobar si ya se ha proporcionado una implementación, puede agregar una typeof marque como sigue:

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}

1703
2018-03-30 19:40



/#$/.test(str)

funcionará en todos los navegadores, no requiere el parche del mono Stringy no requiere escanear toda la cadena como lastIndexOf lo hace cuando no hay coincidencia.

Si desea hacer coincidir una cadena constante que pueda contener caracteres especiales de expresiones regulares, como '$', entonces puedes usar lo siguiente:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

y luego puedes usarlo así

makeSuffixRegExp("a[complicated]*suffix*").test(str)

285
2018-03-24 20:32



  1. Lamentablemente no.
  2. if( "mystring#".substr(-1) === "#" ) {}

82
2017-11-11 11:20



Vamos, este es el correcto endsWith implementación:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

utilizando lastIndexOf solo crea bucles de CPU innecesarios si no hay coincidencia.


66
2017-09-27 08:34



Esta versión evita crear una subcadena y no usa expresiones regulares (algunas respuestas de expresiones regulares aquí funcionarán, mientras que otras están rotas):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

Si el rendimiento es importante para usted, valdría la pena probar si lastIndexOf es realmente más rápido que crear una subcadena o no. (Puede depender del motor JS que esté usando ...) Puede ser más rápido en el caso correspondiente, y cuando el hilo es pequeño, pero cuando el hilo es enorme necesita mirar hacia atrás todo el asunto, incluso aunque realmente no nos importa :(

Para verificar un solo carácter, encontrar la longitud y luego usar charAt es probablemente la mejor manera.


55
2017-11-11 11:58



No he visto un apporach con slice método. Así que solo lo dejo aquí:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}

23
2018-06-09 07:17



return this.lastIndexOf(str) + str.length == this.length;

no funciona en el caso donde la longitud original de la cadena es una menos que la longitud de la cadena de búsqueda y la cadena de búsqueda no se encuentra:

lastIndexOf devuelve -1, luego agregas la longitud de la cadena de búsqueda y te queda la longitud de la cadena original.

Una posible solución es

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length

17
2018-03-04 15:58



De developer.mozilla.org String.prototype.endsWith ()

Resumen

los endsWith() El método determina si una cadena termina con los caracteres de otra cadena, y devuelve verdadero o falso según corresponda.

Sintaxis

str.endsWith(searchString [, position]);

Parámetros

  • cadena de búsqueda : Los personajes que se buscarán al final de esta cadena.

  • posición : Busque dentro de esta cadena como si esta cadena fuera solo así de larga; se predetermina a la longitud real de esta cuerda, sujeta dentro del rango establecido por la longitud de esta cuerda.

Descripción

Este método le permite determinar si una cadena termina con otra cadena.

Ejemplos

var str = "To be, or not to be, that is the question.";

alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

Presupuesto

Especificación del lenguaje ECMAScript 6ta edición (ECMA-262)

Compatibilidad del navegador

Browser compatibility


13
2018-03-05 14:57