JS子串文本替换为<span>递归

JS substring text replace with <span> recursive

我有一个字符串"Hello, this is a text string."

我有一个数组

[{start: 0, length: 5, color: "red"}, {start: 3, length: 5, color: "yellow"}]

我想弄清楚如何用 类 的元素替换这些值。本来,我只是做了一个从头到尾递归的子串。但是,元素可能会重叠,从而导致计数问题。显然一次只能显示一种颜色,但我仍然希望代码能够执行,即使用户想要突出显示两个相同的点。

有什么方法可以轻松做到这一点?

首先,您可以检查每个字母应该分配给什么颜色,然后您可以从中构建您的 HTML 结构。 (以下示例尚未经过深入测试;在生产中使用之前请自行测试。)

var string = "Hello, this is a text string.";
var requirements = [
   {start: 0, length: 5, color: "red"},
   {start: 3, length: 5, color: "yellow"},
   {start: 0, length: 10, color: "blue"},
   {start: 9, length: 15, color: "green"}
];
var result = [];

for(var i = 0; i < string.length; i++) {
  result[i] = {
    letter: string[i],
    colors: []
  };
  for(var j = 0; j < requirements.length; j++) {
    if(i === requirements[j].start || (i > requirements[j].start && i < requirements[j].start + requirements[j].length)) {
      result[i].colors.push(requirements[j].color);
    }
  }
}

var output = "";
var isColoring = false;
for(var l = 0; l < result.length; l++) {
  if(result[l].colors.length) {
    if(!isColoring || (result[l-1] && result[l-1].colors[0] && result[l-1].colors[0] !== result[l].colors[0])) {
      output += '<span class="' + result[l].colors[0] + '">';
      isColoring = true;
    }
  } else {
    isColoring = false;
  }
  output += result[l].letter;
  if(result[l].colors.length) {
    if(isColoring && !(result[l+1] && result[l+1].colors[0] && result[l+1].colors[0] === result[l].colors[0])) {
      output += '</span>';
      isColoring = false;
    }
  }
}

document.querySelector('.text-wrapper').innerHTML = output;
document.querySelector('.requirements').innerHTML = JSON.stringify(requirements, null, 3);

console.log(output);
.red { color: red; }
.yellow { color: yellow; }
.blue { color: blue; }
.green { color: green; }
<pre class="text-wrapper"></pre>
<pre class="requirements"></pre>