双重循环去重通过外层取元素、内层向后查重,仅保留首次出现项;适合小数据或教学,时间复杂度O(n²),不适用于大数组。

JavaScript 中用双重循环实现数组去重,核心思路是:外层循环取每个元素,内层循环检查该元素在它之后是否重复出现;若未重复,则保留。这种方法适合小数据量、教学理解或兼容极老环境,但时间复杂度为 O(n²),不推荐用于大数组。
基本实现逻辑
遍历原数组,对当前项(设为 arr[i]),从 i + 1 开始向后逐个比较。只要发现相等,就跳过当前项;若整个内层循环都没找到相等项,说明它是首次出现,推入新数组。
代码示例(保留首次出现的元素)
function uniqueByDoubleLoop(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
let isDuplicate = false;
// 检查 arr[i] 在它之后是否已存在
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] === arr[i]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
result.push(arr[i]);
}
}
return result;
}
<p>// 示例
console.log(uniqueByDoubleLoop([1, 2, 2, 3, 1])); // [2, 3, 1]
注意:上面结果是 [2, 3, 1],因为去重逻辑是从后往前“保留最后一次出现”——若要保留第一次出现的,需调整内层循环方向或判断方式。
改为保留首次出现(更常用)
改用“对每个元素,检查它前面有没有重复”,这样能自然保序且留首次:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 外层循环仍遍历全部索引 i
- 内层循环只检查 0 到 i - 1 范围内的元素
- 若 arr[i] 在前面没出现过,就加入结果数组
function uniqueByDoubleLoopFirst(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
let found = false;
for (let j = 0; j < i; j++) {
if (arr[j] === arr[i]) {
found = true;
break;
}
}
if (!found) {
result.push(arr[i]);
}
}
return result;
}
<p>console.log(uniqueByDoubleLoopFirst([1, 2, 2, 3, 1])); // [1, 2, 3]
注意事项与局限
- 仅做 === 严格相等判断,对对象、数组等引用类型无效(它们地址不同即视为不重复)
- 无法处理 NaN(
NaN === NaN为 false),需单独判断 - 性能差,10000 个元素可能明显卡顿,生产环境建议用
Set或filter + indexOf - 字符串大小写敏感,如
'A'和'a'被视为不同
不复杂但容易忽略细节,理解双重循环的执行顺序和边界条件是关键。

















