浏览器去重最稳方式是用 set,需先 trim、过滤空行、清理不可见字符;按行或按词处理取决于输入格式;提取 html 文本应优先用 domparser + textcontent,而非 innertext。

直接用 Set 去重,别手写 for 循环
浏览器里去重最稳的方式就是 Set,不是自己写 quchong() 或嵌套 for。它天然忽略重复字符串,且对空字符串、null、undefined 有明确定义(Set 会把它们当不同值存,所以得提前过滤)。
常见错误是:没 .trim() 就塞进 Set,导致 "abc" 和 "abc " 被当成两个项;或者用 innerHTML 直接取 HTML 字符串,结果把 <div>、<code> 、注释都算进去了。
- 必须先标准化:每行做
.trim(),再过滤掉空行 ——line.trim() !== '' - 大小写是否敏感?统一转小写:
new Set(lines.map(l => l.trim().toLowerCase())) - 要保留原始格式?改用
Map:键是l.trim().toLowerCase(),值是原l.trim() - 别对整个 HTML 字符串调
Set,先用DOMParser提纯:new DOMParser().parseFromString(html, 'text/html').body.textContent
按行去重还是按词去重?先看输入格式
用户粘贴的文本决定你该用哪种切分逻辑。工具行为不一致,90% 是因为没区分这两类场景。
比如用户复制的是关键词列表,每行一个:
apple<br>banana<br>apple<br>cherry
这属于「按行去重」,直接
.split(/\r\n|\r|\n/) 即可。但如果用户粘贴的是 CSV 片段:apple, banana, apple, cherry
那就得先按逗号/空格/中文顿号切分,再 .map(s => s.trim()),最后进 Set。
- 按行处理:用正则
/\r\n|\r|\n/g统一换行符,避免 Windows/Mac/Linux 换行差异 - 按词处理:分隔符不能硬写成
',',得支持[,\s+、|/]这类混合模式 - 分隔后务必
.filter(s => s),否则空格切出会得到['apple', '', 'banana'] - 拼回结果时,别默认全用
\n—— UI 上应提供“保持原分隔符”或“统一换行”选项
DOMParser 提取文本比 innerText 更可靠
想从 HTML 字符串里提取用户真正看到的文本,innerText 看似方便,但它依赖 CSS 渲染状态(比如 display: none 的内容不会被取到),还受字体加载、伪元素影响,线上工具一跑就漏内容。
DOMParser 是唯一推荐路径,它不渲染,只解析结构,textContent 返回所有文本节点内容,稳定、快、不依赖样式。
- 基础用法:
const doc = new DOMParser().parseFromString(htmlStr, 'text/html'); - 取全部可见文本:
doc.body?.textContent || ''(注意 body 可能为 null,加可选链) - 只取某类标签内容:比如只要
<p></p>和<li>,用doc.querySelectorAll('p, li')遍历 +el.textContent - 过滤脚本、样式、注释块:不用手动删,
textContent天然不包含它们
去重后要不要排序?升序/降序/原序得说清
很多工具默认“去重完自动按字母排”,但用户可能只想去重、保留原始顺序。这不是功能缺陷,是设计没暴露选项。
去重本身不保证顺序 —— Set 在 ES2015+ 里是插入顺序保留的,但如果你中间做了 Array.from(set).sort(),顺序就变了。关键点在于:去重和排序是两个独立操作,必须解耦。
- 保留原始顺序:用
filter()+indexOf()或Map记首次出现位置 - 数值排序别漏
parseFloat:否则'10' 成立,得写 <code>(a, b) => parseFloat(a) - parseFloat(b) - 容错 NaN:
parseFloat('abc')返回NaN,会导致整个数组排序乱序,得提前.filter(v => !isNaN(parseFloat(v))) - 版本号类排序(如 v1.10.2)不能靠
parseFloat,得用localeCompare(…, undefined, { numeric: true })
最易被忽略的其实是空格和不可见字符 —— 用户复制的文本常含 (零宽空格)、\u200b、BOM 头,这些肉眼看不见,但会让 "abc" 和 "abc\u200b" 被视为不同项。上线前务必加一行 .replace(/[\u200b-\u200f\u202a-\u202f\u2060-\u206f\ufeff]/g, '') 清理。











