Tutaj jest wiele odpowiedzi i wszystkie oparte są na dwóch metodach:
- METODA 1: podziel ciąg przy użyciu dwóch podciągów i umieść między nimi znak
- METODA2: przekonwertuj ciąg na tablicę znaków, zamień jeden element tablicy i dołącz do niego
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:
var str = "... {A LARGE STRING HERE} ...";
for(var i=0; i<100000; i++)
{
var n = '' + Math.floor(Math.random() * 10);
var p = Math.floor(Math.random() * 1000);
// replace character *n* on position *p*
}
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.
str[0] = 'x'
wydaje się, że nie powoduje żadnych błędów, ale nie ma pożądanego efektu!