嵌套循环找两数组公共元素的核心是外层遍历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 <h3>优化点:用 Set 提前去重 + 快速查找</h3> <p>把第二个数组转成 Set,内层循环就变成 O(1) 查找,避免重复调用 <code>includes</code>:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review"><img src="https://img.php.cn/upload/skill/000/000/081/179084711841712.jpg" alt="Java Maven Code Review" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="overflowclass">Java Maven Code Review</a> <p class="overflowclass">审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。</p> </div> <a rel="nofollow" href="/xiazai/skill6235" title="Java Maven Code Review" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 先用
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 中 === 严格比较适用于基本类型(数字、字符串、布尔值)。若数组含对象,需自定义比对逻辑:
- 对象不能直接用
===判断是否“内容相同” - 可改用
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 内部仍是线性查找。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










