web-dev-qa-db-fra.com

Comment remplacer un personnage à un index particulier en JavaScript?

J'ai une chaîne, disons Hello world et je dois remplacer le caractère à l'index 3. Comment puis-je remplacer un caractère en spécifiant un index?

var str = "hello world";

J'ai besoin de quelque chose comme

str.replaceAt(0,"h");
437
Santhosh

En JavaScript, les chaînes sont immuable , ce qui signifie que le mieux que vous puissiez faire est de créer une nouvelle chaîne avec le contenu modifié et d'affecter la variable à pointer dessus.

Vous devrez définir vous-même la fonction replaceAt():

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

Et utilisez-le comme ceci:

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

Il n'y a pas de fonction replaceAt en JavaScript. Vous pouvez utiliser le code suivant pour remplacer un caractère dans une chaîne quelconque à la position spécifiée:

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>
81
rahul

Tu ne peux pas. Prenez les caractères avant et après la position et concat dans une nouvelle chaîne:

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

Il y a beaucoup de réponses ici, et toutes reposent sur deux méthodes:

  • METHODE1: diviser la chaîne en deux sous-chaînes et insérer le caractère entre elles
  • METHOD2: convertir la chaîne en tableau de caractères, remplacer un membre du tableau et le joindre

Personnellement, j'utiliserais ces deux méthodes dans des cas différents. Laisse-moi expliquer.

@FabioPhms: Votre méthode était celle que j'avais initialement utilisée et j'avais peur que ce soit une mauvaise chaîne avec beaucoup de caractères. Cependant, la question est ce qui est beaucoup de caractères? Je l'ai testé sur 10 paragraphes "lorem ipsum" et cela a pris quelques millisecondes. Ensuite, je l'ai testé sur une corde 10 fois plus grosse - il n'y avait pas vraiment de grande différence. Hm.

@vsync, @Cory Mawhorter: Vos commentaires ne sont pas ambigus. Cependant, encore une fois, qu'est-ce qu'une grande chaîne? Je conviens que pour 32 ... 100 Ko, les performances devraient être meilleures et que l’on devrait utiliser une variante de sous-chaîne pour cette opération de remplacement de caractères.

Mais qu'arrivera-t-il si je dois effectuer quelques remplacements?

Je devais effectuer mes propres tests pour prouver ce qui est plus rapide dans ce cas. Disons que nous avons un algorithme qui manipulera une chaîne relativement courte composée de 1000 caractères. Nous nous attendons à ce qu'en moyenne chaque caractère de cette chaîne soit remplacé environ 100 fois. Donc, le code pour tester quelque chose comme ceci est:

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

J'ai créé un violon pour cela, et c'est ici . Il y a deux tests, TEST1 (sous-chaîne) et TEST2 (conversion de tableau).

Résultats:

  • TEST1: 195ms
  • TEST2: 6ms

Il semble que la conversion de tableau bat la sous-chaîne de 2 ordres de grandeur! Alors - qu'est-ce qui s'est passé ici ???

En réalité, toutes les opérations dans TEST2 sont effectuées sur le tableau lui-même, en utilisant une expression d'affectation telle que strarr2[p] = n. L'affectation est très rapide comparée à la sous-chaîne d'une grande chaîne, et il est clair que cela va gagner.

Il s’agit donc de choisir le bon outil pour le poste. Encore.

29

Travailler avec des vecteurs est généralement plus efficace pour contacter String.

Je suggère la fonction suivante:

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

Exécutez cet extrait:

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

28
Fabio Phms

En Javascript, les chaînes sont immuables, vous devez donc faire quelque chose comme

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

Pour remplacer le caractère dans x at i par 'h'

25
DevDevDev
str = str.split('');
str[3] = 'h';
str = str.join('');
24
colllin

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>

Cette méthode convient aux chaînes de petite taille, mais peut être lente pour les textes plus volumineux.

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. 
*/
5
Vikramaditya

Cela fonctionne de la même manière que Array.splice:

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

One-Liner utilisant String.replace avec callback (pas de support emoji):

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

A expliqué:

//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
})
4
Afanasii Kurakin

@CemKalyoncu: Merci pour cette excellente réponse!

Je l'ai aussi légèrement adapté pour le rapprocher de la méthode Array.splice (et j'ai pris en compte la note de @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!"
2
Scrimothy

Si vous souhaitez remplacer des caractères dans une chaîne, vous devez créer des chaînes mutables. Ce sont essentiellement des tableaux de caractères. Vous pouvez créer une usine:

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

Ensuite, vous pouvez accéder aux caractères et l'ensemble du tableau est converti en chaîne lorsqu'il est utilisé comme chaîne:

  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!"
1
Jan Turoň

Je sais que c'est vieux mais la solution ne fonctionne pas pour l'index négatif alors j'y ajoute un patch. j'espère que ça aide quelqu'un

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

}
1
cesar moro

J'ai fait une fonction qui fait quelque chose de similaire à ce que vous demandez, elle vérifie si un caractère de chaîne fait partie d'un tableau de caractères non autorisés s'il le remplace par ''

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

Tu pourrais essayer

var strArr = str.split("");

strArr[0] = 'h';

str = strArr.join("");
1
Mehulkumar

En généralisant la réponse de Afanasii Kurakin, nous avons:

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

Développons et expliquons l'expression régulière et la fonction de remplacement:

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

L'expression régulière . correspond exactement à un caractère. Le g le fait correspondre à chaque caractère d'une boucle for. La fonction replacer est appelée en fonction du caractère d'origine et de l'index de l'emplacement de ce caractère dans la chaîne. Nous faisons une simple instruction if pour déterminer si nous allons retourner soit origChar ou newChar.

0
Stephen Quan

Vous pouvez utiliser quelque chose appelé remplacement, ce qui fait qu'il remplace une certaine partie de la chaîne spécifiée par exemple:

function replaceTheString() {
  const str = "Donald Trump";
  console.log(str.replace("Tr", "L"));
}

Si vous exécutez la fonction, Donald Lump sera envoyé dans la console. Bien sûr, vous pouvez le faire avec n’importe quelle lettre et cela fonctionnera. Si vous voulez mieux comprendre string.replace, je vous suggère de consulter: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

0
Samuel Chen

Vous pouvez étendre le type de chaîne pour inclure la méthode inset:

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

Ensuite, vous pouvez appeler la fonction:

0
mbadeveloper

Voici une version que je propose si vous souhaitez styliser des mots ou des caractères individuels à leur index.

replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings ) 

Exemple de travail: https://codesandbox.io/s/pjp6jk48jj

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

Et voici une autre méthode alternative

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

Et un autre...

function replaceAt(indexArray, string) {
  let newString = [...string];

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

  return newString;
}
0
Matt Wright

Vous pouvez utiliser la fonction suivante pour remplacer Character ou String à une position particulière d'une chaîne. Pour remplacer tous les cas de correspondance suivants, utilisez String.prototype.replaceAllMatches() function.

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

Tester:

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

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

Sortie:

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

ceci est facilement réalisable avec 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"
0
Madmadi

Disons que vous souhaitez remplacer l'index Kth (index basé sur 0) par 'Z'. Vous pouvez utiliser Regex pour le faire.

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