嵌套循环找两数组公共元素的核心是外层遍历arr1、内层遍历arr2逐个比较,时间复杂度O(m×n),适合小数据或教学;需注意基本类型用===、对象需深比较或按id比对。

用嵌套循环找两个数组的公共元素,核心是外层遍历一个数组,内层遍历另一个数组,逐个比对值是否相等。虽然效率不高(时间复杂度 O(m×n)),但逻辑直观,适合小数据量或教学理解。
基础写法:双 for 循环 + 条件判断
遍历 arr1 的每个元素,对每个元素再遍历 arr2,遇到相等就记录(注意去重):
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5, 6];
const common = [];
for (let i = 0; i < arr1.length; i++) {
for (let j = 0; j < arr2.length; j++) {
if (arr1[i] === arr2[j]) {
// 避免重复添加相同元素
if (!common.includes(arr1[i])) {
common.push(arr1[i]);
}
break; // 找到一个匹配即可跳出内层循环
}
}
}
console.log(common); // [3, 4]
优化点:用 Set 提前去重 + 快速查找
把第二个数组转成 Set,内层循环就变成 O(1) 查找,避免重复调用 includes:
- 先用
new Set(arr2)构建查找集合 - 外层遍历
arr1,用set.has()判断是否存在 - 结果仍用数组收集,或直接用
Set确保唯一性
const arr1 = [1, 2, 2, 3];
const arr2 = [2, 3, 3, 4];
const set2 = new Set(arr2);
const common = [];
for (const item of arr1) {
if (set2.has(item) && !common.includes(item)) {
common.push(item);
}
}
// 或更简洁:[...new Set(arr1.filter(x => set2.has(x)))]
注意相等判断的细节
JavaScript 中 === 严格比较适用于基本类型(数字、字符串、布尔值)。若数组含对象,需自定义比对逻辑:
立即学习“Java免费学习笔记(深入)”;
- 对象不能直接用
===判断是否“内容相同” - 可改用
JSON.stringify(a) === JSON.stringify(b)(仅限可序列化、顺序一致的对象) - 更稳妥的方式是用深比较函数,或提取唯一标识(如
id字段)来比对
不推荐但需了解:嵌套 for + indexOf
有人用 indexOf 替代内层循环,写法略短,但本质仍是嵌套遍历:
const common = [];
for (const x of arr1) {
if (arr2.indexOf(x) !== -1 && !common.includes(x)) {
common.push(x);
}
}
这和双 for 效果类似,只是隐藏了内层循环结构;indexOf 内部仍是线性查找。


















