Hoe vervang ik een teken bij een bepaalde index in JavaScript?

Ik heb een string, laten we zeggen Hello worlden ik moet de char bij index 3 vervangen. Hoe kan ik een char vervangen door een index op te geven?

var str = "hello world";

Ik heb iets nodig als

str.replaceAt(0,"h");

Antwoord 1, autoriteit 100%

In JavaScript zijn tekenreeksen onveranderlijk, wat betekent dat u het beste een nieuwe tekenreeks kunt maken met de gewijzigde inhoud en de variabele kunt toewijzen om ernaar te verwijzen.

U moet de functie replaceAt()zelf definiëren:

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

En gebruik het als volgt:

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

Antwoord 2, autoriteit 17%

Er is geen replaceAt-functie in JavaScript. U kunt de volgende code gebruiken om elk teken in elke tekenreeks op een opgegeven positie te vervangen:

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>

Antwoord 3, autoriteit 13%

Dat kan niet. Neem de karakters voor en na de positie en voeg ze samen in een nieuwe string:

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

Antwoord 4, autoriteit 6%

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

Antwoord 5, autoriteit 5%

Er zijn hier veel antwoorden, en ze zijn allemaal gebaseerd op twee methoden:

  • METHODE1: splits de tekenreeks met twee subtekenreeksen en vul het teken ertussen
  • METHODE2: converteer de tekenreeks naar tekenarray, vervang één arraylid en voeg eraan toe

Persoonlijk zou ik deze twee methoden in verschillende gevallen gebruiken. Laat het me uitleggen.

@FabioPhms: Jouw methode was degene die ik in eerste instantie gebruikte en ik was bang dat het slecht is op string met veel karakters. De vraag is echter wat veel karakters zijn? Ik heb het getest op 10 “lorem ipsum”-paragrafen en het duurde een paar milliseconden. Toen heb ik het getest op een 10 keer grotere snaar – er was echt geen groot verschil. Hmm.

@vsync, @Cory MaWhorter: Uw opmerkingen zijn ondubbelzinnig; maar nogmaals, wat is een grote string? Ik ben het ermee eens dat voor 32…100kb de prestaties beter zouden moeten zijn en dat men substring-variant zou moeten gebruiken voor deze ene bewerking van karaktervervanging.

Maar wat gebeurt er als ik nogal wat vervangingen moet doen?

Ik moest mijn eigen tests uitvoeren om te bewijzen wat in dat geval sneller is. Laten we zeggen dat we een algoritme hebben dat een relatief korte string van 1000 karakters zal manipuleren. We verwachten dat gemiddeld elk teken in die string ~ 100 keer zal worden vervangen. Dus de code om zoiets te testen is:

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

Ik heb hiervoor een viool gemaakt, en het is hier.
Er zijn twee tests, TEST1 (substring) en TEST2 (arrayconversie).

Resultaten:

  • TEST1: 195 ms
  • TEST2: 6 ms

Het lijkt erop dat array-conversie substring met 2 ordes van grootte verslaat! Dus – wat is hier in godsnaam gebeurd???

Wat er feitelijk gebeurt, is dat alle bewerkingen in TEST2 op de array zelf worden gedaan, met behulp van toewijzingsexpressies zoals strarr2[p] = n. Toewijzing is erg snel in vergelijking met substring op een grote string, en het is duidelijk dat het gaat winnen.

Het draait dus allemaal om het kiezen van het juiste gereedschap voor de klus. Nogmaals.


Antwoord 6, autoriteit 5%

Werken met vectoren is meestal het meest effectief om contact op te nemen met String.

Ik stel de volgende functie voor:

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

Voer dit fragment uit:

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);

Antwoord 7, Autoriteit 4%

In Javascript-snaren zijn onveranderlijk, dus je moet iets doen als

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

Om het teken in x op i te vervangen door ‘H’


Antwoord 8, Autoriteit 2%


Antwoord 9, Autoriteit 2%

ONE-voering met behulp van string.replace met callback (geen emoji-ondersteuning):

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

Uitgelegd:

//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
})

Antwoord 10

Het antwoord van Afanasii Kurakin generaliseren, wij hebben:

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

Antwoord 11

Je zou het kunnen proberen

var strArr = str.split("");
strArr[0] = 'h';
str = strArr.join("");

Antwoord 12

@CemKalyoncu: Bedankt voor het geweldige antwoord!

Ik heb het ook iets aangepast om het meer op de Array.splice-methode te laten lijken (en hield rekening met de opmerking van @Ates):

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!"

Antwoord 13

Dit werkt vergelijkbaar met Array.splice:

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

Antwoord 14

Als u tekens in een tekenreeks wilt vervangen, moet u veranderlijke tekenreeksen maken. Dit zijn in wezen karakterarrays. Je zou een fabriek kunnen maken:

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

Dan heb je toegang tot de karakters en wordt de hele array geconverteerd naar string wanneer gebruikt als string:

 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!"

Antwoord 15

U kunt het tekenreekstype uitbreiden met de inzetmethode:

String.prototype.append = function (index,value) {
  return this.slice(0,index) + value + this.slice(index);
};
var s = "New string";
alert(s.append(4,"complete "));

Antwoord 16

var str = "hello world";
console.log(str);
var arr = [...str];
arr[0] = "H";
str = arr.join("");
console.log(str);

Antwoord 17

dit is gemakkelijk te bereiken met 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"

Antwoord 18

Ik heb een functie gedaan die iets doet wat lijkt op wat je vraagt, het controleert of een teken in string in een array van niet toegestane tekens staat, als dat zo is, wordt het vervangen door ”

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

Antwoord 19

Stel dat je de Kthindex (0-gebaseerde index) wilt vervangen door 'Z'.
U kunt hiervoor Regexgebruiken.

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

Antwoord 20

Hier is een versie die ik heb bedacht als je woorden of individuele karakters wilt stylen in hun index in react/javascript.

replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings ) 

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

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

En hier is nog een alternatieve 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('');
}

En nog een…

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

Antwoord 21

Hier is mijn oplossing met behulp van de ternaire en kaartoperator. Meer leesbaar, onderhoudbaar einde gemakkelijker te begrijpen of u het mij vraagt.

Het is meer in ES6 en beste praktijken.

function replaceAt() {
  const replaceAt = document.getElementById('replaceAt').value;
  const str = 'ThisIsATestStringToReplaceCharAtSomePosition';
  const newStr = Array.from(str).map((character, charIndex) => charIndex === (replaceAt - 1) ? '' : character).join('');
  console.log(`New string: ${newStr}`);
}
<input type="number" id="replaceAt" min="1" max="44" oninput="replaceAt()"/>

Antwoord 22

Ik weet dat dit oud is, maar de oplossing werkt niet voor negatieve index, dus voeg ik er een patch toe. Ik hoop dat het iemand helpt

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);
}

Antwoord 23

U kunt de volgende functie gebruiken om Characterof Stringop een bepaalde positie van een tekenreeks te vervangen. Om alle volgende wedstrijdcases te vervangen Gebruik String.prototype.replaceAllMatches()functie.

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

Testen:

var str = "yash yas $dfdas.**";
console.log('Index Matched replace : ', str.replaceMatch('as', '*', 2) );
console.log('Index Matched replace : ', str.replaceMatch('y', '~', 1) );

Uitvoer:

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

Antwoord 24

U kunt samenvoegen met behulp van de subtekenreeksfunctie door eerst tekst te selecteren vóór de gerichte index en na de gerichte index en vervolgens samen te voegen met uw potentiële teken of tekenreeks. Deze is beter

const myString = "Hello world";
const index = 3;
const stringBeforeIndex = myString.substring(0, index);
const stringAfterIndex = myString.substring(index + 1);
const replaceChar = "X";
myString = stringBeforeIndex + replaceChar + stringAfterIndex;
console.log("New string - ", myString)

of

const myString = "Hello world";
let index = 3;
myString =  myString.substring(0, index) + "X" + myString.substring(index + 1);

Antwoord 25

De methoden hier zijn ingewikkeld.
Ik zou het op deze manier doen:

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

Dit is zo eenvoudig als het maar kan.

Other episodes