Frage

ich eine Zeichenfolge haben, lassen Sie uns sagen Hello world und ich brauche die Zeichen bei Index ersetzen 3. Wie kann ich ein Zeichen ersetzen durch einen Index Angabe?

var str = "hello world";

Ich brauche so etwas wie

str.replaceAt(0,"h");
War es hilfreich?

Lösung

In JavaScript-Strings sind unveränderlich , was bedeutet, das Beste, was Sie tun können, ist eine neue Zeichenfolge mit dem geänderten Inhalt erstellen, und weisen Sie die Variable, um es zu zeigen.

Sie müssen die replaceAt() Funktion selbst definieren:

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

Und es wie folgt verwendet werden:

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

Andere Tipps

Es gibt keine replaceAt Funktion in JavaScript. Sie können den folgenden Code verwenden alle Zeichen in jeder Zeichenfolge an 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.substr(0,index) + chr + str.substr(index+1);
}
<button onclick="rep();">click</button>

Sie können nicht. Nehmen Sie die Zeichen vor und nach der Position und Concat in eine neue Zeichenfolge:

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

Es gibt viele Antworten hier, und alle von ihnen sind auf zwei Methoden basieren:

  • Method1: teilen Sie die Zeichenfolge mit zwei Teil und stopfen den Charakter zwischen ihnen
  • Method2: die Zeichenfolge Zeichen-Array konvertieren, ersetzt ein Arraymitglied und verbindet es

Persönlich würde ich diese beiden Methoden in verschiedenen Fällen verwenden. Lassen Sie mich erklären.

@FabioPhms: Ihre Methode war der, den ich anfangs verwendet und ich hatte Angst, dass es auf String mit vielen Zeichen schlecht. Allerdings Frage ist, was eine Menge von Zeichen? Getestet habe ich es auf 10 „Lorem Ipsum“ Absätze und es dauerte ein paar Millisekunden. Dann testete ich es auf 10-mal größeren String - es gab wirklich keinen großen Unterschied. Hm.

@vsync, @Cory Mawhorter: Ihre Kommentare sind eindeutig; jedoch wieder, was ist eine große Zeichenfolge? Ich bin damit einverstanden, dass für 32 ... 100kb Leistung sollte besser und man sollte substring-Variante für diesen einen Betrieb der Zeichen Ersatz verwenden.

Aber was passiert, wenn ich schon einige Alternativen machen?

Ich brauchte meine eigenen Tests durchführen zu beweisen, was schneller ist in diesem Fall. Lassen Sie uns sagen, dass wir einen Algorithmus, die eine relativ kurze Zeichenfolge manipulieren, die von 1000 Zeichen besteht. Wir gehen davon aus, dass jedes Zeichen in dieser Zeichenkette in Durchschnitt wird ~ 100-mal ersetzt werden. So ist der Code, so etwas zu testen, ist:

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 Geige für diese, und es ist hier . Es gibt zwei Tests, TEST1 (substring) und TEST2 (Array-Konvertierung).

Ergebnisse:

  • TEST1: 195ms
  • TEST2: 6 ms

Es scheint, dass Array Umwandlung String um 2 Größenordnungen übertrifft! Also - was zum Teufel ist hier passiert ???

Was tatsächlich passiert ist, dass alle Vorgänge in TEST2 auf Array selbst getan werden, Zuweisungsausdruck wie strarr2[p] = n verwenden. Die Zuweisung erfolgt sehr schnell im Vergleich zu Teilkette auf einem großen String und seine klar, dass es geht, um zu gewinnen.

Also, es geht um das richtige Werkzeug für den Job wählen. Wieder.

Die Arbeit mit Vektoren ist in der Regel am effektivsten String zu kontaktieren.

Ich schlage vor, die folgende Funktion:

String.prototype.replaceAt=function(index, char) {
    var a = this.split("");
    a[index] = char;
    return a.join("");
}

Führen Sie dieses Snippet:

String.prototype.replaceAt=function(index, char) {
    var a = this.split("");
    a[index] = char;
    return a.join("");
}

var str = "hello world";
str = str.replaceAt(3, "#");

document.write(str);

In Javascript-Strings sind unveränderlich, so dass Sie etwas zu tun haben, wie

var x = "Hello world"
x = x.substring(0, i) + 'h' + x.substring(i+1);

Um das Zeichen in x auf i mit 'h' ersetzen

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

function dothis() {
  var x = document.getElementById("x").value;
  var index = document.getElementById("index").value;
  var text = document.getElementById("text").value;
  var arr = x.split("");
  arr.splice(index, 1, text);
  var result = arr.join("");
  document.getElementById('output').innerHTML = result;
  console.log(result);
}
dothis();
<input id="x" type="text" value="White Dog" placeholder="Enter Text" />
<input id="index" type="number" min="0"value="6" style="width:50px" placeholder="index" />
<input id="text" type="text" value="F" placeholder="New character" />
<br>
<button id="submit" onclick="dothis()">Run</button>
<p id="output"></p>

Diese Methode ist gut für kleine Zeichenfolge, sondern kann für größeren Text langsam sein.

var x = "White Dog";
var arr = x.split(""); // ["W", "h", "i", "t", "e", " ", "D", "o", "g"]
arr.splice(6, 1, 'F');
var result = arr.join(""); // "White Fog"

/* 
  Here 6 is starting index and 1 is no. of array elements to remove and 
  final argument 'F' is the new character to be inserted. 
*/

Ein-Liner mit String.replace mit Callback (keine Emoji-Unterstützung):

// 0 - index to replace, 'f' - replacement string
'dog'.replace(/./g, (c, i) => i == 0? 'f': c)
// "fog"

Erklärt:

//String.replace will call the callback on each pattern match
//in this case - each character
'dog'.replace(/./g, function (character, index) {
   if (index == 0) //we want to replace the first character
     return 'f'
   return character //leaving other characters the same
})

@CemKalyoncu: Vielen Dank für die große Antwort

Ich passte es auch leicht es mehr wie die Array.splice Methode zu machen (und nahm @Ates' Note berücksichtigt):

spliceString=function(string, index, numToDelete, char) {
      return string.substr(0, index) + char + string.substr(index+numToDelete);
   }

var myString="hello world!";
spliceString(myString,myString.lastIndexOf('l'),2,'mhole'); // "hello wormhole!"

Dies funktioniert ähnlich wie Array.splice:

String.prototype.splice = function (i, j, str) {
    return this.substr(0, i) + str + this.substr(j, this.length);
};

Wenn Sie Zeichen in Zeichenkette ersetzen möchten, sollten Sie wandelbar Strings erstellen. Dies sind im wesentlichen Zeichen-Arrays. Sie könnten eine Fabrik erstellen:

  function MutableString(str) {
    var result = str.split("");
    result.toString = function() {
      return this.join("");
    }
    return result;
  }

Dann können Sie die Zeichen zugreifen und das gesamte Array konvertiert in einen String, wenn sie als Zeichenfolge verwendet:

  var x = MutableString("Hello");
  x[0] = "B"; // yes, we can alter the character
  x.push("!"); // good performance: no new string is created
  var y = "Hi, "+x; // converted to string: "Hi, Bello!"

Sie könnten versuchen,

var strArr = str.split("");

strArr[0] = 'h';

str = strArr.join("");

ich eine Funktion hat, die etwas Ähnliches tut, was Sie fragen, überprüft es, ob ein Zeichen in Zeichenkette in einer Reihe von nicht erlaubten Zeichen ist, wenn sie es ersetzt sie durch ‚‘

ist
    var validate = function(value){
        var notAllowed = [";","_",">","<","'","%","$","&","/","|",":","=","*"];
        for(var i=0; i<value.length; i++){
            if(notAllowed.indexOf(value.charAt(i)) > -1){
               value = value.replace(value.charAt(i), "");
               value = validate(value);
            }
       }
      return value;
   }

Ich weiß, das ist alt, aber die Lösung funktioniert nicht für negativen Index, damit ich einen Patch, um es hinzuzufügen. hoffe, es hilft jemand

String.prototype.replaceAt=function(index, character) {
    if(index>-1) return this.substr(0, index) + character + this.substr(index+character.length);
    else return this.substr(0, this.length+index) + character + this.substr(index+character.length);

}

Lassen Sie uns sagen Sie Kth Index (0-basierender Index) mit 'Z' ersetzen möchten. Sie könnten Regex, dies zu tun.

var re = var re = new RegExp("((.){" + K + "})((.){1})")
str.replace(re, "$1A$`");

Das ist leicht erreichbar mit RegExp!

const str = 'Hello RegEx!';
const index = 11;
const replaceWith = 'p';

//'Hello RegEx!'.replace(/^(.{11})(.)/, `$1p`);
str.replace(new RegExp(`^(.{${ index }})(.)`), `$1${ replaceWith }`);

//< "Hello RegExp"

Hier ist eine Version kam ich mit, wenn Sie Wörter oder einzelne Zeichen in ihrem Index, um Stil in / javascript reagieren.

replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings ) 

Arbeitsbeispiel: https://codesandbox.io/s/ov7zxp9mjq

function replaceAt(indexArray, [...string]) {
    const replaceValue = i => string[i] = <b>{string[i]}</b>;
    indexArray.forEach(replaceValue);
    return string;
}

Und hier ist eine andere alternative Methode

function replaceAt(indexArray, [...string]) {
    const startTag = '<b>';
    const endTag = '</b>';
    const tagLetter = i => string.splice(i, 1, startTag + string[i] + endTag);
    indexArray.forEach(tagLetter);
    return string.join('');
}

Und noch ein ...

function replaceAt(indexArray, [...string]) {
    for (let i = 0; i < indexArray.length; i++) {
        string = Object.assign(string, {
          [indexArray[i]]: <b>{string[indexArray[i]]}</b>
        });
    }
    return string;
}

Ein allgemeineres Afanasij Kurakin Antwort, die wir haben:

function replaceAt(str, index, ch) {
    return str.replace(/./g, (c, i) => i == index ? ch : c)
}

let str = 'Hello World'
str = replaceAt(str, 1, 'u')
console.log(str) // Hullo World

Lassen Sie sich erweitern und erklärt sowohl den regulären Ausdruck und die replacer Funktion:

function replaceAt(str, index, newChar) {
    function replacer(origChar, strIndex) {
        if (strIndex === index)
            return newChar
        else
            return origChar
    }
    return str.replace(/./g, replacer)
}

let str = 'Hello World'
str = replaceAt(str, 1, 'u')
console.log(str) // Hullo World

Der reguläre Ausdruck . entspricht genau ein Zeichen. Die g macht es für Schleife in ein jedes Zeichen übereinstimmen. Die replacer Funktion ist gegeben genannt sowohl den ursprünglichen Charakter und den Index, wo das Zeichen in der Zeichenfolge. Wir machen eine einfache if Aussage, um zu bestimmen, ob wir entweder origChar oder newChar zurückkehren werden.

Sie können die String-Typ erweitern den Einsatz Methode sind:

String.prototype.insert = function (index,value) {
  return this.substr(0, index) + value + this.substr(index,this.length);
};

var s = "new function";
alert(s.insert(4,"insert string "));

Dann können Sie die Funktion aufrufen:

Sie können die folgende Funktion verwenden, um Character oder String an einer bestimmten Position eines String zu ersetzen. So ersetzen Sie alle folgenden Spiel Fällen verwenden String.prototype.replaceAllMatches() Funktion.

String.prototype.replaceMatch = function(matchkey, replaceStr, matchIndex) {
    var retStr = this, repeatedIndex = 0;
    for (var x = 0; (matchkey != null) && (retStr.indexOf(matchkey) > -1); x++) {
        if (repeatedIndex == 0 && x == 0) {
            repeatedIndex = retStr.indexOf(matchkey);
        } else { // matchIndex > 0
            repeatedIndex = retStr.indexOf(matchkey, repeatedIndex + 1);
        }
        if (x == matchIndex) {
            retStr = retStr.substring(0, repeatedIndex) + replaceStr + retStr.substring(repeatedIndex + (matchkey.length));
            matchkey = null; // To break the loop.
        }
    }
    return retStr;
};

Test:

var str = "yash yas $dfdas.**";

console.log('Index Matched replace : ', str.replaceMatch('as', '*', 2) );
console.log('Index Matched replace : ', str.replaceMatch('y', '~', 1) );

Ausgabe:

Index Matched replace :  yash yas $dfd*.**
Index Matched replace :  yash ~as $dfdas.**

Die Verfahren hier sind kompliziert. Ich würde es auf diese Weise tun:

var myString = "this is my string";
myString = myString.replace(myString.charAt(number goes here), "insert replacement here");

Das ist so einfach, wie es nur geht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top