You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为重复单词分配唯一索引并在复制粘贴文本时保留该索引

如何为重复单词分配唯一索引并在复制粘贴文本时保留该索引

我太懂你现在的头疼点了!原来的代码用普通对象存单词和索引,只要单词重复,后面的索引就会直接覆盖前面的,结果所有相同的单词都共用同一个索引,完全没法区分它们在原始文本里的不同出现位置——这肯定没法对应到数据库里的唯一时间码啊!

要解决这个问题,核心得让每个单词的每一次出现都绑定专属的唯一标识,不管用户怎么复制粘贴,这个标识都能跟着走。我给你提供一个简单可靠的方案,用「零宽字符」来隐藏索引信息——这种字符用户完全看不到,但复制粘贴时会自动跟着文本一起走,完美解决追踪问题:

修改后的完整代码

HTML 部分

<h1>Word Index Tracker</h1>
<p>Original Text: <span id="original-text"></span></p>
<textarea id="text-box" rows="5" cols="50" placeholder="Paste text from original here to see unique indexes"></textarea>
<div id="output">Indexes will appear here...</div>

CSS 部分

#output {
  margin-top: 10px;
  padding: 10px;
  border: 1px solid #ccc;
  background: #f9f9f9;
}

#original-text {
  white-space: pre-wrap;
  line-height: 1.5;
}

JavaScript 部分

// 零宽空格字符:完全不可见,但复制粘贴时会被携带
const ZERO_WIDTH_SPACE = '\u200B';

// 原始文本和处理逻辑
const originalString = "As you can see the script does not give unique indexes to words that are duplicated in the script. The gets the same index throughout the script.";
const originalWords = originalString.split(/\s+/);

// 给原始文本的每个单词绑定唯一索引,用零宽字符隐藏
const indexedOriginalText = originalWords
  .map((word, index) => `${word}${ZERO_WIDTH_SPACE}${index}`)
  .join(' ');
// 显示给用户的是正常文本(零宽字符不可见)
document.getElementById('original-text').innerText = indexedOriginalText;

// 文本框和结果输出元素
const textBox = document.getElementById('text-box');
const output = document.getElementById('output');

// 监听文本框输入,解析粘贴内容的唯一索引
textBox.addEventListener('input', () => {
  const pastedContent = textBox.value;
  // 拆分粘贴的内容,过滤出带索引的单词
  const indexedWords = pastedContent.split(/\s+/).filter(item => item.includes(ZERO_WIDTH_SPACE));
  // 提取每个单词的唯一索引
  const uniqueIndexes = indexedWords.map(item => {
    const [_, index] = item.split(ZERO_WIDTH_SPACE);
    return index;
  });
  // 显示结果
  output.innerText = `Unique Indexes of Pasted Words: ${uniqueIndexes.join(', ')}`;
});

方案说明

  1. 零宽字符的妙用:用\u200B这个零宽空格字符把单词和它的原始索引拼接在一起,用户完全看不到这个字符,但复制粘贴时它会跟着文本一起被复制,相当于给每个单词偷偷加了个「身份证号」。
  2. 完美区分重复单词:不管同一个单词在原始文本里出现多少次,每个出现的位置都对应唯一的索引,粘贴后能精准还原它在原始文本里的位置。
  3. 无感知体验:用户操作和看普通文本完全一样,不会有任何额外的学习成本。

如果不想用零宽字符,还有一种备选思路:把原始文本中每个单词的所有出现位置都存成数组(比如const wordOccurrences = []; originalWords.forEach((w,i) => wordOccurrences.push({word: w, index: i}))),然后用户粘贴文本后,把粘贴的单词序列和原始序列做匹配,找到每个单词对应的出现位置。不过这种方法遇到连续重复的单词时,匹配逻辑会复杂很多,不如零宽字符的方案直接可靠。

备注:内容来源于stack exchange,提问作者JulianJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:10:35