Überprüfen Sie, ob die Zeichenfolge mit etwas beginnt? [duplicate]
Lesezeit: 5 Minuten
n00b0101
Ich weiß, dass ich das kann ^= um zu sehen, ob eine ID mit etwas beginnt, und ich habe versucht, das dafür zu verwenden, aber es hat nicht funktioniert. Im Grunde rufe ich eine URL ab und möchte eine Klasse für ein Element für Pfadnamen festlegen, die auf eine bestimmte Weise beginnen.
Beispiel:
var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087
Ich möchte sicherstellen, dass für jeden Pfad, der mit beginnt /sub/1kann ich eine Klasse für ein Element festlegen:
if (pathname ^= '/sub/1') { //this didn't work...
...
/^\/sub\/1.*$/gi.test(pathname) gibt einen booleschen Wert als Prädikat zurück.
– Abfahrtski
23. Juni 2016 um 14:12 Uhr
Wenn Sie 6 Jahre später (als ich) hierher kommen, bietet der ursprüngliche und duplizierte Post Javascript StartsWith eine sehr ordentliche Antwort, indem er die Ecmascript 6 startWith() Funktion verwendet, die die beste Leistung zu haben scheint.
– die Freiheitsbanane
22. September 2016 um 7:36 Uhr
Oder Ausarbeitung von sehr detaillierten Diskussionen über Leistung und Thou shall not modify Objects not owned! – so etwas vielleicht? if (pathname.indexOf('/sub/1') === 0) {//Do.}
if (pathname.substring(0, 6) == "/sub/1") {
// ...
}
-1: erzeugt einen zusätzlichen, redundanten String.
– Benutzer1071136
17. Januar 2013 um 19:57 Uhr
Hier ist ein Testfall dafür: jsperf.com/starts-with/2 . Die Substring-Methode scheint auf meiner Maschine (mit V8) die schnellste zu sein.
– Pijusn
20. Juli 2013 um 19:34 Uhr
Dies kann so generischer gemacht werden: var x = "/sub/1"; if (pathname.substring(0, x.length) === x) { // ... };. Auf diese Weise sind Sie nicht mehr darauf angewiesen, die Länge zu kennen x wie es sich ändern kann.
– Benutzer843337
12. Juli 2015 um 11:34 Uhr
erstellt eine neue Zeichenfolge, daher ist es nicht ideal. Die beste Methode ist wahrscheinlich die Verwendung von charAt, wenn charAt selbst keine neue Zeichenfolge erstellt 🙂
– Martijn Scheffer
20. Juli 2016 um 16:23 Uhr
Ich würde sagen, dass es erwähnenswert ist, dass es eine Zeichenfolge erstellt, aber ich denke nicht, dass es sich lohnt, abzustimmen, da es nicht viele eindeutig bessere Alternativen gibt, und ich würde wetten, dass dies in den meisten Fällen die Erstellung einer redundanten Zeichenfolge ist wird kein Problem sein, über das man sich Sorgen machen sollte.
-1 Siehe Kommentare hier für einen triftigen Grund, diese Art der Implementierung nicht zu verwenden: stackoverflow.com/a/1978419/560287
– Johannes Magnolie
30. März 2013 um 23:46 Uhr
Dies ist die perfekte Antwort (indexOf thing) als diejenige, die als Antwort markiert ist.
– Dilhan Jayathilake
7. August 2013 um 0:05 Uhr
Im Falle von falsehängt die Leistung dieser Funktion von der Länge der Zeichenfolge ab, die Sie überprüfen möchten, was für diesen Anwendungsfall nicht erwartet wird
– Daniel Alder
29. Dezember 2014 um 22:03 Uhr
Meiner Meinung nach nicht die einzig richtige, aber die richtigste Antwort in Bezug auf Speicherverbrauch und Geschwindigkeit. Und es ist auch lesbar, aber denken Sie daran, keine Objekte zu ändern, die Sie nicht besitzen (oder versuchen Sie einfach, dies zu vermeiden).
– Florian Leitgeb
29. Juni 2015 um 13:19 Uhr
Dies ist der langsame Weg, der Vergleich wird über die gesamte Zeichenfolge fortgesetzt. Ich würde dies nicht verwenden, wenn diese Methode häufig aufgerufen wird.
– Martijn Scheffer
20. Juli 2016 um 16:23 Uhr
Kreuz
Sie können verwenden string.match() und auch dafür einen regulären Ausdruck:
if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes
string.match() gibt andernfalls ein Array übereinstimmender Teilstrings zurück, falls gefunden Null.
Gibt es eine Möglichkeit, eine URL-Zeichenfolge dynamisch in den Ausdruck einzufügen? zB Escapezeichen für die /’s in der URL?
– Tjorriemorrie
11. Juli 2013 um 13:04 Uhr
@Tjorriemorrie Sie können die RegEx-Klasse verwenden, um dies zu erreichen, wie var reUrlTester = new RegEx(your_url_string); if(reUrlTester.test(url)) { // Verwenden Sie die Testfunktion, um zu sehen, ob die URL übereinstimmt.
– Kreuz
5. August 2013 um 11:02 Uhr
@Cros Err, du hast dort einen Tippfehler gemacht, die Klasse ist eigentlich “RegExp”, also sollte das sein: var matcher = new RegExp(expected);if(matcher.test(actual)){ return true }
– Kzqai
19. Dezember 2014 um 18:37 Uhr
Das funktioniert zwar, aber vermeiden Sie die Verwendung von RegEx, wenn dies nicht unbedingt erforderlich ist. Es ist einfach eine Tatsache, dass RegEx-Funktionen langsamer sind als ihre äquivalenten wörtlichen Zeichenfolgenfunktionen. Tatsächlich so viel langsamer, dass einige offizielle Dokumentations-Websites Ihnen tatsächlich sagen, dass Sie es nach Möglichkeit vermeiden sollen (ich denke, php.net tut dies zum Beispiel). Ich würde die Lösungen indexOf() oder substr() empfehlen.
Lassen Sie uns zunächst das Zeichenfolgenobjekt erweitern. Dank Ricardo Peres für den Prototypen denke ich, dass die Verwendung der Variablen „string“ besser funktioniert als „needle“, um sie lesbarer zu machen.
String.prototype.beginsWith = function (string) {
return(this.indexOf(string) === 0);
};
Dann benutzt du es so. Vorsicht! Macht den Code extrem lesbar.
var pathname = window.location.pathname;
if (pathname.beginsWith('/sub/1')) {
// Do stuff here
}
Nicht wirklich etwas hinzuzufügen.
– ratbum
11. September 2013 um 8:48 Uhr
meiner bescheidenen Meinung nach Index von durchsucht die gesamte Zeichenfolge, wenn am Anfang keine unmittelbare Übereinstimmung gefunden wird: Daher wächst seine Ineffizienz für sehr lange Zeichenfolgen, in denen gesucht werden kann.
meiner bescheidenen Meinung nach Index von durchsucht die gesamte Zeichenfolge, wenn am Anfang keine unmittelbare Übereinstimmung gefunden wird: Daher wächst seine Ineffizienz für sehr lange Zeichenfolgen, in denen gesucht werden kann.
– willy wonka
8. April 2017 um 0:14 Uhr
13125100cookie-checkÜberprüfen Sie, ob die Zeichenfolge mit etwas beginnt? [duplicate]yes
/^\/sub\/1.*$/gi.test(pathname)
gibt einen booleschen Wert als Prädikat zurück.– Abfahrtski
23. Juni 2016 um 14:12 Uhr
Wenn Sie 6 Jahre später (als ich) hierher kommen, bietet der ursprüngliche und duplizierte Post Javascript StartsWith eine sehr ordentliche Antwort, indem er die Ecmascript 6 startWith() Funktion verwendet, die die beste Leistung zu haben scheint.
– die Freiheitsbanane
22. September 2016 um 7:36 Uhr
Oder Ausarbeitung von sehr detaillierten Diskussionen über Leistung und
Thou shall not modify Objects not owned!
– so etwas vielleicht?if (pathname.indexOf('/sub/1') === 0) {//Do.}
– Der Zinger
14. November 2018 um 14:21 Uhr