Angenommen, ich habe eine Zeichenfolge Hello world
und muss das Zeichen bei Index 3 ersetzen. Wie kann ich ein Zeichen durch Angabe eines Index ersetzen?
var str = "hello world";
Ich brauche so etwas
str.replaceAt(0,"h");
javascript
string
replace
character-replacement
Santhosh
quelle
quelle
str[0] = 'x'
es keine Fehler zu werfen scheint, aber nicht den gewünschten Effekt hat!"use strict"
aktiviert ist:Uncaught TypeError: Cannot assign to read only property '0' of string 'hello world'
(zumindest in Webkit-Browsern)Antworten:
In JavaScript sind Zeichenfolgen unveränderlich . Das Beste, was Sie tun können, ist, eine neue Zeichenfolge mit dem geänderten Inhalt zu erstellen und die Variable zuzuweisen, die darauf verweist.
Sie müssen die
replaceAt()
Funktion selbst definieren :Und benutze es so:
quelle
replaceAt
In JavaScript gibt es keine Funktion. Mit dem folgenden Code können Sie jedes Zeichen in einer beliebigen Zeichenfolge an der angegebenen Position ersetzen:quelle
substr
Wird als Legacy-Funktion betrachtet und sollte nach Möglichkeit vermieden werden .Das kannst du nicht. Nehmen Sie die Zeichen vor und nach der Position und setzen Sie sie in eine neue Zeichenfolge:
quelle
String.prototype.substring
über zu verwendenString.prototype.substr
.Hier gibt es viele Antworten, und alle basieren auf zwei Methoden:
Persönlich würde ich diese beiden Methoden in verschiedenen Fällen anwenden. Lassen Sie mich erklären.
@FabioPhms: Ihre Methode war die, die ich ursprünglich verwendet habe, und ich hatte Angst, dass sie auf einer Zeichenfolge mit vielen Zeichen schlecht ist. Die Frage ist jedoch, was viele Charaktere sind. Ich habe es an 10 "Lorem Ipsum" -Absätzen getestet und es hat ein paar Millisekunden gedauert. Dann habe ich es an einer 10-mal größeren Saite getestet - es gab wirklich keinen großen Unterschied. Hm.
@vsync, @Cory Mawhorter: Ihre Kommentare sind eindeutig; Was ist jedoch wieder eine große Zeichenfolge? Ich bin damit einverstanden, dass für 32 ... 100kb die Leistung besser sein sollte und man für diese eine Operation der Zeichenersetzung eine Teilzeichenfolgenvariante verwenden sollte.
Aber was passiert, wenn ich einige Ersetzungen vornehmen muss?
Ich musste meine eigenen Tests durchführen, um zu beweisen, was in diesem Fall schneller ist. Angenommen, wir haben einen Algorithmus, der eine relativ kurze Zeichenfolge manipuliert, die aus 1000 Zeichen besteht. Wir erwarten, dass im Durchschnitt jedes Zeichen in dieser Zeichenfolge ~ 100 Mal ersetzt wird. Der Code zum Testen von so etwas lautet also:
Ich habe eine Geige dafür geschaffen, und sie ist hier . Es gibt zwei Tests, TEST1 (Teilzeichenfolge) und TEST2 (Array-Konvertierung).
Ergebnisse:
Es scheint, dass die Array-Konvertierung die Teilzeichenfolge um 2 Größenordnungen übertrifft! Also - was zur Hölle ist hier passiert ???
Was tatsächlich passiert, ist, dass alle Operationen in TEST2 auf dem Array selbst ausgeführt werden, wobei Zuweisungsausdrücke wie verwendet werden
strarr2[p] = n
. Die Zuweisung ist im Vergleich zur Teilzeichenfolge auf einer großen Zeichenfolge sehr schnell und es ist klar, dass sie gewinnen wird.Es geht also darum, das richtige Werkzeug für den Job auszuwählen. Nochmal.
quelle
Die Arbeit mit Vektoren ist normalerweise am effektivsten, um String zu kontaktieren.
Ich schlage folgende Funktion vor:
Führen Sie dieses Snippet aus:
quelle
Array.prototype.replace = function(index, val) { this[index] = val; return this; };
'word'.split('').replace(1, '0').join(''); // returns 'w0rd'
In Javascript sind Zeichenfolgen unveränderlich, so dass Sie so etwas tun müssen
So ersetzen Sie das Zeichen in x bei i durch 'h'
quelle
quelle
split
undjoin
Einzeiler mit String.replace mit Rückruf (keine Emoji-Unterstützung):
Erklärt:
quelle
Code-Snippet anzeigen
Diese Methode eignet sich für Zeichenfolgen mit kleiner Länge, kann jedoch für größeren Text langsam sein.
quelle
@CemKalyoncu: Danke für die tolle Antwort!
Ich habe es auch leicht angepasst, um es der Array.splice-Methode ähnlicher zu machen (und die Anmerkung von @Ates berücksichtigt):
quelle
Array.splice
Typfunktionalität überein .Dies funktioniert ähnlich wie
Array.splice
:quelle
Du könntest es versuchen
quelle
Wenn Sie Zeichen in Zeichenfolgen ersetzen möchten, sollten Sie veränderbare Zeichenfolgen erstellen. Dies sind im Wesentlichen Zeichenarrays. Sie könnten eine Fabrik erstellen:
Dann können Sie auf die Zeichen zugreifen und das gesamte Array wird in eine Zeichenfolge konvertiert, wenn es als Zeichenfolge verwendet wird:
quelle
Wenn wir die Antwort von Afanasii Kurakin verallgemeinern, haben wir:
Lassen Sie uns sowohl den regulären Ausdruck als auch die Ersetzungsfunktion erweitern und erklären:
Der reguläre Ausdruck
.
entspricht genau einem Zeichen. Damitg
passt es zu jedem Zeichen in einer for-Schleife. Diereplacer
Funktion wird sowohl mit dem Originalzeichen als auch mit dem Index aufgerufen, in dem sich das Zeichen in der Zeichenfolge befindet. Wir geben eine einfacheif
Erklärung ab, um festzustellen, ob wir entwederorigChar
oder zurückkehren werdennewChar
.quelle
Sie können den Zeichenfolgentyp um die Inset-Methode erweitern:
Dann können Sie die Funktion aufrufen:
quelle
Ich habe eine Funktion ausgeführt, die etwas Ähnliches wie das tut, was Sie fragen. Sie prüft, ob sich ein Zeichen in einer Zeichenfolge in einem Array nicht zulässiger Zeichen befindet, wenn es durch '' ersetzt wird.
quelle
Dies ist mit RegExp leicht zu erreichen!
quelle
Hier ist eine Version, die ich mir ausgedacht habe, wenn Sie Wörter oder einzelne Zeichen an ihrem Index in React / Javascript formatieren möchten.
Arbeitsbeispiel: https://codesandbox.io/s/ov7zxp9mjq
Und hier ist eine andere alternative Methode
Und ein anderer...
quelle
Ich weiß, dass dies alt ist, aber die Lösung funktioniert nicht für negative Indizes, daher füge ich einen Patch hinzu. hoffe es hilft jemandem
quelle
Nehmen wir an, Sie möchten den
Kth
Index (0-basierten Index) durch ersetzen'Z'
. Sie könntenRegex
dies verwenden.quelle
Sie können die folgende Funktion verwenden, um einen String zu ersetzen
Character
oderString
an einer bestimmten Position. Verwenden Sie dieString.prototype.replaceAllMatches()
Funktion, um alle folgenden Übereinstimmungsfälle zu ersetzen .Prüfung:
Ausgabe:
quelle
Hier ist meine Lösung mit dem ternären und Kartenoperator. Besser lesbares, wartbares Ende leichter zu verstehen, wenn Sie mich fragen.
Es geht mehr um es6 und Best Practices.
quelle
Die Methoden hier sind kompliziert. Ich würde es so machen:
Das ist so einfach wie es nur geht.
quelle