我有一个字符串,假设Hello world
我需要替换索引3处的char。如何通过指定索引来替换char?
var str = "hello world";
我需要类似的东西
str.replaceAt(0,"h");
"use strict"
被激活:(Uncaught TypeError: Cannot assign to read only property '0' of string 'hello world'
至少在Webkit浏览器中)
我有一个字符串,假设Hello world
我需要替换索引3处的char。如何通过指定索引来替换char?
var str = "hello world";
我需要类似的东西
str.replaceAt(0,"h");
"use strict"
被激活:(Uncaught TypeError: Cannot assign to read only property '0' of string 'hello world'
至少在Webkit浏览器中)
Answers:
在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
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.substr(0,index) + chr + str.substr(index+1);
}
<button onclick="rep();">click</button>
你不能 将位置前后的字符合并为一个新字符串:
var s = "Hello world";
var index = 3;
s = s.substring(0, index) + 'x' + s.substring(index + 1);
这里有很多答案,并且所有答案都基于两种方法:
就个人而言,我将在不同情况下使用这两种方法。让我解释。
@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
。与大字符串上的子字符串相比,分配确实非常快,而且很明显,它会赢。
因此,这全都在于为工作选择合适的工具。再次。
使用向量通常是联系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);
Array.prototype.replace = function(index, val) { this[index] = val; return this; };
'word'.split('').replace(1, '0').join(''); // returns 'w0rd'
str = str.split('');
str[3] = 'h';
str = str.join('');
split
和join
一线使用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 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.
*/
@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!"
Array.splice
类型功能一致。
这类似于Array.splice
:
String.prototype.splice = function (i, j, str) {
return this.substr(0, i) + str + this.substr(j, this.length);
};
你可以试试
var strArr = str.split("");
strArr[0] = 'h';
str = strArr.join("");
如果要替换字符串中的字符,则应创建可变字符串。这些本质上是字符数组。您可以创建一个工厂:
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!"
概括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
让我们扩展并解释正则表达式和replacer函数:
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
。
您可以扩展字符串类型以包括inset方法:
String.prototype.append = function (index,value) {
return this.slice(0,index) + value + this.slice(index);
};
var s = "New string";
alert(s.append(4,"complete "));
然后可以调用该函数:
我做了一个功能类似于您的要求的函数,它检查字符串中的字符是否在不允许的字符数组中,如果它被替换为”
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;
}
如果您想在react / javascript中的单词或单个字符的索引处设置样式,这是我想到的一个版本。
replaceAt( yourArrayOfIndexes, yourString/orArrayOfStrings )
工作示例:https://codesandbox.io/s/ov7zxp9mjq
function replaceAt(indexArray, [...string]) {
const replaceValue = i => string[i] = <b>{string[i]}</b>;
indexArray.forEach(replaceValue);
return string;
}
这是另一种替代方法
function replaceAt(indexArray, [...string]) {
const startTag = '<b>';
const endTag = '</b>';
const tagLetter = i => string.splice(i, 1, startTag + string[i] + endTag);
indexArray.forEach(tagLetter);
return string.join('');
}
还有一个
function replaceAt(indexArray, [...string]) {
for (let i = 0; i < indexArray.length; i++) {
string = Object.assign(string, {
[indexArray[i]]: <b>{string[indexArray[i]]}</b>
});
}
return string;
}
我知道这很旧,但是该解决方案不适用于负索引,因此我向其添加了补丁。希望对别人有帮助
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);
}
假设您要用替换Kth
索引(基于0的索引)'Z'
。您可以Regex
用来做到这一点。
var re = var re = new RegExp("((.){" + K + "})((.){1})")
str.replace(re, "$1A$`");
您可以使用以下函数替换String Character
或String
在String的特定位置。要替换以下所有匹配项,请使用String.prototype.replaceAllMatches()
函数。
String.prototype.replaceMatch = function(matchkey, replaceStr, matchIndex) {
var retStr = this, repeatedIndex = 0;
for (var x = 0; (matchkey != null) && (retStr.indexOf(matchkey) > -1); x++) {
if (repeatedIndex == 0 && x == 0) {
repeatedIndex = retStr.indexOf(matchkey);
} else { // matchIndex > 0
repeatedIndex = retStr.indexOf(matchkey, repeatedIndex + 1);
}
if (x == matchIndex) {
retStr = retStr.substring(0, repeatedIndex) + replaceStr + retStr.substring(repeatedIndex + (matchkey.length));
matchkey = null; // To break the loop.
}
}
return retStr;
};
测试:
var str = "yash yas $dfdas.**";
console.log('Index Matched replace : ', str.replaceMatch('as', '*', 2) );
console.log('Index Matched replace : ', str.replaceMatch('y', '~', 1) );
输出:
Index Matched replace : yash yas $dfd*.**
Index Matched replace : yash ~as $dfdas.**
这是我使用三元和映射运算符的解决方案。如果您问我,则更具可读性,可维护性的一端更易于理解。
es6和最佳实践中有更多内容。
function replaceAt() {
const replaceAt = document.getElementById('replaceAt').value;
const str = 'ThisIsATestStringToReplaceCharAtSomePosition';
const newStr = Array.from(str).map((character, charIndex) => charIndex === (replaceAt - 1) ? '' : character).join('');
console.log(`New string: ${newStr}`);
}
<input type="number" id="replaceAt" min="1" max="44" oninput="replaceAt()"/>
这里的方法很复杂。我会这样:
var myString = "this is my string";
myString = myString.replace(myString.charAt(number goes here), "insert replacement here");
这很简单。
str[0] = 'x'
似乎没有引发任何错误,但没有达到预期的效果!