如何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中没有replaceAt
function。 您可以使用以下代码来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");
这是如此简单。