includes方法不能单独去重,因其仅返回布尔值且不改变或生成数组;需配合filter等逻辑,如arr.filter((item,index)=>!arr.slice(0,index).includes(item))实现原始值去重。

includes 方法本身不能直接实现数组去重,它只是用于判断某个值是否存在于数组中,返回布尔值。但可以配合 filter 或循环逻辑,手动构建新数组来实现“基于 includes 的去重”,适用于简单类型(如数字、字符串)且对兼容性或可读性有要求的场景。
为什么 includes 不能单独去重?
includes() 是查找方法,不是修改或聚合方法。它不改变原数组,也不生成新结构,因此必须搭配其他逻辑才能完成去重任务。
用 includes + filter 实现基础去重(推荐初学者理解)
核心思路:遍历原数组,对每个元素检查它在当前已处理部分中是否首次出现。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 利用
filter的回调函数参数(item, index, arr) - 用
arr.indexOf(item) === index更简洁,但若坚持用includes,需截取前面部分:arr.slice(0, index).includes(item)
示例代码:
const arr = [1, 2, 2, 3, 3, 4];const unique = arr.filter((item, index) => !arr.slice(0, index).includes(item));
// 结果:[1, 2, 3, 4]
注意“安全”的关键点
所谓“安全”,主要指避免意外行为:
-
仅适用于原始值:对象、数组等引用类型用
includes判断恒为false(因比较的是内存地址),无法正确去重 -
NaN 的特殊处理:
[NaN].includes(NaN)返回true,这点比===更可靠,是 includes 的优势 - 不修改原数组:符合函数式习惯,避免副作用
替代方案对比(什么时候不该用 includes 去重)
虽然能用,但性能和适用性有限:
- 大数据量时,
slice + includes时间复杂度为 O(n²),推荐用Set:[...new Set(arr)] - 需要深比较对象时,应使用自定义逻辑(如 JSON.stringify 或库函数),
includes完全不适用 - 需保留特定规则(如去重但留最后一个),
filter配合lastIndexOf更合适
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










