You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化并缩短比较两数组返回对称差异的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:23:36