Naprawdę, prawie tak, jak mówi tytuł.Ograniczanie czasów rozdzielania .split(), zamiast obcinania wynikowej tablicy
Powiedzmy, że masz ten ciąg:
var theString = "a=b=c=d";
Teraz, po uruchomieniu theString.split("=")
wynik jest ["a", "b", "c", "d"]
jak oczekiwano. I oczywiście po uruchomieniu theString.split("=", 2)
otrzymujesz ["a", "b"]
, który po przeczytaniu the MDN page for String#split()
ma sens dla mnie.
Jednak zachowanie szukam jest bardziej jak Java String#split()
: Zamiast budować tablicę normalnie, po czym zwracając pierwszy n elementy, buduje tablicę pierwszej n-1 zapałki, potem dodaje wszystkie pozostałe znaki jako ostatni element tablicy. Aby uzyskać lepszy opis, patrz: the relevant docs.
Jak mogę uzyskać ten efekt w JavaScript?
Szukam odpowiedzi z najlepszą wydajnością, która działa tak, jak implementacja Java, choć rzeczywisty sposób działania może być inny.
Podpisałbym moją próbę, ale nie wiem, jak to napisać.
Czy możesz dodać szybkie wyjaśnienie, jak to działa? –
@QPaysTaxes I iterować "limit" liczbę razy, i na każdej iteracji używam stateful regex, aby znaleźć następne wystąpienie znaku podziału. Regex pamięta, gdzie znajdował się jego ostatni mecz, a po jego wykonaniu wiem, gdzie jest następny mecz. Dodaję wycinek łańcucha między tymi dwoma lokalizacjami w każdej iteracji. Poza pętlą dodam fragment łańcucha między ostatnim dopasowaniem wyrażenia regularnego i końcem ciągu. –
A ponieważ OP pytał o wydajność - ta implementacja jest około dwa razy szybsza (w Chrome) niż dwie pozostałe. Zaskoczyło mnie! –