我有一个字符串,假设Hello world
我需要替换索引 3 处的字符。如何通过指定索引来替换字符?
var str = "hello world";
我需要类似的东西
str.replaceAt(0,"h");
我有一个字符串,假设Hello world
我需要替换索引 3 处的字符。如何通过指定索引来替换字符?
var str = "hello world";
我需要类似的东西
str.replaceAt(0,"h");
在 JavaScript 中,字符串是不可变的,这意味着你能做的最好的事情就是用改变的内容创建一个新的字符串并分配变量来指向它。
您需要自己定义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, "!!")); // He!!o World
replaceAt
JavaScript 中没有函数。您可以使用以下代码替换任何字符串中指定位置的任何字符:
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>
你不能。取位置前后的字符并连接成一个新的字符串:
var s = "Hello world";
var index = 3;
s = s.substring(0, index) + 'x' + s.substring(index + 1);
str = str.split('');
str[3] = 'h';
str = str.join('');
这里有很多答案,它们都是基于两种方法:
就个人而言,我会在不同的情况下使用这两种方法。让我解释。
@FabioPhms:你的方法是我最初使用的方法,我担心它在包含大量字符的字符串上不好。然而,问题是什么是很多字符?我在 10 个“lorem ipsum”段落上测试了它,花了几毫秒。然后我在 10 倍大的字符串上对其进行了测试 - 确实没有太大区别。嗯。
@vsync、@Cory Mawhorter:你的评论是明确的;然而,再次,什么是大字符串?我同意 32...100kb 的性能应该更好,并且应该使用 substring-variant 来进行字符替换的这一操作。
但是如果我必须进行相当多的替换会发生什么?
我需要执行我自己的测试来证明在这种情况下什么更快。假设我们有一个算法来处理一个由 1000 个字符组成的相对较短的字符串。我们预计该字符串中的每个字符平均将被替换约 100 次。所以,测试这样的代码是:
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*
}
我为此创建了一个小提琴,它在这里。有两个测试,TEST1(子串)和TEST2(数组转换)。
结果:
似乎数组转换比子字符串高 2 个数量级!所以 - 这里到底发生了什么???
实际发生的情况是 TEST2 中的所有操作都是在数组本身上完成的,使用像strarr2[p] = n
. 与大字符串上的子字符串相比,赋值真的很快,而且很明显它会获胜。
因此,最重要的是为工作选择合适的工具。再次。