双重循环去重时间复杂度为o(n²),仅适用于极小规模数据;推荐用set/map/对象哈希实现高效去重,若必须用双重循环则应外层遍历、内层查result数组以保留首次出现元素。

双重循环可以实现数组去重,但它并不高效——时间复杂度是 O(n²),只适合极小规模数据(比如几十个元素)的简单场景。真正高效的方式是用 Set、Map 或对象哈希,但如果你明确需要基于双重循环来理解或兼容老环境,下面给出清晰、正确、可落地的写法和关键提醒。
基础双重循环去重(保留首次出现)
核心逻辑:外层遍历每个元素,内层检查该元素在它之前是否已存在;若未出现过,则保留。
- 用一个新数组
result存放去重结果 - 外层用
for遍历原数组,索引为i - 内层从
0到i-1检查arr[i]是否已在result中(或直接查原数组前段) - 推荐查
result数组,语义更清晰且避免引用类型误判问题
示例代码:
function uniqueWithDoubleLoop(arr) {
const result = [];
for (let i = 0; i
注意:原始数组“自身比对”容易出错
有人会写内层循环查 arr[0] ~ arr[i-1],看似省空间,但有隐患:
- 对 NaN:
NaN === NaN为false,导致 NaN 被重复保留 - 对 对象/数组:
[1] === [1]为false,即使内容相同也判为不重复,实际可能不符合预期 - 若需深比较,双重循环会急剧加重负担,不应在该模式下硬扛
性能对比与替代建议
同样去重 10,000 个数字:
- 双重循环:约需 5000 万次比较,浏览器明显卡顿
-
[...new Set(arr)]:一次遍历 + 哈希查找,几乎常数时间判断 -
arr.filter((v, i) => arr.indexOf(v) === i):简洁但内部仍含隐式循环,性能不如 Set
除非受限于运行环境(如必须支持 IE8)、或教学演示需要,否则不建议用双重循环做真实项目中的去重。
如果必须用循环,优先选单层 + 辅助结构
兼顾可读性与效率的折中写法(非双重,但符合“手写循环”需求):
function uniqueWithRecord(arr) {
const seen = {};
const result = [];
for (let i = 0; i
⚠️ 注意:该方法对对象依赖 JSON.stringify,键序敏感、忽略函数/undefined/Symbol,仅作轻量参考。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











