如何优化并缩短比较两数组返回对称差异的JS算法?
优化你的数组对称差异函数
嘿,作为JS新手能独立写出这个对称差异的逻辑已经超棒了!咱们来一步步优化这段代码,既能让它更简洁易读,还能提升性能,顺便学点实用的JS技巧~
先说说原代码的小问题
- 重复创建Set:你在
filter里多次new Set(arr2)、new Set(arr1),每次过滤都重新创建集合,有点浪费性能 - 嵌套三元表达式:多层三元判断可读性太差,后续维护起来很头疼
- 冗余的
every判断:其实我们可以通过直接计算差异来替代这些判断,逻辑更直接
优化版本:清晰优先,兼顾性能
let jo = [1,2,3,5,6]; let ji = [1,2,3,5,4]; const checker = (arr1, arr2) => { // 提前创建两个数组的Set,Set的has方法是O(1),比数组includes的O(n)快很多 const set1 = new Set(arr1); const set2 = new Set(arr2); // 分别计算两个数组的独有序列 const onlyInArr1 = arr1.filter(num => !set2.has(num)); const onlyInArr2 = arr2.filter(num => !set1.has(num)); // 合并两个独有序列并去重(如果原数组有重复元素的话) const symmetricDiff = [...new Set([...onlyInArr1, ...onlyInArr2])]; // 根据结果返回对应内容 return symmetricDiff.length ? symmetricDiff : "no discrepancies"; }; console.log(checker(jo, ji)); // 输出 [6, 4]
更简洁的写法(适合理解逻辑后使用)
如果追求代码简洁,还可以压缩成更短的版本,不过可读性会稍降一点:
const checker = (arr1, arr2) => { const s1 = new Set(arr1), s2 = new Set(arr2); const diff = [...arr1.filter(x=>!s2.has(x)), ...arr2.filter(x=>!s1.has(x))]; return [...new Set(diff)].length ? [...new Set(diff)] : "no discrepancies"; };
知识点小总结
- Set的优势:用
Set存储数组元素后,has方法的查找速度远快于数组的includes,尤其是处理大数据量的时候差异明显 - 对称差异的本质:就是两个数组中所有"只出现在其中一个数组"的元素,所以直接过滤出两边的独有序列再合并就好,不用复杂的
every判断 - 可读性优先:虽然短代码很酷,但团队协作或者自己后续维护时,清晰的逻辑比代码长度更重要哦
内容的提问来源于stack exchange,提问作者Arp
相关产品推荐
相关产品推荐

