JavaScript- oder jQuery-Zeichenfolge endet mit der Dienstprogrammfunktion

Antworten:

153

Sie könnten Regexps wie folgt verwenden:

str.match(/value$/)

Dies würde true zurückgeben, wenn der String am Ende 'value' ($) hat.

Wolkenkopf
quelle
1
Fehlertest: Wert = "Test [az]". Andernfalls: 'test [az]'. Match (/ [az] $ /) gibt "null" zurück
gmunkhbaatarmn
Normalerweise nehme ich das Regex-Tool nicht zuerst aus meiner Tasche, aber dies übertrifft alle Alternativen (String # endetWith wird nativ nur in Firefox unterstützt, und das Erweitern / Verwenden von Js von Drittanbietern ist etwas übertrieben)
Diclophis
1
match () gibt keinen Booleschen Wert zurück. 'foobar'.match (/ bar $ /) gibt ["bar"] zurück
Jonathan.Brink
1
RegEx Search () anstelle von Match () wäre eine bessere Option, wenn wir nur ein boolesches Ergebnis wünschen. Search () gibt -1 zurück, wenn keine gefunden wird. if (str.search (/ value $ /)! = -1) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
mitaka
39

Von Prototypen gestohlen:

String.prototype.endsWith = function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
};

'slaughter'.endsWith('laughter');
// -> true
Luca Matteis
quelle
5
Einige Leute glauben, dass das Modifizieren des Prototyps einer Kernklasse etwas ist, das Sie nicht tun sollten - Crockford bezeichnet dies in seinem Buch JavaScript: The Good Parts als "globale Reduzierung".
Walter Rumsby
4
Warum solltest du es nicht tun? Oder machst du es einfach nicht, weil Crockford es gesagt hat?
Luca Matteis
11
Sie sollten dies nicht tun, da nicht garantiert wird, dass es in allen Implementierungen von JS funktioniert: Die ECMAScript Compact Profile-Spezifikation (ECMA-327: ecma-international.org/publications/standards/Ecma-327.htm ) gibt an, dass "Compact "Implementierungen (z. B. auf Handheld-Geräten wie Telefonen) müssen dies nicht unterstützen (siehe Abschnitt 5.2). Selbst wenn Sie davon nicht betroffen sind, ist es durchaus möglich, dass neuere Versionen von JS beschädigt werden: Beispielsweise bricht jeder, der in der Vergangenheit Code bereitgestellt hat, der Array.prototype eine "forEach" -Methode hinzufügt, jetzt die native Implementierung in neueren Versionen von Firefox.
NickFitz
3
Wenn jemand String nicht ändern möchte, kann er ihn sehr einfach in eine eigenständige Funktion verwandeln.
Studgeek
9

Reguläre Ausdrücke

"Hello world".match(/world$/)
Chetan S.
quelle
5

Ich hatte kein Glück mit dem Match-Ansatz, aber das hat funktioniert:

Wenn Sie die Zeichenfolge haben, "Dies ist meine Zeichenfolge." und wollte sehen, ob es mit einem Punkt endet, tun Sie dies:

var myString = "This is my string.";
var stringCheck = ".";
var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
alert(foundIt);

Sie können die Variable stringCheck so ändern, dass sie eine beliebige Zeichenfolge ist, nach der gesucht werden soll. Besser noch wäre es, dies in deine eigene Funktion wie folgt zu werfen:

function DoesStringEndWith(myString, stringCheck)
{
    var foundIt = (myString.lastIndexOf(stringCheck) === myString.length - stringCheck.length) > 0;
    return foundIt;
}
theJerm
quelle
1
Wirklich schön, @theJerm. Dies funktionierte für mich in verschiedenen Situationen, während .match dies nicht immer tat.
Nathan
5

Das kannst du machen 'hello world'.slice(-5)==='world'. Funktioniert in allen Browsern. Viel schneller als Regex.

John Henckel
quelle
2

ES6 unterstützt dies direkt:

'this is dog'.endsWith('dog')  //true
Herr Goferito
quelle
1
Dies ist nützlich, wenn niemand mehr IE11 oder niedriger verwendet.
AntonChanning
Ja, aber dafür hast du Babel.
Herr Goferito
1

Ich erweitere nur das, was @ luca-matteis gepostet hat, aber um die in den Kommentaren genannten Probleme zu lösen, sollte der Code umbrochen werden, um sicherzustellen, dass Sie eine native Implementierung nicht überschreiben.

if ( !String.prototype.endsWith ) {  
    String.prototype.endsWith = function(pattern) {
        var d = this.length - pattern.length;
        return d >= 0 && this.lastIndexOf(pattern) === d;
    };
}

Dies ist die vorgeschlagene Methode für die Methode Array.prototype.forEach, auf die im Mozilla-Entwicklernetzwerk hingewiesen wird

Georgephillips
quelle
0

Sie können jederzeit einen Prototyp einer String-Klasse erstellen. Dies funktioniert:

String.prototype.endsWith = function (str) {return (this.match (str + "$") == str)}

Weitere verwandte Erweiterungen für die String-Klasse finden Sie unter http://www.tek-tips.com/faqs.cfm?fid=6620

Jaime Hablutzel
quelle
2
Dies schlägt fehl, wenn str spezielle reguläre Ausdruckszeichen enthält, z. B. "[ssss]".
Studgeek
Dies schlägt auch fehl, weil matchein Array zurückgegeben wird. Es müsste sein this.match(str+"$")[0]===str(und das könnte scheitern, wenn matchnichts gefunden wird - habe diesen nicht falsch getestet).
TLS