Set本身不自动过滤空值或无效项,仅去重;需先用filter清理(如null、undefined、''、NaN),再用Set去重有效值,0和false是否过滤取决于业务逻辑。

JavaScript 中 Set 本身不会自动“过滤”空值或无效项,它只是去重容器;要实现“过滤掉重复的空值或无效项”,需要先用 filter() 清理无效数据,再用 Set 去重有效值。
什么是“无效项”?明确过滤标准很关键
空值(null)、未定义(undefined)、空字符串('')、NaN、0(有时也视为假值)等常被视为无效。但注意:0 和 false 是合法值,是否过滤取决于业务逻辑。推荐显式判断,避免误删:
-
null和undefined:用item == null(宽松相等)或item === null || item === undefined - 空字符串:
item === '' -
NaN:用Number.isNaN(item)(不推荐item !== item) - 仅排除所有假值(慎用):
Boolean(item)或!!item—— 会同时去掉0、false、''等
一步到位:filter + Set 构造
最常用写法:先过滤,再转为 Set,最后可选转回数组:
const arr = [1, '', null, 2, undefined, 1, 'a', 0, 'a', NaN]; const uniqueValid = [...new Set(arr.filter(item => item != null && item !== '' && !Number.isNaN(item) ))]; // 结果:[1, 2, 'a', 0] —— 注意:0 被保留了,因满足上述条件
若想连 0 和 false 也剔除,可改为:
立即学习“Java免费学习笔记(深入)”;
arr.filter(Boolean).filter(item => !Number.isNaN(item))
但注意:Boolean(NaN) 是 false,所以 filter(Boolean) 已能筛掉 NaN、null、undefined、''、0、false。
处理对象或复杂类型时的注意事项
Set 对对象、函数、数组等引用类型按内存地址判重,不是按内容:
-
new Set([{a:1}, {a:1}])→ 含两个元素(地址不同) - 如需按内容去重,不能只靠
Set,得手动filter+some或用Map序列化键 - 对含空值的对象数组,建议先
filter掉null/undefined,再按需深比较
不想用 Set?Array.from + filter 也能去重
如果目标只是得到去重后的数组(且需兼容旧环境),可用:
const arr = [1, 1, '', null, 2, 2]; const uniqueValid = Array.from( new Set(arr.filter(item => item != null && item !== '')) );
效果与 [...new Set(...)] 完全一致,语法稍长但语义更清晰。


















