我该如何在另一个字符串的特定索引处插入一个字符串?
var txt1 = "foo baz"
假设我想在“foo”后面插入“bar”,我该如何实现?
我考虑使用substring()
,但肯定有更简单、更直接的方法。
我该如何在另一个字符串的特定索引处插入一个字符串?
var txt1 = "foo baz"
假设我想在“foo”后面插入“bar”,我该如何实现?
我考虑使用substring()
,但肯定有更简单、更直接的方法。
在特定位置插入(而不是在第一个空格字符处插入)必须使用字符串切片/子字符串:
var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
\
${txt1.slice(0,3)}bar${txt1.slice(3)}``。 - Jay你可以将自己的splice()
原型化为字符串。
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));
};
var result = "foo baz".splice(4, 0, "bar ");
document.body.innerHTML = result; // "foo bar baz"
编辑:修改以确保rem
是绝对值。
my_array[my_array.length] = item
而不是my_array.push(item)
吗? - user1106925splice
的说法是正确的;事实上,字符串是不可变的。因此,我认为splice
是一个不恰当的关键词选择。我的主要反对意见是非标准填充(standard polyfills)的原型扩展应该被避免。 - Eirik Birkelandsplice
来插入一个字符串,但它会返回被移除的元素,因此需要多行代码。它可能性能不佳(虽然没有正则表达式逐个字符遍历那么糟糕):const characters = [...originalString]; characters.splice(index, replaceCharCount, stringToInsert); const newString = characters.join("")
- undefined我写了一个与其他编程语言行为相同的方法:
String.prototype.insert = function(index, string) {
if (index > 0)
{
return this.substring(0, index) + string + this.substring(index, this.length);
}
return string + this;
};
//Example of use:
var something = "How you?";
something = something.insert(3, " are");
console.log(something)
{}
。 - Mr-IDEelse
是多余的。 - Bitterblue请编写以下函数:
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.Insert(int startIndex, string value)几乎完全相同。
注意:此插入函数会在字符串str(第一个参数)中指定的整数index(第二个参数)之前插入字符串value(第三个参数),然后返回新字符串而不更改str!
这种方法的好处有两个:
const pair = Array.from('USDGBP')
pair.splice(3, 0, '/')
console.log(pair.join(''))
2016年更新: 这里有另一个基于一行代码的RegExp
方法的只是为了好玩(但更加严谨!),支持在undefined
或负index
下插入的前置功能:
/**
* 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"
originalString.replace( new RegExp(
(?<=.{${ index }}), "su" ), stringToInsert )
它会自动匹配字符串的开头,无需使用开头锚点。为什么这样一个非常标准的操作在原生JS中仍然不可用呢? - undefined我基本上正在做@Base33所做的事情,只是我还提供了使用负索引从末尾计数的选项。有点像substr方法允许的那样。
// use a negative index to insert relative to the end of the string.
String.prototype.insert = function (index, string) {
var ind = index < 0 ? this.length + index : index;
return this.substring(0, ind) + string + this.substr(ind);
};
例如:假设您有按照命名约定的全尺寸图像,但无法更新数据以提供缩略图URL。
var url = '/images/myimage.jpg';
var thumb = url.insert(-4, '_thm');
// result: '/images/myimage_thm.jpg'
如果有人正在寻找一种在字符串中插入文本的多个索引的方法,请尝试以下方法:
String.prototype.insertTextAtIndices = function(text) {
return this.replace(/./g, function(character, index) {
return text[index] ? text[index] + character : character;
});
};
例如,您可以使用此功能在字符串中的特定偏移处插入<span>
标签:
var text = {
6: "<span>",
11: "</span>"
};
"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
6: "<span>"
表示在索引6处插入文本"<span>"。您是说要使用整数变量的值作为插入索引吗?如果是这样,请尝试类似于var a=6, text = {}; text[a] = "<span>";
的方法。 - Jake Stoeffler考虑到您当前的示例,您可以通过以下方式实现结果:
var txt2 = txt1.split(' ').join(' bar ')
或者var txt2 = txt1.replace(' ', ' bar ');
但是,如果您能够做出这样的假设,那么最好直接跳到Gullen的示例。
在您确实无法做出任何假设而只能依赖于字符索引时,我会选择使用子字符串解决方案。
my_string = "hello world";
my_insert = " dear";
my_insert_location = 5;
my_string = my_string.split('');
my_string.splice( my_insert_location , 0, my_insert );
my_string = my_string.join('');