Jak napisać odpowiednik C # String.StartsWith
w JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Uwaga: jest to stare pytanie i jak wskazano w komentarzach ECMAScript 2015 (ES6) wprowadził tę .startsWith
metodę. Jednak w momencie pisania tej aktualizacji (2015 r.) Obsługa przeglądarki jest daleka od ukończenia .
źródło
Inna alternatywa z
.lastIndexOf
:To wygląda do tyłu
haystack
o wystąpieniuneedle
począwszy od wskaźnika0
zhaystack
. Innymi słowy, sprawdza tylko, czyhaystack
zaczyna się odneedle
.Zasadniczo powinno to mieć przewagę wydajności w stosunku do niektórych innych podejść:
haystack
.źródło
"aba".lastIndexOf ("a")
ma 2, jak"aba".lastIndexOf ("a", 0)
źródło
.lastIndexOf(input, 0)
porównuje pierwsze N znaków, podczas gdy.substring(0, input.length) === input
liczy N, podciąga dane do długości N, a następnie porównuje te N znaków. O ile nie ma optymalizacji kodu, ta druga wersja nie może być szybsza od drugiej. Nie zrozumcie mnie źle, nigdy bym nie znalazł czegoś lepszego niż sugerowałeś. :)lastIndexOf
zaczęło się od indeksu 0, a nie do końca. Na początku mnie też to potknęło. Mimo to sprawdzanie, od czego zaczyna się ciąg, jest tak częstym zadaniem, że JavaScript naprawdę powinien mieć do tego odpowiedni interfejs API, a nie wszystkie idiomy i alternatywy, które widzisz na tej stronie, choć są one sprytne.Bez funkcji pomocniczej, wystarczy użyć
.test
metody regex :Aby to zrobić za pomocą ciągu dynamicznego zamiast zakodowanego na stałe (zakładając, że ciąg nie będzie zawierał żadnych znaków kontrolnych wyrażenia regularnego):
Powinieneś sprawdzić Czy w JavaScript jest funkcja RegExp.escape? jeśli istnieje możliwość pojawienia się w ciągu znaków kontrolnych wyrażenia regularnego.
źródło
/^he/i
Najlepsze rozwiązanie:
A oto koniec: jeśli tego też potrzebujesz:
Dla tych, którzy wolą prototypować go w String:
Stosowanie:
Z metodą:
źródło
Chciałem tylko dodać swoją opinię na ten temat.
Myślę, że możemy po prostu użyć w ten sposób:
źródło
indexOf
przestanie przeszukiwać cały ciąg, gdy znajdzie pierwsze wystąpienie. Sprawdziłem to.Oto niewielka poprawa rozwiązania CMS:
Sprawdzanie, czy funkcja już istnieje, na wypadek, gdyby przyszła przeglądarka zaimplementowała ją w kodzie natywnym lub jeśli została zaimplementowana przez inną bibliotekę. Na przykład biblioteka prototypów już implementuje tę funkcję.
Korzystanie
!
jest nieco szybsze i bardziej zwięzłe niż=== 0
nie tak czytelne.źródło
String.prototype
jest to zły pomysł, ponieważ nie są nigdzie blisko zgodne ze specyfikacją dlaString.prototype.startsWith
. Każdy kod, który próbuje użyć metody ES6, może zawieść, jeśli to zrobisz; może wyglądać, czy metoda jest już zdefiniowana, czy jest (źle przez ciebie) i nie dodawać podkładki zgodnej ze specyfikacją, co później prowadzi do nieprawidłowego zachowania.Sprawdź także underscore.string.js . Zawiera wiele użytecznych metod testowania i manipulacji ciągami, w tym
startsWith
metodę. Z dokumentów:źródło
_.string.startsWith
Ostatnio zadałem sobie to samo pytanie.
Istnieje wiele możliwych rozwiązań, tutaj są 3 prawidłowe:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(dodał po obejrzeniu znak Byers męska odpowiedź )za pomocą pętli:
Nie spotkałem ostatniego rozwiązania, które wykorzystuje pętlę.
Nieoczekiwanie to rozwiązanie przewyższa pierwsze 3 o znaczny margines.
Oto test jsperf, który przeprowadziłem, aby dojść do tego wniosku: http://jsperf.com/startswith2/2
Pokój
ps: ecmascript 6 (harmonia) wprowadza natywną
startsWith
metodę ciągów.Pomyśl tylko, ile czasu by by zaoszczędzono, gdyby pomyśleli o włączeniu tej bardzo potrzebnej metody do samej początkowej wersji.
Aktualizacja
Jak zauważył Steve (pierwszy komentarz do tej odpowiedzi), powyższa funkcja niestandardowa zgłosi błąd, jeśli podany prefiks jest krótszy niż cały ciąg. Naprawił to i dodał optymalizację pętli, którą można obejrzeć na stronie http://jsperf.com/startswith2/4 .
Zauważ, że istnieją 2 optymalizacje pętli, które zawiera Steve, pierwsza z nich wykazała lepszą wydajność, dlatego opublikuję ten kod poniżej:
źródło
Ponieważ jest to tak popularne, myślę, że warto zauważyć, że istnieje implementacja tej metody w ECMA 6 i przygotowując się do tego, należy użyć „oficjalnej” polifill, aby zapobiec przyszłym problemom i łzom.
Na szczęście eksperci Mozilli zapewniają nam jeden:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Należy pamiętać, że ma to tę zaletę, że zostaje wdzięcznie zignorowane po przejściu na ECMA 6.
źródło
Najlepszym rozwiązaniem jest zaprzestanie używania wywołań bibliotecznych i po prostu rozpoznanie, że pracujesz z dwiema tablicami. Ręcznie wdrożona implementacja jest zarówno krótka, jak i szybsza niż każde inne rozwiązanie, jakie tu widziałem.
Dla porównania wydajności (sukces i porażka) zobacz http://jsperf.com/startswith2/4 . (Upewnij się, że sprawdziłeś późniejsze wersje, które mogły być atutem mojej).
źródło
Właśnie dowiedziałem się o tej bibliotece ciągów:
http://stringjs.com/
Dołącz plik js, a następnie użyj
S
zmiennej w następujący sposób:Można go również użyć w NodeJS, instalując go:
Wymagając go jako
S
zmiennej:Strona internetowa zawiera również linki do alternatywnych bibliotek ciągów, jeśli ta nie przypadnie Ci do gustu.
źródło
Zasadniczo potrzebowałem szybkiego sposobu na sprawdzenie, czy długa igła znajduje się w długim stogu siana i czy są bardzo podobne, z wyjątkiem ostatnich postaci.
Oto kod, który napisałem, który dla każdej funkcji (splice, podłańcuch, startWith itp.) Testuje zarówno, gdy zwracają wartość false i true względem ciągu stogu siana (
nestedString
) o wartości 1.000.0001 znaków oraz ciągu fałszywej lub prawdziwej igły 1.000.000 znaki (testParentStringFalse
itestParentStringTrue
odpowiednio):Ten test porównawczy przeprowadziłem w Chrome 75 , Firefox 67 , Safari 12 i Opera 62 .
Nie zawarłem Edge i IE, ponieważ nie mam ich na tym komputerze, ale jeśli ktoś z was chce uruchomić skrypt przeciwko Edge i przynajmniej IE 9 i udostępnić wyniki tutaj, byłbym bardzo ciekawy, aby zobaczyć wyniki.
Pamiętaj tylko, że musisz odtworzyć 3 długie łańcuchy i zapisać skrypt w pliku, który następnie otworzysz w przeglądarce, ponieważ kopiowanie / wklejanie w konsoli przeglądarki zablokuje go, ponieważ długość każdego łańcucha wynosi> = 1.000.000).
Oto wyniki:
Chrome 75 (
substring
wygrywa):Firefox 67 (
indexOf
wygrywa):Safari 12 (
slice
wygrywa dla fałszywych wyników,startsWith
wygrywa dla prawdziwych wyników, również Safari jest najszybszym pod względem całkowitego czasu na wykonanie całego testu):Opera 62 (
substring
wygrywa. Wyniki są podobne do Chrome i nie jestem zaskoczony, ponieważ Opera oparta jest na Chromium i Blink):Okazuje się, że każda przeglądarka ma własne szczegóły implementacji (oprócz Opery, która jest oparta na Chromium i Blink Chrome).
Oczywiście można i należy wykonać dalsze testy z różnymi przypadkami użycia (np. Gdy igła jest naprawdę krótka w porównaniu do stogu siana, gdy stóg siana jest krótszy niż igła itp.), Ale w moim przypadku musiałem porównać bardzo długie struny i chciałem się tym tutaj podzielić.
źródło
źródło
W oparciu o odpowiedzi tutaj używam tej wersji, ponieważ wydaje się, że zapewnia najlepszą wydajność w oparciu o testy JSPerf (i jest funkcjonalnie kompletna, o ile mi wiadomo).
Zostało to oparte na opensWith2 stąd: http://jsperf.com/startswith2/6 . Dodałem małe ulepszenie w celu drobnego ulepszenia wydajności, i od tego czasu dodałem również sprawdzanie, czy łańcuch porównawczy jest zerowy lub niezdefiniowany, i przekonwertowałem go, aby dodać do prototypu ciągu przy użyciu techniki w odpowiedzi CMS.
Zauważ, że ta implementacja nie obsługuje parametru „pozycja”, który jest wymieniony na tej stronie Mozilla Developer Network , ale i tak nie wydaje się być częścią propozycji ECMAScript.
źródło
Nie jestem pewien co do javascript, ale w maszynopisie zrobiłem coś takiego
Myślę, że to też powinno działać na js. Mam nadzieję, że to pomoże!
źródło
Jeśli pracujesz
startsWith()
iendsWith()
musisz uważać na wiodące spacje. Oto kompletny przykład:źródło
startsWith()
iendsWith()
funkcjami musimy uważać na wiodące spacje . Nic więcej!Możesz także zwrócić wszystkich członków tablicy, które zaczynają się od ciągu, tworząc własny prototyp / rozszerzenie do prototypu tablicy, czyli
I aby go użyć:
źródło