如何比较两个数值数组并返回其中的唯一值?
问题分析与解决
你的代码核心问题有两个:in关键字的误用,以及运算符优先级错误,另外还没处理重复元素的问题。
为什么原代码没效果?
in关键字用错了:in是用来检查对象的属性名/数组索引,不是检查数组里是否包含某个值。比如你写a[i] in b,当a[i]是3时,实际是检查数组b有没有索引为3的元素(也就是第4个元素),而不是检查b里有没有值3。- 运算符优先级错误:
!a[i] in b会先计算!a[i](比如数值3取反是false),然后判断false in b,也就是检查b的属性名里有没有"false",这完全和你的需求无关。
修复方案
方案一:用includes()修复原逻辑(适合新手理解)
把in换成Array.prototype.includes()(专门检查数组是否包含某个值),同时添加重复判断,避免结果数组里出现重复元素:
//找出这些数组中的唯一值 let array1 = [1,2,2,2,3] let array2 = [1,2,2,4] function unique(a, b) { let returnArray = [] // 处理array1中独有的元素,去重后添加 for (let num of a) { if (!b.includes(num) && !returnArray.includes(num)) { returnArray.push(num) } } // 处理array2中独有的元素,去重后添加 for (let num of b) { if (!a.includes(num) && !returnArray.includes(num)) { returnArray.push(num) } } return returnArray } console.log(unique(array1, array2)) // 输出 [3,4]
方案二:用Set优化效率(推荐)
Set的查找效率比数组includes()高很多,适合处理大数据量的情况:
let array1 = [1,2,2,2,3] let array2 = [1,2,2,4] function unique(a, b) { const setA = new Set(a); const setB = new Set(b); const result = []; // 筛选出只在array1里出现的元素 for (let num of setA) { if (!setB.has(num)) { result.push(num); } } // 筛选出只在array2里出现的元素 for (let num of setB) { if (!setA.has(num)) { result.push(num); } } return result; } console.log(unique(array1, array2)) // 输出 [3,4]
内容的提问来源于stack exchange,提问作者Jeremy P
相关产品推荐
相关产品推荐

