TypeScript中构建唯一字符串列表:循环if判断与Set去重方案对比
两种数组去重方案优劣对比
绝大多数场景下,先全量插入再通过Set去重的方案2更优,核心差异可以从几个维度对比:
- 时间性能:
方案1每次调用arr.includes()都要遍历一次现有数组做查找,单次查找时间复杂度是O(n),如果总共有m个待处理元素,最坏情况下(所有元素都唯一)总时间复杂度是O(m²),元素量过百之后性能会有明显下降。
方案2依赖Set的特性,插入、判重的平均时间复杂度都是O(1),全量收集元素的时间是O(m),Set去重加转回数组的时间也是O(m),总时间复杂度稳定在O(m),数据量越大优势越明显。 - 顺序兼容性:
两种方案都能保留元素第一次出现的顺序,ES6标准规定Set会严格按照插入顺序保存元素,所以两种方案的输出结果顺序完全一致。 - 可读性与维护性:
方案2的逻辑拆分更清晰,收集元素和去重两步分开,代码更简洁,不容易出现判断逻辑写错的问题;如果后续需要新增其他去重规则,修改起来也更方便。 - 特殊场景适配:
如果待处理的元素量非常小(比如少于50个),两种方案的性能差异几乎感知不到,你可以按照自己的编码习惯选择;如果在循环中除了去重还需要加其他校验逻辑,方案1的扩展性更好,可以直接在if判断中补充条件。
注意:如果你的运行环境需要兼容ES6之前的旧版本浏览器,不支持Set语法,再优先选择方案1。
两种方案代码示例
方案1:循环内判断去重
if (!arr.includes(newString)) arr.push(newString)
方案2:先全量插入再去重
先将所有字符串全部push进数组,再执行:
arr = [ ...new Set(arr) ]
内容的提问来源于stack exchange,提问作者Francois Venter
相关产品推荐
相关产品推荐

