我有一个字符串,比如说 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.substring(0, index) + replacement + this.substring(index + replacement.length);
}
然后像这样使用它:
var hello = "Hello World";
alert(hello.replaceAt(2, "!!")); // He!!o World
JavaScript 中没有 replaceAt
函数。您可以使用以下代码在指定位置替换任何字符串中的任何字符:
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>
function setCharAt(str,idx,newChr){ return str.substring(0,idx)+newChr+str.substring(idx+1);}
- ashleedawgsubstring
,而不是 substr
... 你提供的链接中哪里说这两个函数是“遗留”或应该被避免使用的?substring
和 substr
有着不同的用途。 - ashleedawg你无法直接删除一个字符串中的单个字符。可以获取该位置前后的字符并将它们连接成一个新字符串:
var s = "Hello world";
var index = 3;
s = s.substring(0, index) + 'x' + s.substring(index + 1);
String.prototype.substring
替代String.prototype.substr
。 - Michał Terczyńskistr = str.split('');
str[3] = 'h';
str = str.join('');
Array.from
比str.split
慢得多。https://blog.shovonhasan.com/never-use-array-from-to-convert-strings-to-arrays/ - Charlesreplace
方法。 - vdegennestr.splice(3, h.length, ...h.split(''))
或者 str.splice.apply(str, [3, h.length].concat(h.split('')))
, 但与 str.substring(0,3) + h + str.substring(5)
相比,这似乎有些疯狂。 - colllin这里有很多答案,所有答案都基于两种方法:
就我个人而言,我会根据不同情况使用这两种方法。让我来解释一下。
@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*
}
我创建了一个JSFiddle作为演示,并且它在这里。 有两个测试,TEST1(子字符串)和TEST2(数组转换)。
结果:
看起来数组转换比子字符串快了两个数量级!那么 - 到底发生了什么?
实际上,TEST2中的所有操作都是在数组本身上完成的,使用类似strarr2[p] = n
的赋值表达式。相对于大型字符串的子字符串,赋值是非常快的,显然会胜出。
所以,关键是选择适合当前任务的工具。再次强调。
处理向量通常最有效的方法是使用字符串。
我建议使用以下函数:
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);
Array.prototype.replace = function(index, val) { this[index] = val; return this; };
'word'.split('').replace(1, '0').join(''); // 返回 'w0rd'
- Michael Plautz在JavaScript中,字符串是不可变的,因此你必须像这样做:
var x = "Hello world"
x = x.substring(0, i) + 'h' + x.substring(i+1);
将x中第i个字符替换为'h'
function dothis() {
var x = document.getElementById("x").value;
var index = document.getElementById("index").value;
var text = document.getElementById("text").value;
var length = document.getElementById("length").value;
var arr = x.split("");
arr.splice(index, length, 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="length" type="number" min="0"value="1" style="width:50px" placeholder="length" />
<input id="text" type="text" value="F" placeholder="New character" />
<br>
<button id="submit" onclick="dothis()">Run</button>
<p id="output"></p>
这种方法适用于小长度的字符串,但对于较大的文本可能会变慢。
var x = "White Dog";
var arr = x.split(""); // ["W", "h", "i", "t", "e", " ", "D", "o", "g"]
arr.splice(6, 1, 'F');
/*
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.
*/
var result = arr.join(""); // "White Fog"
Array.from
在这里也可以使用。但 Array.from
是在 ES2015 中添加的,在旧版浏览器中没有支持。此外,我个人更喜欢使用 split
函数,因为它可以更自由地操作字符串模式。 - Vikramadityaarr[6]='F';
而不是.splice()
。 - Jay Dadhania使用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
})
综合Afanasii Kurakin的回答,我们有:
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
让我们扩展并解释一下正则表达式和替换函数:
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
正则表达式 .
匹配一个字符。使用 g
会使其在循环中匹配每个字符。replacer
函数被调用时同时给出原始字符和该字符在字符串中的索引。我们进行简单的 if
语句来确定是否返回 origChar
或 newChar
。
str[0] = 'x'
看起来没有抛出任何错误,但却没有产生预期的效果! - Michael"use strict"
,则会出现以下错误:在字符串'hello world'的只读属性'0'上不能进行赋值操作(至少在Webkit浏览器中)。 - Jan Turoň