用reduce配合includes去重并剔除异常值,需先用Set存null、""、NaN等异常值以支持NaN判断,再在reduce中双重校验:!invalids.has(item) && !acc.includes(item),确保只保留合法且未出现的元素。

用 reduce 配合 includes 去重时剔除特定异常值,核心是:在累积过程中,**只把既不重复、又不属于异常值的元素加入结果数组**。
明确异常值集合,避免每次重复构造
把要剔除的异常值(如 null、undefined、""、NaN 或自定义值)提前存为 Set 或数组,提升 includes 查找效率。注意:NaN 不能用 includes 判断(因为 [NaN].includes(NaN) === false),需单独处理。
- 推荐用
Set存异常值(支持NaN):const invalids = new Set([null, undefined, "", NaN]) - 判断时写成:
!invalids.has(item) && !acc.includes(item) - 若必须用数组且含
NaN,改用acc.some(x => Object.is(x, item))替代includes
reduce 中正确累积:先过滤再查重
不要在 reduce 外预过滤(会丢失原始顺序或影响逻辑),而应在累加器更新前做双重判断:是否合法 + 是否已存在。
- 初始值设为空数组:
[] - 每轮检查:
if (!invalids.has(current) && !accumulator.includes(current)) - 满足则
push,否则跳过
处理对象数组等复杂类型
includes 对对象比较的是引用,直接用会失效。此时需改用属性比对(如 id 字段)或序列化,但 reduce 内部不宜频繁 JSON.stringify。
- 简单方案:用 Map 缓存已见的 key 值,例如:
const seen = new Map(); ... if (!invalids.has(item) && !seen.has(item.id)) { seen.set(item.id, true); acc.push(item); } - 保持 reduce 单一性:可先用
map提取唯一标识,再 reduce 去重,最后关联原对象
完整示例(基础数组)
输入:[1, 2, 2, null, 3, "", 1, NaN, 4];剔除 null、""、NaN
const data = [1, 2, 2, null, 3, "", 1, NaN, 4];
const invalids = new Set([null, "", NaN]);
const result = data.reduce((acc, item) => {
// 处理 NaN 需用 Object.is(Set.has 可识别 NaN,所以这里没问题)
if (!invalids.has(item) && !acc.includes(item)) {
acc.push(item);
}
return acc;
}, []);
// → [1, 2, 3, 4]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











