我正面临着一个与HTML Package 标志词有关的问题。标志字响应来自第三方服务,作为对象数组。段落文本是这样的:
Hi, my nme is John, and I am from uas.\\nthis sentce dones mke sense.\\nHi, my nme is John, and I am from uas.
字符串
标志字响应是这样的:
[
{ offset: 7, token: 'nme', type: 'UnknownToken' },
{ offset: 52, token: 'dones', type: 'UnknownToken' },
{ offset: 58, token: 'mke', type: 'UnknownToken' }
]
型
我想用下面的HTML标记 Package 标志标记。
<span class="underline">nme</span>
型
响应已经有了offset
和token
键,但是我的逻辑没有正确地处理这些键,我正在替换偏移索引上的字符串,但是输出不正确。
我的逻辑:
function replaceAt(str, index, replacement) {
return (
str.substring(0, index) +
replacement +
str.substring(index + replacement.length)
);
}
let input = `Hi, my nme is John, and I am from uas.\\nthis sentce dones mke sense\\nHi, my nme is John, and I am from uas.`;
const flagTokens = [
{ offset: 7, token: "nme", type: "UnknownToken" },
{ offset: 52, token: "dones", type: "UnknownToken" },
{ offset: 58, token: "mke", type: "UnknownToken" },
];
flagTokens.forEach((item) => {
input = replaceAt(
input,
item.offset,
`<span class="underline">${item.token}</span>`
);
});
console.log("Output:", input);
型
输出:
Hi, my <span class="underline">nme</span>his sentce <span <span class="underline">mke</span>
型
如何解决这个问题?
6条答案
按热度按时间x7rlezfr1#
你的代码有两个问题。
第一个是在替换第一个标记后,字符串变长了,现在其余标记的偏移量是错误的,因为它们向前移动了。一个解决方案是从最后一个到第一个应用替换(* 因为它们是按偏移顺序排序的 *)
第二个问题是,您的替换方法
replaceAt
在插入替换文本后,它继续添加str.substring(index + replacement.length)
。但这是错误的。您只需要添加token
长度,而不是replacement
长度。所以你也应该在函数中传递它。字符串
0ejtzxu12#
使用
replace()
代替个字符
enxuqcxy3#
替代解决方案。这个错误被加布里埃尔漂亮地强调了出来。
dxxyhpgq4#
我认为
.replace()
是一个很好的和优雅的解决方案,一般情况下,你想“下划线”所有或只是第一次出现的给定令牌,但它的斗争,如果你想强调那些在特定的索引,就像你在你的flagToken
数组,因为你可能不想强调所有或只是第一次出现的给定令牌,而是如果它们出现多次则是特定的一个。一个选项是循环遍历字符串。如果索引没有出现在
flagTokens
数组中,那么可以将当前字符添加到结果字符串(res
)中。如果索引在数组中显示为offset
,则可以将 Package 在<span>
中的标记添加到结果字符串res
中,然后将token
的长度添加到当前索引(跳过标记的其余部分),然后处理字符串的其余索引。通过保持原始的input
字符串不变,您不必担心根据<span>...</span>
添加的字符调整偏移量,因为这些字符被添加到res
中,例如:个字符
ybzsozfc5#
最简单的解决方案是从最后开始,这样你就不必担心要添加到字符串中的字符。
字符串
另一种选择是跟踪您添加的内容并将其添加到偏移量中
型
r1zhe5dt6#
也许这个解决方案就是你正在寻找的
字符串
产出
型