Jak mogę wstawić ciąg pod określony indeks innego ciągu?
var txt1 = "foo baz"
Załóżmy, że chcę wstawić „pasek” po „foo”, jak mogę to osiągnąć?
Myślałem o tym substring()
, ale musi istnieć prostszy, bardziej bezpośredni sposób.
javascript
string
Jiew Meng
źródło
źródło
Odpowiedzi:
Możesz stworzyć własny
splice()
ciąg w String.Polyfill
Przykład
EDYCJA: Zmodyfikowano, aby zapewnić, że
rem
jest to wartość bezwzględna.źródło
slice
rozwiązanie jest lepsze i prostsze. (Splot jest destrukcyjny, plasterek nie, i lepiej unikać modyfikowania „obiektów, których nie znasz”). To rozwiązanie absolutnie nie powinno być pierwszą widoczną odpowiedzią, nawet jeśli w tamtym czasie mogło mieć sens.my_array[my_array.length] = item
zamiast tegomy_array.push(item)
?splice
w tej sprawie; rzeczywiście ciągi są niezmienne. Z tego powodu myślę, żesplice
jest to zły wybór słów kluczowych. Moje główne zastrzeżenie dotyczy arbitralnego rozszerzenia prototypów, chyba że są to standardowe opakowania wielokrotne.Wstawianie do określonego indeksu (zamiast, powiedzmy, pierwszego znaku spacji), musi używać odcinania / podciągania łańcucha:
źródło
substring
byłoby dobrze tutaj.slice
Ogólnie wolę, ponieważ jest bardziej elastyczny (np"foo baz".slice(1, -2)
. Wskaźniki ujemne ). Jest również nieco krótszy, dla tego, co jest warte.`${txt1.slice(0,3)}bar${txt1.slice(3)}`
delete
funkcji opisanej powyżej; najlepsza odpowiedź ...Oto metoda, którą napisałem, która zachowuje się jak wszystkie inne języki programowania:
Odniesienie:
źródło
{}
do bloków if-else.else
jest zbędne.Po prostu wykonaj następującą funkcję:
a następnie użyj go w ten sposób:
Wyjście: foo bar baz
Zachowuje się dokładnie tak, jak C # (Sharp) String.Insert (int startIndex, wartość ciągu).
UWAGA: Ta funkcja wstawiania wstawia wartość ciągu (trzeci parametr) przed określonym indeksem całkowitym (drugi parametr) w ciągu str (pierwszy parametr), a następnie zwraca nowy ciąg bez zmiany str !
źródło
AKTUALIZACJA 2016: Oto kolejna funkcja prototypowa dla zabawy (ale poważniejszej!) Oparta na
RegExp
podejściu jednowierszowym (z obsługą przedpłaconąundefined
lub ujemnąindex
):Poprzednie (powrót do 2012 r.) Rozwiązanie „ tylko dla zabawy” :
źródło
Jeśli ktoś szuka sposobu na wstawienie tekstu w wielu indeksach w ciągu, wypróbuj to:
Na przykład możesz użyć tego, aby wstawić
<span>
tagi w określonych przesunięciach w ciągu:źródło
6: "<span>"
mówi: w indeksie 6 wstaw tekst „<span>”. Czy mówisz, że chcesz użyć wartości zmiennej całkowitej jako indeksu wstawiania? W takim przypadku spróbuj czegoś takiegovar a=6, text = {}; text[a] = "<span>";
Zasadniczo robi to, co robi @ Bass33, z wyjątkiem tego, że daję również opcję użycia indeksu ujemnego do liczenia od końca. Coś w rodzaju metody substr pozwala.
Przypadek użycia: powiedzmy, że masz obrazy w pełnym rozmiarze przy użyciu konwencji nazewnictwa, ale nie możesz zaktualizować danych, aby podać także adresy URL miniatur.
źródło
Biorąc pod uwagę twój obecny przykład, możesz osiągnąć wynik przez jedno z nich
lub
ale biorąc pod uwagę, że możesz przyjąć takie założenia, równie dobrze możesz przejść bezpośrednio do przykładu Gullena.
W sytuacji, w której naprawdę nie możesz przyjąć żadnych innych założeń niż oparte na indeksie znaków, naprawdę wybrałbym rozwiązanie dla substringu.
źródło
https://jsfiddle.net/gaby_de_wilde/wz69nw9k/
źródło
Wiem, że to stary wątek, ale tutaj jest naprawdę skuteczne podejście.
Wspaniałe jest to, że wymusza zawartość węzła. Więc jeśli ten węzeł był już w DOM, nie musiałbyś używać żadnych selektorów zapytań ani aktualizować tekstu wewnętrznego. Zmiany odzwierciedlą się ze względu na jego wiążące.
Jeśli potrzebujesz łańcucha, po prostu uzyskaj dostęp do właściwości treści tekstowej węzła.
źródło
Możemy użyć zarówno metody substring, jak i slice.
Jedynym problemem metody podciągowej jest to, że nie będzie działać z indeksem ujemnym. Zawsze pobiera indeks ciągu od 0 pozycji.
źródło
Tak więc dla ciebie byłoby
insertString("foo baz", "bar", 3);
Oczywiście byłaby to farba do użycia, ponieważ musisz za każdym razem dostarczać ciąg znaków do funkcji, ale w tej chwili nie wiem, jak zrobić z tego coś łatwiejszego
string.replace(insertion, place)
. Pomysł wciąż jednak istnieje.źródło
Możesz używać wyrażeń regularnych z dynamicznym wzorem.
wyjścia:
Zastępuje to
text.length
białe znaki na początku łańcuchaoutput
. TeRegExp
środki^\
- początek linii\s
dowolny biały znak spacji, powtarzające{n}
razy, w tym przypadkutext.length
. Służy\\
do\
unikania ukośników odwrotnych podczas budowania tego rodzaju wzorów z ciągów.źródło
innym rozwiązaniem, wytnij sznurek na 2 i umieść sznur między.
źródło
Możesz to zrobić z regexp w jednym wierszu kodu
„Hello Lovely RegExp!”
źródło
Za pomocą plasterka
Możesz użyć
slice(0,index) + str + slice(index)
. Lub możesz stworzyć dla niego metodę.Metoda łączenia ciągów
Możesz
split()
główny ciąg i dodać, a następnie użyć normalnegosplice()
Stosowanie splice () przy wielu indeksach
Metoda przyjmuje tablicę tablic, każdy element tablicy reprezentuje pojedynczy
splice()
.źródło
Chciałem porównać metodę z użyciem podłańcucha i metodę z użyciem wycinka odpowiednio z Base33 i user113716, aby to zrobić, napisałem trochę kodu
zobacz także porównanie wydajności, podciąg, plasterek
Użyty przeze mnie kod tworzy ogromne łańcuchy i wstawia „pasek” łańcucha wiele razy w ogromny łańcuch
Ogólna różnica w wydajności jest w najlepszym razie marginalna i obie metody działają dobrze (nawet na strunach o długości ~ ~ 12000000)
źródło
Korzyści z tego podejścia są dwojakie:
źródło