Mam ciąg, powiedzmy, Hello world
i muszę zastąpić znak w indeksie 3. Jak mogę zastąpić znak przez określenie indeksu?
var str = "hello world";
Potrzebuję czegoś takiego
str.replaceAt(0,"h");
javascript
string
replace
character-replacement
Santhosh
źródło
źródło
str[0] = 'x'
wydaje się, że nie powoduje żadnych błędów, ale nie ma pożądanego efektu!"use strict"
jest aktywowany:Uncaught TypeError: Cannot assign to read only property '0' of string 'hello world'
(przynajmniej w przeglądarkach internetowych)Odpowiedzi:
W JavaScript ciągi są niezmienne , co oznacza, że najlepiej, co możesz zrobić, to utworzyć nowy ciąg ze zmienioną zawartością i przypisać zmienną, która będzie do niego wskazywać.
Musisz samodzielnie zdefiniować
replaceAt()
funkcję:I użyj tego w ten sposób:
źródło
W
replaceAt
JavaScript nie ma żadnej funkcji. Możesz użyć następującego kodu, aby zastąpić dowolny znak w dowolnym ciągu w określonej pozycji:źródło
substr
jest uważana za starszą funkcję i należy jej unikać, gdy jest to możliwe .Nie możesz Weź znaki przed i po pozycji i konkatuj w nowy ciąg:
źródło
String.prototype.substring
ponadString.prototype.substr
.Tutaj jest wiele odpowiedzi i wszystkie oparte są na dwóch metodach:
Osobiście użyłbym tych dwóch metod w różnych przypadkach. Pozwól mi wyjaśnić.
@FabioPhms: Twoja metoda była tą, której początkowo użyłem, i bałam się, że źle działa na sznurku z dużą ilością znaków. Pytanie brzmi jednak, ile jest znaków? Przetestowałem go na 10 akapitach „lorem ipsum” i zajęło to kilka milisekund. Następnie przetestowałem go na 10-krotnie większym sznurku - naprawdę nie było dużej różnicy. Hm
@vsync, @Cory Mawhorter: Twoje komentarze są jednoznaczne; jednak, co to jest duży ciąg? Zgadzam się, że dla wydajności 32 ... 100 kb powinno być lepiej i należy użyć wariantu podłańcuchowego dla tej jednej operacji zamiany znaków.
Ale co się stanie, jeśli będę musiał zrobić sporo zamienników?
Musiałem przeprowadzić własne testy, aby udowodnić, co jest szybsze w tym przypadku. Powiedzmy, że mamy algorytm, który będzie manipulował stosunkowo krótkim łańcuchem, który składa się z 1000 znaków. Oczekujemy, że średnio każdy znak w tym ciągu zostanie zastąpiony ~ 100 razy. Tak więc kod do testowania czegoś takiego to:
Stworzyłem do tego skrzypce i już tu jest . Istnieją dwa testy, TEST1 (substring) i TEST2 (konwersja tablicy).
Wyniki:
Wygląda na to, że konwersja tablicy pokonuje podciąg o 2 rzędy wielkości! Więc - co tu się do cholery stało?
W rzeczywistości wszystkie operacje w TEST2 są wykonywane na samej tablicy, przy użyciu wyrażenia przypisania, takiego jak
strarr2[p] = n
. Przypisanie jest naprawdę szybkie w porównaniu z podciągiem na dużym sznurku i jasne, że wygra.Chodzi więc o wybranie odpowiedniego narzędzia do pracy. Jeszcze raz.
źródło
Praca z wektorami jest zwykle najskuteczniejsza w kontaktowaniu się z ciągiem znaków.
Proponuję następującą funkcję:
Uruchom ten fragment kodu:
źródło
Array.prototype.replace = function(index, val) { this[index] = val; return this; };
'word'.split('').replace(1, '0').join(''); // returns 'w0rd'
W JavaScript ciągi są niezmienne, więc musisz zrobić coś takiego
Aby zamienić znak w x at i na „h”
źródło
źródło
split
ijoin
Jednowarstwowy przy użyciu String.replace z oddzwanianiem (brak obsługi emoji):
Wyjaśnione:
źródło
Pokaż fragment kodu
Ta metoda jest dobra w przypadku ciągów o małej długości, ale może być powolna w przypadku większego tekstu.
źródło
@CemKalyoncu: Dzięki za świetną odpowiedź!
Zmodyfikowałem go również nieco, aby bardziej przypominał metodę Array.splice (i wziąłem pod uwagę uwagę @Ates):
źródło
Array.splice
funkcjonalnością typu.Działa to podobnie do
Array.splice
:źródło
Możesz spróbować
źródło
Jeśli chcesz zamienić znaki w łańcuchu, powinieneś utworzyć łańcuchy zmienne. Są to zasadniczo tablice znaków. Możesz stworzyć fabrykę:
Następnie możesz uzyskać dostęp do znaków, a cała tablica konwertuje się na ciąg znaków, gdy zostanie użyty jako ciąg:
źródło
Uogólniając odpowiedź Afanasii Kurakina, mamy:
Rozwińmy i wyjaśnijmy zarówno wyrażenie regularne, jak i funkcję zamiennika:
Wyrażenie regularne
.
pasuje dokładnie do jednego znaku. Tog
sprawia, że pasuje do każdego znaku w pętli for.replacer
Funkcja nazywana jest podana zarówno pierwotny charakter i gdzie indeks że postać jest w struny. Wykonujemy prosteif
stwierdzenie celu ustalenia, czy mamy zamiar wrócić alboorigChar
albonewChar
.źródło
Możesz rozszerzyć typ ciągu o metodę wstawki:
Następnie możesz wywołać funkcję:
źródło
Zrobiłem funkcję, która robi coś podobnego do tego, o co pytasz, sprawdza, czy znak w ciągu znajduje się w tablicy niedozwolonych znaków, jeśli zastępuje go znakiem „”
źródło
jest to łatwo osiągalne dzięki RegExp!
źródło
Oto wersja, którą wymyśliłem, jeśli chcesz stylizować słowa lub pojedyncze znaki według ich indeksu w reag / javascript.
Przykład roboczy: https://codesandbox.io/s/ov7zxp9mjq
A oto kolejna alternatywna metoda
I kolejny...
źródło
Wiem, że to stare, ale rozwiązanie nie działa dla indeksu ujemnego, więc dodałem do niego łatkę. mam nadzieję, że to komuś pomoże
źródło
Powiedzmy, że chcesz zastąpić
Kth
indeks (indeks oparty na 0) na'Z'
. Możesz toRegex
zrobić.źródło
Możesz użyć następującej funkcji do zamiany
Character
lubString
w określonej pozycji ciągu. Aby zastąpić wszystkie poniższe przypadki dopasowania, użyjString.prototype.replaceAllMatches()
funkcji.Test:
Wynik:
źródło
Oto moje rozwiązanie przy użyciu operatora trójskładnikowego i mapowego. Bardziej czytelny, łatwiejszy do utrzymania koniec łatwiejszy do zrozumienia, jeśli mnie o to poprosisz.
Bardziej dotyczy ES6 i najlepszych praktyk.
źródło
Metody tutaj są skomplikowane. Zrobiłbym to w ten sposób:
To jest tak proste, jak to możliwe.
źródło