780 Stimmen

Wie kann ich ein Zeichen an einem bestimmten Index in JavaScript ersetzen?

Ich habe eine Zeichenkette, sagen wir mal Hello world und ich muss das Zeichen bei Index 3 ersetzen. Wie kann ich ein Zeichen durch Angabe eines Indexes ersetzen?

var str = "hello world";

Ich brauche etwas wie

str.replaceAt(0,"h");

846voto

Cem Kalyoncu Punkte 13357

In JavaScript sind Zeichenketten unveränderlich Das heißt, das Beste, was Sie tun können, ist eine neue Zeichenkette mit dem geänderten Inhalt zu erstellen und die Variable so zuzuweisen, dass sie darauf verweist.

Sie müssen die replaceAt() Funktion selbst:

String.prototype.replaceAt = function(index, replacement) {
    return this.substring(0, index) + replacement + this.substring(index + replacement.length);
}

Und verwenden Sie es so:

var hello = "Hello World";
alert(hello.replaceAt(2, "!!")); // He!!o World

164voto

rahul Punkte 179143

Es gibt keine replaceAt Funktion in JavaScript. Sie können den folgenden Code verwenden, um ein beliebiges Zeichen in einer beliebigen Zeichenfolge an einer bestimmten Position zu ersetzen:

function rep() {
    var str = 'Hello World';
    str = setCharAt(str,4,'a');
    alert(str);
}

function setCharAt(str,index,chr) {
    if(index > str.length-1) return str;
    return str.substring(0,index) + chr + str.substring(index+1);
}

<button onclick="rep();">click</button>

129voto

Guffa Punkte 663241

Das können Sie nicht. Nehmen Sie die Zeichen vor und nach der Position und fügen Sie sie zu einer neuen Zeichenfolge zusammen:

var s = "Hello world";
var index = 3;
s = s.substring(0, index) + 'x' + s.substring(index + 1);

81voto

colllin Punkte 8984
str = str.split('');
str[3] = 'h';
str = str.join('');

37voto

Hier gibt es viele Antworten, die alle auf zwei Methoden beruhen:

  • METHODE1: Aufteilung der Zeichenkette in zwei Teilstrings und Einfügen des Zeichens dazwischen
  • METHODE 2: Konvertieren der Zeichenkette in ein Zeichenarray, Ersetzen eines Array-Mitglieds und Zusammenfügen

Ich persönlich würde diese beiden Methoden in unterschiedlichen Fällen anwenden. Lassen Sie mich das erklären.

@FabioPhms: Deine Methode war diejenige, die ich ursprünglich verwendet habe, und ich hatte Angst, dass sie bei Strings mit vielen Zeichen schlecht ist. Die Frage ist jedoch, was ist eine Menge von Zeichen? Ich habe es mit 10 "lorem ipsum"-Absätzen getestet und es dauerte ein paar Millisekunden. Dann habe ich es mit einer 10-mal größeren Zeichenkette getestet - es gab wirklich keinen großen Unterschied. Hm.

@vsync, @Cory Mawhorter: Ihre Kommentare sind eindeutig; aber noch einmal: Was ist ein großer String? Ich stimme zu, dass für 32...100kb die Leistung besser sein sollte und man sollte substring-variant für diese eine Operation der Zeichenersetzung verwenden.

Aber was passiert, wenn ich eine ganze Reihe von Ersatzbeschaffungen vornehmen muss?

Ich musste meine eigenen Tests durchführen, um zu beweisen, was in diesem Fall schneller ist. Nehmen wir an, wir haben einen Algorithmus, der eine relativ kurze Zeichenkette mit 1000 Zeichen verarbeitet. Wir gehen davon aus, dass jedes Zeichen in dieser Zeichenfolge im Durchschnitt etwa 100 Mal ersetzt wird. Der Code, um so etwas zu testen, lautet also:

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*
}

Ich habe eine Fiddle dafür erstellt, und sie lautet aquí . Es gibt zwei Tests, TEST1 (Teilstring) und TEST2 (Array-Konvertierung).

Ergebnisse:

  • TEST1: 195ms
  • TEST2: 6ms

Es scheint, dass die Array-Konvertierung die Substring-Konvertierung um 2 Größenordnungen schlägt! Also - was zum Teufel ist hier passiert???

Was tatsächlich passiert, ist, dass alle Operationen in TEST2 auf dem Array selbst ausgeführt werden, indem ein Zuweisungsausdruck wie strarr2[p] = n . Assignment ist wirklich schnell im Vergleich zu substring auf eine große Zeichenfolge, und es ist klar, dass es zu gewinnen.

Es kommt also darauf an, das richtige Werkzeug für die jeweilige Aufgabe zu wählen. Noch einmal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X