如何不使用JavaScript内置方法求两个数组的并集?代码调试求助
数组并集问题修复方案
原代码存在的问题
- 重复变量声明:连续使用
let声明a和b,后声明的变量会覆盖前一个,导致第一个测试用例无法生效。 - 未处理自身重复元素:若原数组内部有重复值,当前代码仅做合并,不会去重,不符合常规“并集”的定义(通常并集指所有唯一元素的集合)。
- 内层循环无终止逻辑:找到匹配项后仍会继续遍历数组,造成不必要的性能损耗。
修复方案
方案1:获取去重后的并集(简洁高效版)
利用Set数据结构自动去重的特性,是实现并集最简洁的方式:
// 测试用例1 let a1 = [5, 3]; let b1 = [1, 2, 3, 4, 5]; let union1 = [...new Set([...a1, ...b1])]; console.log(union1); // 输出: [5, 3, 1, 2, 4] // 测试用例2 let a2 = [2, 2]; let b2 = [1, 1]; let union2 = [...new Set([...a2, ...b2])]; console.log(union2); // 输出: [2, 1]
方案2:基于原逻辑修复(手动实现版)
如果要沿用原代码的循环思路,修复后的代码如下:
// 测试用例1 let a = [5, 3]; let b = [1, 2, 3, 4, 5]; // 先处理a自身的重复(若需要去重) let uniqueA = [...new Set(a)]; // 遍历b的每个元素 for (let num of b) { let exists = false; for (let item of uniqueA) { if (num === item) { exists = true; break; // 找到匹配后立即终止循环,提升效率 } } if (!exists) { uniqueA.push(num); } } console.log(uniqueA); // 输出: [5, 3, 1, 2, 4] // 测试用例2 a = [2, 2]; b = [1, 1]; uniqueA = [...new Set(a)]; for (let num of b) { let exists = false; for (let item of uniqueA) { if (num === item) { exists = true; break; } } if (!exists) { uniqueA.push(num); } } console.log(uniqueA); // 输出: [2, 1]
原代码的核心修改点
- 去掉重复的变量声明,每个测试用例使用独立变量避免覆盖。
- 添加
break语句,找到匹配元素后立即终止内层循环,减少无效遍历。 - 增加数组自身去重逻辑,确保最终结果符合“并集”的常规定义。
- 若仅需合并数组保留所有元素(不去重),可直接使用
a.push(...b),但这不属于并集的标准需求。
内容的提问来源于stack exchange,提问作者Asav_Pandya
相关产品推荐
相关产品推荐

