javascript数组去重需区分null/undefined是否合并:用set可保留二者差异并去重;若视为空值统一处理,需filter配合自定义key(如'nullish');兼容旧环境可用对象模拟哈希表,但对复杂类型有局限。

JavaScript 中去重包含 undefined 和 null 的数组,关键在于明确“去重”的语义:是否把 null 和 undefined 视为相同值?默认情况下它们不相等(null !== undefined),但实际业务中常需按“空值”统一处理。下面提供几种常用、可靠的方式。
用 Set + 显式过滤(推荐:保留 null/undefined 且互不合并)
如果希望保持 null 和 undefined 的区分,并只去除完全相同的重复项(如多个 null 留一个,多个 undefined 也留一个),最简洁安全的方式是直接用 Set:
const arr = [1, null, 'a', undefined, null, 1, undefined]; const unique = [...new Set(arr)]; // → [1, null, 'a', undefined]
Set 本身基于 SameValueZero 比较,能正确区分 null 和 undefined,也兼容 NaN、对象等。这是最符合 JavaScript 原生语义的方案。
把 null 和 undefined 归为一类去重(业务常见需求)
若你认为 null 和 undefined 都代表“缺失值”,希望它们互相视为重复(即出现一个 null 后,后面的 undefined 就被去掉了),可用 filter + 自定义标记逻辑:
const arr = [1, null, 'a', undefined, null, 1, undefined];
const seen = new Set();
const unique = arr.filter(item => {
const key = item === null || item === undefined ? 'NULLISH' : item;
if (seen.has(key)) return false;
seen.add(key);
return true;
});
// → [1, null, 'a']
- 用字符串
'NULLISH'统一代表所有空值,避免null和undefined冲突 - 原始值(数字、字符串等)仍用自身作 key,保证类型安全
- 不修改原数组,返回新数组
兼容旧环境(不支持 Set 时的替代写法)
若需支持 IE 或极老运行时,可用对象或数组模拟哈希表:
function uniqueNullishSafe(arr) {
const seen = {};
const result = [];
for (const item of arr) {
// 用唯一字符串 key:null→'n',undefined→'u',其余转字符串(注意对象会变成 '[object Object]')
const key = item === null ? 'n' :
item === undefined ? 'u' :
typeof item === 'object' ? JSON.stringify(item) : String(item);
if (!seen[key]) {
seen[key] = true;
result.push(item);
}
}
return result;
}
⚠️ 注意:该方式对对象、函数、Symbol 等复杂类型有局限,仅适用于简单数据。生产环境建议优先用 Set 或引入 polyfill。
一行式小技巧(仅限简单原始值)
如果数组只含数字、字符串、null、undefined,且不介意把它们全转成字符串比较(例如 0 和 '0' 会被视为相同),可这样写:
[...new Set(arr.map(i => i == null ? 'NULLISH' : i))].map(i => i === 'NULLISH' ? undefined : i);
但这种方式隐式类型转换风险高,不推荐在关键逻辑中使用。
实际选哪种,取决于你的数据结构和语义要求。多数情况用 [...new Set(arr)] 就够了;需要合并空值时,自定义 filter 最灵活可控。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











