string - 如何在JavaScript中替换特定索引处的字符?

我有一个字符串,让我们说Hello world,我需要替换索引3处的字符。如何通过指定索引来替换字符?

var str = "hello world";

我需要类似的东西

str.replaceAt(0,"h");
18个解决方案
490 votes

在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, "!!")); //should display He!!o World
Cem Kalyoncu answered 2019-01-21T18:16:41Z
71 votes

JavaScript中没有<button onclick="Rep();">click</button>函数。 您可以使用以下代码替换指定位置的任何字符串中的任何字符:

<button onclick="Rep();">click</button>
<button onclick="Rep();">click</button>

rahul answered 2019-01-21T18:17:14Z
51 votes

你不能。 取位置前后的字符并连接成一个新字符串:

var s = "Hello world";
var index = 3;
s = s.substr(0, index) + 'x' + s.substr(index + 1);
Guffa answered 2019-01-21T18:17:38Z
29 votes

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

  • 方法1:使用两个子串分割字符串并填充它们之间的字符
  • METHOD2:将字符串转换为字符数组,替换一个数组成员并加入它

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

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

我为此创造了一个小提琴,它就在这里。有两个测试,TEST 1(子串)和TEST2(阵列转换)。

结果:

  • TEST1:195ms
  • 测试2:6ms

似乎数组转换比子串要好2个数量级! 那么 - 到底发生了什么?

实际发生的是TEST2中的所有操作都是在数组本身上完成的,使用的分配表达式如strarr2[p] = n.与大字符串上的子字符串相比,赋值真的很快,而且很明显它会赢。

所以,这就是为工作选择合适的工具。 再次。

OzrenTkalcecKrznaric answered 2019-01-21T18:19:29Z
27 votes

使用矢量通常最有效地联系String。

我建议以下功能:

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

Fabio Phms answered 2019-01-21T18:20:10Z
25 votes

在Javascript字符串是不可变的,所以你必须做类似的事情

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

用'h'替换i中x的字符

DevDevDev answered 2019-01-21T18:20:38Z
24 votes
str = str.split('');
str[3] = 'h';
str = str.join('');
colllin answered 2019-01-21T18:20:54Z
4 votes

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

此方法适用于小长度字符串,但对于较大的文本可能较慢。

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. 
*/
Vikramaditya answered 2019-01-21T18:21:24Z
3 votes

这与Array.splice类似:

String.prototype.splice = function (i, j, str) {
    return this.substr(0, i) + str + this.substr(j, this.length);
};
Aram Kocharyan answered 2019-01-21T18:21:46Z
3 votes

使用String.replace和回调的单线程:

// 0 - index to replace, 'f' - replacement string
'dog'.replace(/./g, (c, i) => i == 0? 'f': c)
// "fog"
Afanasii Kurakin answered 2019-01-21T18:22:13Z
2 votes

@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!"
Scrimothy answered 2019-01-21T18:22:44Z
1 votes

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

    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;
   }
mirzak answered 2019-01-21T18:23:06Z
1 votes

如果要替换字符串中的字符,则应创建可变字符串。 这些本质上是字符数组。 你可以创建一个工厂:

  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!"
Jan Turoň answered 2019-01-21T18:23:35Z
1 votes

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

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

}
cesar moro answered 2019-01-21T18:23:57Z
0 votes

您可以扩展字符串类型以包含inset方法:

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

然后你可以调用这个函数:

mbadeveloper answered 2019-01-21T18:24:35Z
0 votes

假设您要将Kth索引(基于0的索引)替换为'Z'。您可以使用Regex执行此操作。

var re = var re = new RegExp("((.){" + K + "})((.){1})")
str.replace(re, "$1A$`");
ksp answered 2019-01-21T18:24:57Z
0 votes

你可以试试

var strArr = str.split("");

strArr[0] = 'h';

str = strArr.join("");
Mehulkumar answered 2019-01-21T18:25:14Z
-4 votes

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

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

这很简单。

mikey answered 2019-01-21T18:25:42Z
translate from https://stackoverflow.com:/questions/1431094/how-do-i-replace-a-character-at-a-particular-index-in-javascript