如何在另一个字符串的特定索引处插入一个字符串?
var txt1 = "foo baz"
假设我想在“foo”之后插入“bar”,我该如何实现呢?
我想到了substring(),但一定有一个更简单更直接的方法。
如何在另一个字符串的特定索引处插入一个字符串?
var txt1 = "foo baz"
假设我想在“foo”之后插入“bar”,我该如何实现呢?
我想到了substring(),但一定有一个更简单更直接的方法。
当前回答
我想比较使用substring的方法和使用slice的方法分别来自Base33和user113716,为此我写了一些代码
还可以看看这个性能比较,子字符串,切片
我使用的代码创建了巨大的字符串,并将字符串“bar”多次插入到巨大的字符串中
if (!String.prototype.splice) { /** * {JSDoc} * * The splice() method changes the content of a string by removing a range of * characters and/or adding new characters. * * @this {String} * @param {number} start Index at which to start changing the string. * @param {number} delCount An integer indicating the number of old chars to remove. * @param {string} newSubStr The String that is spliced in. * @return {string} A new string with the spliced substring. */ String.prototype.splice = function (start, delCount, newSubStr) { return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount)); }; } String.prototype.splice = function (idx, rem, str) { return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem)); }; String.prototype.insert = function (index, string) { if (index > 0) return this.substring(0, index) + string + this.substring(index, this.length); return string + this; }; function createString(size) { var s = "" for (var i = 0; i < size; i++) { s += "Some String " } return s } function testSubStringPerformance(str, times) { for (var i = 0; i < times; i++) str.insert(4, "bar ") } function testSpliceStringPerformance(str, times) { for (var i = 0; i < times; i++) str.splice(4, 0, "bar ") } function doTests(repeatMax, sSizeMax) { n = 1000 sSize = 1000 for (var i = 1; i <= repeatMax; i++) { var repeatTimes = n * (10 * i) for (var j = 1; j <= sSizeMax; j++) { var actualStringSize = sSize * (10 * j) var s1 = createString(actualStringSize) var s2 = createString(actualStringSize) var start = performance.now() testSubStringPerformance(s1, repeatTimes) var end = performance.now() var subStrPerf = end - start start = performance.now() testSpliceStringPerformance(s2, repeatTimes) end = performance.now() var splicePerf = end - start console.log( "string size =", "Some String ".length * actualStringSize, "\n", "repeat count = ", repeatTimes, "\n", "splice performance = ", splicePerf, "\n", "substring performance = ", subStrPerf, "\n", "difference = ", splicePerf - subStrPerf // + = splice is faster, - = subStr is faster ) } } } doTests(1, 100)
性能上的一般差异充其量是边际的,两种方法都工作得很好(即使在长度~~ 12000000的字符串上)
其他回答
只需制作如下函数:
function insert(str, index, value) {
return str.substr(0, index) + value + str.substr(index);
}
然后像这样使用:
alert(insert("foo baz", 4, "bar "));
输出:foo bar baz
它的行为完全像c# (Sharp) String。插入(int startIndex,字符串值)。
注意:这个insert函数将字符串值(第三个参数)插入到字符串str(第一个参数)中指定的整型索引(第二个参数)之前,然后返回新的字符串而不改变str!
另一种解决办法是,把绳子切成两半,在中间放一根绳子。
var str = jQuery('#selector').text();
var strlength = str.length;
strf = str.substr(0 , strlength - 5);
strb = str.substr(strlength - 5 , 5);
jQuery('#selector').html(strf + 'inserted' + strb);
您可以使用regexp在一行代码中轻松完成这一任务
const str = 'Hello RegExp!'; Const index = 6; const insert = 'Lovely '; / /“你好RegExp !”.replace (/ ^ ({6 })(.)/, `$ 1的2美元的); const res = str.replace(新的正则表达式(^(。{${指数 }})(.)`), `$ 1 ${插入}$ 2 '); console.log (res);
“你好,可爱的RegExp!”
我想比较使用substring的方法和使用slice的方法分别来自Base33和user113716,为此我写了一些代码
还可以看看这个性能比较,子字符串,切片
我使用的代码创建了巨大的字符串,并将字符串“bar”多次插入到巨大的字符串中
if (!String.prototype.splice) { /** * {JSDoc} * * The splice() method changes the content of a string by removing a range of * characters and/or adding new characters. * * @this {String} * @param {number} start Index at which to start changing the string. * @param {number} delCount An integer indicating the number of old chars to remove. * @param {string} newSubStr The String that is spliced in. * @return {string} A new string with the spliced substring. */ String.prototype.splice = function (start, delCount, newSubStr) { return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount)); }; } String.prototype.splice = function (idx, rem, str) { return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem)); }; String.prototype.insert = function (index, string) { if (index > 0) return this.substring(0, index) + string + this.substring(index, this.length); return string + this; }; function createString(size) { var s = "" for (var i = 0; i < size; i++) { s += "Some String " } return s } function testSubStringPerformance(str, times) { for (var i = 0; i < times; i++) str.insert(4, "bar ") } function testSpliceStringPerformance(str, times) { for (var i = 0; i < times; i++) str.splice(4, 0, "bar ") } function doTests(repeatMax, sSizeMax) { n = 1000 sSize = 1000 for (var i = 1; i <= repeatMax; i++) { var repeatTimes = n * (10 * i) for (var j = 1; j <= sSizeMax; j++) { var actualStringSize = sSize * (10 * j) var s1 = createString(actualStringSize) var s2 = createString(actualStringSize) var start = performance.now() testSubStringPerformance(s1, repeatTimes) var end = performance.now() var subStrPerf = end - start start = performance.now() testSpliceStringPerformance(s2, repeatTimes) end = performance.now() var splicePerf = end - start console.log( "string size =", "Some String ".length * actualStringSize, "\n", "repeat count = ", repeatTimes, "\n", "splice performance = ", splicePerf, "\n", "substring performance = ", subStrPerf, "\n", "difference = ", splicePerf - subStrPerf // + = splice is faster, - = subStr is faster ) } } } doTests(1, 100)
性能上的一般差异充其量是边际的,两种方法都工作得很好(即使在长度~~ 12000000的字符串上)
更新2016:下面是另一个基于一行RegExp方法的原型函数(在未定义或负索引上提供prepend支持):
/**
* Insert `what` to string at position `index`.
*/
String.prototype.insert = function(what, index) {
return index > 0
? this.replace(new RegExp('.{' + index + '}'), '$&' + what)
: what + this;
};
console.log( 'foo baz'.insert('bar ', 4) ); // "foo bar baz"
console.log( 'foo baz'.insert('bar ') ); // "bar foo baz"
之前(回到2012年)只是为了好玩的解决方案:
var index = 4,
what = 'bar ';
'foo baz'.replace(/./g, function(v, i) {
return i === index - 1 ? v + what : v;
}); // "foo bar baz"