javascript中set无内置差集方法,但可通过合并其余数组为set并用filter筛选首个数组中不在该set的元素来高效实现,如diff([1,2,3,4],[2,3],[4,5])→[1]。

JavaScript 的 Set 本身不提供直接的“差集”方法,但可以借助其去重和高效查找特性,结合扩展运算符与 filter(),原生实现多个数组的差集(即:属于第一个数组、但不属于其余任一数组的元素)。
理解差集的定义(A − B − C − …)
多个数组的差集通常指:取第一个数组中的元素,排除掉在第二个、第三个……直到最后一个数组中**至少出现过一次**的所有元素。例如:diff([1,2,3,4], [2,3], [4,5]) → [1](只有 1 同时不在 [2,3] 和 [4,5] 中)
用 Set 预建查找表,提升性能
对除第一个数组外的所有数组,转为 Set,利用 Set.has() 的 O(1) 平均查找时间,避免嵌套循环遍历:
- 把
arr2, arr3, ..., arrN合并成一个统一的“排除集合”更简洁(适合求并集后排除) - 或分别建多个
Set,用every()判断是否全都不含该元素(适合语义清晰、需严格满足“不在任一中”)
推荐写法:单个排除 Set + filter
最常用且高效的方式——将所有“要排除的数组”合并去重,构建成一个 Set,再过滤第一个数组:
function diff(arr1, ...otherArrays) {
// 合并其余所有数组,转为 Set 用于快速查找
const excludeSet = new Set(otherArrays.flat());
return arr1.filter(item => !excludeSet.has(item));
}
// 示例
diff([1,2,3,4,5], [2,3], [4,6], [5]); // → [1]
注意:flat() 默认只拍平一层,适合二维输入;若数组嵌套更深,可传参 flat(Infinity) 或手动递归处理。
进阶:保留原始类型与 NaN 安全性
Set 能正确处理 NaN(new Set([NaN]).has(NaN) === true),这点比 Array.includes() 更可靠;同时,Set 对象引用比较仍基于内存地址,如需深比较需另作处理。
若需支持对象差集(按属性比较),不能直接用原生 Set,应改用 Map 键存序列化后的特征(如 JSON.stringify)或自定义哈希逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











