我需要比较两个字符串,一个是所有字符,另一个是有一些隐藏。我需要使用CSS标记的差异
示例:字符串:123哈哈哈321哈哈哈123哈哈哈
字符串:123***321***123***
result: '123哈哈哈321哈哈哈123哈哈哈'
我试着对Astring
和Bstring
使用split,并使用forEach
将差异与索引进行比较,当我获得索引时,我可以使用forEach
,运行Astring.split('')
,并将Astring.split('')
与索引进行比较,此索引使用CSS
let resultDom = document.querySelector('.resultDom')
let aStringWithSplit = [1, 2, 3, '哈', '哈', '哈', 3, 2, 1, '哈', '哈', '哈', 1, 2, 3, '哈', '哈', '哈']
let bStringWithSplit = [1, 2, 3, '*', '*', '*', 3, 2, 1, '*', '*', '*', 1, 2, 3, '*', '*', '*']
let getIndexWithHidden = []
let result = ''
bStringWithSplit.forEach((item, index) => {
if (item === '*') {
getIndexWithHidden.push(index)
}
})
aStringWithSplit.forEach((item, index) => {
if (getIndexWithHidden.indexOf(index) !== -1) {
result += `<span style='color: red;'>${item}</span>`
} else {
result += `<span>${item}</span>`
}
})
resultDom.innerHTML = result
<div class='resultDom'></div>
但是这个结果有很多<span>
,如果这个字符串太长,我该如何改进这个代码?
3条答案
按热度按时间yyhrrdl81#
要减少
<span>
的数量,可以将相邻的相似值分组,并将它们全部添加到一个<span>
中,下面是一个示例:这里,我使用
b.split(/(\*+)/)
将掩码字符串拆分为相邻的*
组和相邻的其他字符组。然后,我减少组数组,使用
a.substring(acc.prevIndex, acc.prevIndex + curr.length)
(其中acc.prevIndex
是到目前为止已经处理的字符数,curr.length
是当前组的长度)从需要处理的字符串中获取字符,然后,如果组中全部是*
字符,则将它们添加到<span>
中。xtfmy6hx2#
你的代码看起来应该可以比较两个字符串,并使用CSS标记差异。需要注意的是,你使用了一个DOM元素(resultDom)来存储结果,但你可能想把结果存储在一个变量中。这将使以后更容易操作和访问结果。
另外,你可以使用一个for循环来迭代两个数组,并比较每个索引的值,这样就不需要使用.forEach()方法和.indexOf()方法了,下面是一个例子来说明你是如何做到这一点的:
在此输入代码
eoxn13cs3#
你不需要拆分任何东西,因为字符串已经可以像数组一样被索引了,而且你只需要运行一次循环,因为你知道字符串的长度是一样的。
而且,正如Rene van der Lende在评论中指出的,如果文本是彩色的,您只需要添加一个
<span>
标记。我还使用了ternary operator而不是if-else语句来缩短代码,这不是必需的,但是看起来更好。