如何replaceJavaScript中特定索引处的字符?

我有一个string,让我们说Hello world ,我需要replace索引3的字符。我怎样才能通过指定索引来replace字符?

 var str = "hello world"; 

我需要类似的东西

 str.replaceAt(0,"h"); 

在JavaScript中,string是不可变的 ,这意味着你可以做的最好的是创build一个新的string与改变的内容,并分配variables指向它。

你需要自己定义replaceAt()函数:

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

像这样使用它:

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

JavaScript中没有replaceAtfunction。 您可以使用以下代码来replace指定位置上的任何string中的任何字符:

 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> 

你不能。 把位置前后的字符换成一个新的string:

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

这里有很多答案,它们都是基于两种方法:

  • 方法1:使用两个子string拆分string并在其间填充字符
  • 方法2:将string转换为字符数组,replace一个数组成员并join

就个人而言,我会在不同情况下使用这两种方法。 让我解释。

@FabioPhms:你的方法是我最初使用的方法,我担心它有很多字符的string是不好的。 然而,问题是什么是很多字符? 我testing了10个“lorem ipsum”段落,并花了几毫秒。 然后我testing了10倍大的string – 真的没有太大的区别。 嗯。

@vsync,@Cory Mawhorter:您的意见是明确的; 然而,再一次,什么是一个大串? 我同意,对于32 … 100kb的性能应该更好一些,应该使用stringreplace的这一个操作的子string变体。

但是如果我必须做很多replace,会发生什么呢?

我需要进行自己的testing来certificate在这种情况下速度更快。 假设我们有一个algorithm可以处理由1000个字符组成的相对较短的string。 我们预计该string中的每个字符平均会被replace100次。 所以,testing这样的代码是:

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

我为此创build了一个小提琴,它在这里 。 有两个testing,TEST1(substring)和TEST2(数组转换)。

结果:

  • TEST1:195ms
  • TEST2:6ms

看来,数组转换击败子串2个数量级! 那么 – 到底发生了什么?

实际上,TEST2中的所有操作都是在数组本身上完成的,使用赋值expression式如strarr2[p] = n 。 与大string上的子string相比,赋值是非常快的,清楚的是它会取胜。

所以,这就是为工作select正确的工具。 再次。

与vector工作通常是最有效的联系string。

我build议以下function:

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

运行这个片段:

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

在Javascriptstring是不可改变的,所以你必须做类似的事情

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

用'h'replace我在x处的字符

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

这与Array.splice类似:

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

@CemKalyoncu:谢谢你的好评!

我也稍微调整了它,使其更像Array.splice方法(并考虑了@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!" 
 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> 

我做了一个类似于你所要求的函数,它检查string中的一个字符是否在一个不允许的字符数组中,如果它被replace为''

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

如果你想replacestring中的字符,你应该创build可变的string。 这些本质上是字符数组。 你可以创build一个工厂:

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

然后你可以访问字符,整个数组作为string使用时转换为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!" 

我知道这是旧的,但解决scheme不适用于负面的索引,所以我添加一个补丁。 希望它可以帮助别人

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

您可以扩展stringtypes以包含插入方法:

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

比方说你想用'Z'代替Kth索引(从0开始的索引)。 你可以使用正则Regex来做到这一点。

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

单线使用String.replace与callback:

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

这里的方法很复杂。 我会这样做:

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

这是如此简单。