请协助实现获取两个数组交集的函数(含待调试代码)
修正数组交集函数的方案
首先咱们先拆解下原函数里的几个核心问题:
- 函数内部直接重新声明了
arrF和arrS,这会完全覆盖掉调用时传入的参数,等于白传了 - 判断条件用了
i == j,这是在比较两个数组的索引,不是数组里的元素,逻辑完全错了 - 找到第一个匹配的索引就直接
return了,根本没法收集所有交集元素,而且还把索引i和j塞进了结果数组,不是我们要的元素本身
下面是修正后的函数,我会把逻辑理清楚:
function getIntersect(arrF, arrS) { // 先处理边界情况:如果任一数组为空,直接返回空数组 if (!arrF || !arrS || arrF.length === 0 || arrS.length === 0) { return []; } const nums = []; // 遍历第一个数组的每个元素 for (let i = 0; i < arrF.length; i++) { const current = arrF[i]; // 检查当前元素是否存在于第二个数组中,并且还没被加入结果数组(避免重复) if (arrS.includes(current) && !nums.includes(current)) { nums.push(current); } } return nums; } // 测试一下 const arr1 = [3, 5, 8]; const arr2 = [1, 2, 3, 5, 8]; document.write(getIntersect(arr1, arr2)); // 会输出 3,5,8
如果想要更高效的实现(比如处理大数组时),可以用Set来优化,因为includes的时间复杂度是O(n),用Set的话查找是O(1):
function getIntersect(arrF, arrS) { if (!arrF || !arrS || arrF.length === 0 || arrS.length === 0) { return []; } // 把第二个数组转成Set,提升查找效率 const setS = new Set(arrS); // 用Set去重,再转成数组 return [...new Set(arrF.filter(item => setS.has(item)))]; }
这样不管是小数组还是大数据量的数组,都能高效准确地获取交集啦~
内容的提问来源于stack exchange,提问作者Marie
相关产品推荐
相关产品推荐

