Wie würde ich das Äquivalent von C # String.StartsWith
in JavaScript schreiben ?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Hinweis: Dies ist eine alte Frage, und wie in den Kommentaren ausgeführt, wurde ECMAScript 2015 (ES6) die .startsWith
Methode eingeführt. Zum Zeitpunkt des Schreibens dieses Updates (2015) ist die Browserunterstützung jedoch noch lange nicht abgeschlossen .
quelle
Eine andere Alternative mit
.lastIndexOf
:Dies sieht rückwärts
haystack
nach einem Auftretenneedle
aus, das mit dem Index0
von beginnthaystack
. Mit anderen Worten, es wird nur geprüft, ob mithaystack
beginntneedle
.Im Prinzip sollte dies Leistungsvorteile gegenüber einigen anderen Ansätzen haben:
haystack
.quelle
"aba".lastIndexOf ("a")
2 ist, wie Sie hervorheben , aber"aba".lastIndexOf ("a", 0)
0 ist, was richtig istquelle
.lastIndexOf(input, 0)
vergleicht die ersten N Zeichen, während die.substring(0, input.length) === input
Zählwerte N, Teilketten die Daten auf N Länge und vergleicht dann diese N Zeichen. Ohne zweite Codeoptimierung kann diese zweite Version nicht schneller sein als die andere. Versteh mich nicht falsch, ich würde niemals etwas Besseres finden, als du vorgeschlagen hast. :)lastIndexOf
bei Index 0 beginnt und nicht am Ende. Das hat mich anfangs auch gestolpert. Das Überprüfen, mit was eine Zeichenfolge beginnt, ist jedoch eine so häufige Aufgabe, dass JavaScript wirklich eine geeignete API dafür haben sollte, nicht alle Redewendungen und Alternativen, die Sie auf dieser Seite sehen, wie clever sie auch sein mögen.Verwenden Sie ohne Hilfsfunktion nur die
.test
Methode von regex :Um dies mit einer dynamischen Zeichenfolge anstelle einer fest codierten Zeichenfolge zu tun (vorausgesetzt, die Zeichenfolge enthält keine regulären Ausdruckssteuerzeichen):
Sie sollten auschecken Gibt es eine RegExp.escape-Funktion in Javascript? Wenn die Möglichkeit besteht, dass Regexp-Steuerzeichen in der Zeichenfolge angezeigt werden.
quelle
/^he/i
Beste Lösung:
Und hier endet es, wenn Sie das auch brauchen:
Für diejenigen, die es vorziehen, einen Prototyp in String zu erstellen:
Verwendungszweck:
Mit Methode:
quelle
Ich wollte nur meine Meinung dazu hinzufügen.
Ich denke, wir können einfach so verwenden:
quelle
indexOf
, die Suche nach der gesamten Zeichenfolge wird beendet, wenn sie zum ersten Mal auftritt. Ich habe es überprüft.Hier ist eine kleine Verbesserung der CMS-Lösung:
Überprüfen, ob die Funktion bereits vorhanden ist, falls ein zukünftiger Browser sie in nativem Code implementiert oder von einer anderen Bibliothek implementiert wird. Beispielsweise implementiert die Prototypbibliothek diese Funktion bereits.
Die Verwendung
!
ist etwas schneller und prägnanter als=== 0
nicht so lesbar.quelle
String.prototype
ist eine schlechte Idee, da es nicht annähernd der Spezifikation für entsprichtString.prototype.startsWith
. Jeder Code, der versucht, die ES6-Methode zu verwenden, kann in diesem Fall fehlschlagen. Möglicherweise wird geprüft, ob die Methode bereits definiert ist, ob sie (schlecht von Ihnen) vorliegt, und es wird kein spezifikationskonformer Shim hinzugefügt, was später zu falschem Verhalten führt.Schauen Sie sich auch underscore.string.js an . Es enthält eine Reihe nützlicher Methoden zum Testen und Bearbeiten von Zeichenfolgen, einschließlich einer
startsWith
Methode. Aus den Dokumenten:quelle
_.string.startsWith
Ich habe mir kürzlich die gleiche Frage gestellt.
Es gibt mehrere mögliche Lösungen, hier sind 3 gültige:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(hinzugefügt, nachdem Mark Byers ' Antwort gesehen wurde )mit einer Schleife:
Ich bin nicht auf die letzte Lösung gestoßen, die eine Schleife verwendet.
Überraschenderweise übertrifft diese Lösung die ersten 3 deutlich.
Hier ist der jsperf-Test, den ich durchgeführt habe, um zu dieser Schlussfolgerung zu gelangen: http://jsperf.com/startswith2/2
Frieden
ps: ecmascript 6 (Harmonie) führt eine native
startsWith
Methode für Zeichenfolgen ein.Stellen Sie sich vor, wie viel Zeit gespart worden wäre, wenn sie daran gedacht hätten, diese dringend benötigte Methode in die ursprüngliche Version selbst aufzunehmen.
Aktualisieren
Wie Steve betonte (der erste Kommentar zu dieser Antwort), wird die obige benutzerdefinierte Funktion einen Fehler auslösen, wenn das angegebene Präfix kürzer als die gesamte Zeichenfolge ist. Er hat das behoben und eine Schleifenoptimierung hinzugefügt, die unter http://jsperf.com/startswith2/4 eingesehen werden kann .
Beachten Sie, dass es zwei Schleifenoptimierungen gibt, die Steve aufgenommen hat. Die erste der beiden zeigte eine bessere Leistung. Daher werde ich diesen Code unten veröffentlichen:
quelle
Da dies so beliebt ist, sollte darauf hingewiesen werden, dass es eine Implementierung für diese Methode in ECMA 6 gibt. In Vorbereitung darauf sollte die „offizielle“ Polyfüllung verwendet werden, um zukünftige Probleme und Tränen zu vermeiden.
Zum Glück stellen uns die Experten von Mozilla eines zur Verfügung:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Bitte beachten Sie, dass dies den Vorteil hat, dass es beim Übergang zu ECMA 6 ordnungsgemäß ignoriert wird.
quelle
Die beste Lösung besteht darin, die Verwendung von Bibliotheksaufrufen zu beenden und nur zu erkennen, dass Sie mit zwei Arrays arbeiten. Eine handgerollte Implementierung ist sowohl kurz als auch schneller als jede andere Lösung, die ich hier gesehen habe.
Leistungsvergleiche (Erfolg und Misserfolg) finden Sie unter http://jsperf.com/startswith2/4 . (Stellen Sie sicher, dass Sie nach späteren Versionen suchen, die meine möglicherweise übertrumpft haben.)
quelle
Ich habe gerade von dieser String-Bibliothek erfahren:
http://stringjs.com/
Fügen Sie die js-Datei ein und verwenden Sie die
S
Variable wie folgt :Es kann auch in NodeJS verwendet werden, indem es installiert wird:
Dann benötigen Sie es als
S
Variable:Die Webseite enthält auch Links zu alternativen Zeichenfolgenbibliotheken, falls Sie dies nicht möchten.
quelle
Ich brauchte im Grunde einen schnellen Weg, um herauszufinden, ob sich eine lange Nadel in einem langen Heuhaufen befindet und sie bis auf die letzten Zeichen sehr ähnlich sind.
Hier ist der Code, den ich geschrieben habe und der für jede Funktion (Spleiß, Teilzeichenfolge, StartsWith usw.) beide Tests durchführt, wenn sie falsch und wahr gegen eine Heuhaufenzeichenfolge (
nestedString
) mit 1.000.0001 Zeichen und eine falsche oder wahrheitsgemäße Nadelzeichenfolge mit 1.000.000 Zeichen zurückgeben Zeichen (testParentStringFalse
undtestParentStringTrue
sind):Ich habe diesen Benchmark-Test auf Chrome 75 , Firefox 67 , Safari 12 und Opera 62 durchgeführt .
Ich habe Edge und IE nicht eingeschlossen, weil ich sie nicht auf diesem Computer habe, aber wenn jemand von Ihnen das Skript gegen Edge und mindestens IE 9 ausführen und die Ausgabe hier teilen möchte, wäre ich sehr gespannt auf die Ergebnisse.
Denken Sie daran, dass Sie die 3 langen Zeichenfolgen neu erstellen und das Skript in einer Datei speichern müssen, die Sie dann in Ihrem Browser öffnen, da das Kopieren / Einfügen auf der Browserkonsole es blockiert, da die Länge jeder Zeichenfolge> = 1.000.000 ist.
Hier sind die Ausgänge:
Chrome 75 (
substring
gewinnt):Firefox 67 (
indexOf
gewinnt):Safari 12 (
slice
gewinnt für falsche Ergebnisse,startsWith
gewinnt für echte Ergebnisse, auch Safari ist die schnellste Zeit in Bezug auf die Gesamtzeit, um den gesamten Test auszuführen):Opera 62 (
substring
gewinnt. Die Ergebnisse ähneln Chrome und ich bin nicht überrascht, da Opera auf Chromium und Blink basiert):Es stellt sich heraus, dass jeder Browser seine eigenen Implementierungsdetails hat (abgesehen von Opera, das auf Chrome Chromium und Blink basiert).
Natürlich könnten und sollten weitere Tests mit verschiedenen Anwendungsfällen durchgeführt werden (z. B. wenn die Nadel im Vergleich zum Heuhaufen wirklich kurz ist, wenn der Heuhaufen kürzer als die Nadel ist usw.), aber in meinem Fall musste ich sehr lange Saiten und vergleichen wollte es hier teilen.
quelle
quelle
Basierend auf den Antworten hier ist dies die Version, die ich jetzt verwende, da sie die beste Leistung basierend auf JSPerf-Tests zu bieten scheint (und soweit ich das beurteilen kann, funktional vollständig ist).
Dies basierte auf StartsWith2 von hier: http://jsperf.com/startswith2/6 . Ich habe eine kleine Optimierung für eine kleine Leistungsverbesserung hinzugefügt und seitdem auch eine Überprüfung hinzugefügt, ob die Vergleichszeichenfolge null oder undefiniert ist, und sie konvertiert, um sie mithilfe der in der CMS-Antwort verwendeten Technik zum String-Prototyp hinzuzufügen.
Beachten Sie, dass diese Implementierung den auf dieser Mozilla Developer Network- Seite erwähnten Parameter "position" nicht unterstützt , der jedoch ohnehin nicht Teil des ECMAScript-Vorschlags zu sein scheint.
quelle
Ich bin mir nicht sicher für Javascript, aber in Typoskript habe ich so etwas gemacht
Ich denke, es sollte auch auf js funktionieren. Ich hoffe, es hilft!
quelle
Wenn Sie mit arbeiten
startsWith()
undendsWith()
dann müssen Sie vorsichtig sein, wenn Sie Leerzeichen führen. Hier ist ein vollständiges Beispiel:quelle
startsWith()
undendsWith()
Funktionen vorsichtig mit führenden Räumen umgehen müssen. Nichts anderes!Sie können auch alle Mitglieder eines Arrays zurückgeben, die mit einer Zeichenfolge beginnen, indem Sie einen eigenen Prototyp / eine eigene Erweiterung für den Array-Prototyp erstellen, auch bekannt als
Und um es zu benutzen:
quelle