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*
}
var x = "Hello world"
x = x.substring(0, i) + 'h' + x.substring(i+1);
用'h'替换i中x的字符
1
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();
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.
*/
25
使用带回调的String.replace的单线程(没有表情符号支持):
// 0 - index to replace, 'f' - replacement string
'dog'.replace(/./g, (c, i) => i == 0? 'f': c)
// "fog"
解释:
//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
})
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;
}
76
如果要替换字符串中的字符,则应创建可变字符串 . 这些本质上是字符数组 . 你可以创建一个工厂:
function MutableString(str) {
var result = str.split("");
result.toString = function() {
return this.join("");
}
return result;
}
然后你可以访问字符,当用作字符串时,整个数组转换为字符串:
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!"
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 "));
21 回答
我知道这是旧的,但解决方案不适用于负面索引,所以我添加了一个补丁 . 希望它可以帮到某人
假设您要将
Kth
index(基于0的索引)替换为'Z'
. 您可以使用Regex
来执行此操作 .你可以试试
在JavaScript中,字符串是 immutable ,这意味着您可以做的最好的事情是创建一个包含更改内容的新字符串,并指定变量指向它 .
您需要自己定义
replaceAt()
函数:并像这样使用它:
JavaScript中没有
replaceAt
函数 . 您可以使用以下代码替换指定位置的任何字符串中的任何字符:你不能 . 取位置前后的字符并连接成一个新字符串:
这里有很多答案,所有答案都基于两种方法:
METHOD1:使用两个子串分割字符串并填充它们之间的字符
METHOD2:将字符串转换为字符数组,替换一个数组成员并加入它
就个人而言,我会在不同情况下使用这两种方法 . 让我解释 .
@FabioPhms:你的方法是我最初使用的方法,我担心它对很多字符的字符串都很糟糕 . 然而,问题是很多角色是什么?我在10“lorem ipsum”段落上进行了测试,花了几毫秒 . 然后我用10倍大的字符串测试它 - 真的没什么大不同 . 嗯 .
@vsync,@ Cory Mawhorter:你的评论是明确的;然而,再一次,什么是大字符串?我同意,对于32 ... 100kb性能应该更好,并且应该使用substring-variant进行这一个字符替换操作 .
但是,如果我必须进行一些替换,会发生什么?
我需要执行自己的测试来证明在这种情况下更快 . 假设我们有一个算法可以操作一个由1000个字符组成的相对较短的字符串 . 我们希望平均每个字符串中的每个字符都会被替换100次 . 所以,测试这样的代码的代码是:
我为此创造了一个小提琴,它是here . 有两个测试,TEST1(子串)和TEST2(阵列转换) .
结果:
TEST1:195ms
TEST2:6ms
似乎数组转换比子串要好2个数量级!那么 - 到底发生了什么?
实际发生的是TEST2中的所有操作都是在数组本身完成的,使用
strarr2[p] = n
之类的赋值表达式 . 与大字符串上的子字符串相比,赋值真的很快,而且很明显它会赢 .所以,这就是为工作选择合适的工具 . 再次 .
使用矢量通常最有效地联系String .
我建议以下功能:
运行此代码段:
在Javascript字符串是不可变的,所以你必须做类似的事情
用'h'替换i中x的字符
此方法适用于小长度字符串,但对于较大的文本可能较慢 .
使用带回调的String.replace的单线程(没有表情符号支持):
解释:
这类似于
Array.splice
:@CemKalyoncu:谢谢你的回答!
我也稍微改编了它,使其更像是Array.splice方法(并考虑了@Ates'注释):
我做了一个类似于你所要求的函数的函数,它检查字符串中的字符是否在一个不允许的字符数组中,如果它用''替换它''
如果要替换字符串中的字符,则应创建可变字符串 . 这些本质上是字符数组 . 你可以创建一个工厂:
然后你可以访问字符,当用作字符串时,整个数组转换为字符串:
如果您想在索引处设置单词或单个字符的样式,这是我想出的一个版本 .
工作示例:https://codesandbox.io/s/pjp6jk48jj
这是另一种替代方法
另一个......
使用RegExp可以轻松实现这一点!
您可以扩展字符串类型以包含inset方法:
然后你可以调用这个函数:
您可以使用以下函数在String的特定位置替换
Character
或String
. 要替换以下所有匹配情况,请使用String.prototype.replaceAllMatches()函数 .测试:
输出:
这里的方法很复杂 . 我会这样做:
这很简单 .