在一个字符串中插入多个字符串,而不调整索引更改



我遇到的难题如下:我有一个字符串的索引对数组,其中必须插入一个字符(子数组中的第三项((注意,这些索引对可以是重复的(,例如

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];
let my_string = "This is a very important string";
for (let i = 0; i < arr.length; i++) {
// magic code
}
// => my_string now equals "7hth2is i7hs a 2vejry imjportant string";

我不能只在每个索引处插入字符,因为数组中的下一对索引将过期,因为前一对索引会更改字符串,从而导致每个字符都有新的索引。

我还尝试过根据索引对对对字符串进行切片(将它们用作起始索引和结束索引(,并在再次将它们合并在一起之前将字符插入到这些子字符串中,但问题是,如果两对索引重叠,则原始字符串的部分会重复。

注意:数组按从对中最小的第二个索引到最大的顺序排序,如上所示。这是可以改变的。但是,数组将始终包含成对的索引,即我不能将数组展平为仅索引,因为数组的第三项是我要插入的字符。

我尝试过的另一件事是从索引对数组的末尾到开头,但索引对可以重叠的事实再次意味着这不起作用。

如何在索引对数组中的每个索引处插入字符?

提前感谢您的帮助。

您可以创建一个包含字符串的标记对象,其中每个字符串项指定要插入该索引的字符串。例如,来自

[[0, 6], [0, 6], [2, 10]]

以及插入['x', 'y', 'z']、构建的字符数组

{
0: 'xy',
2: 'z',
6: 'xy',
10: 'z'
}

然后,您可以使用正则表达式来匹配任何位置(不匹配任何字符(,并使用其回调函数来查找对象上的当前索引,并替换为该点上的所有字符(如果有的话(:

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];
const obj = {};
for (const [left, right, char] of arr) {
obj[left] = (obj[left] || '') + char;
obj[right] = (obj[right] || '') + char;
}
const my_string = "This is a very important string";
console.log(
my_string.replace(
/(?:)/g,
(_, index) => obj[index] || ''
)
);

您可以在字符串中循环,而不是在数组中循环。

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];
let my_string = "This is a very important string";
let str2 = ''
for (let i = 0; i < my_string.length; i++) {
str2 += arr.filter(x => x.includes(i))
.reduce(( total, current) => total + current[2],'') + my_string[i];
}
console.log(str2);

filter将在arr中保留那些包含循环的当前索引(i(的元素。

如果filter的输出不是空的,那么reduce将连接它们的所有第三个元素。最后在末尾添加当前的CCD_ 7元素。

如果filter的输出为空,reduce将不执行任何操作,因此只有my_string中的当前字符连接到str2

结果:

7hTh2is i7hs a 2vejry imjportant string

最新更新