JavaScript数组去重可用reduce实现:基础用includes判断,优化用Set提升查找效率,一行版用扩展运算符保持纯函数特性,注意引用类型需自定义比较且原始类型按值去重。

JavaScript 数组去重可以通过 reduce 配合累加器(accumulator)实现,核心思路是:把一个空数组作为初始 accumulator,遍历原数组时,只把**尚未出现过**的元素推入 accumulator。
基础写法:用 includes 判断是否已存在
这是最直观的方式,适合大多数场景:
const arr = [1, 2, 2, 3, 4, 4, 5];
const unique = arr.reduce((acc, item) => {
if (!acc.includes(item)) {
acc.push(item);
}
return acc;
}, []);
console.log(unique); // [1, 2, 3, 4, 5]
优化性能:用 Set 辅助判断(推荐)
当数组较大时,includes 每次都要线性查找,时间复杂度高。可用 Set 记录已见元素,将查找降为 O(1):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
const arr = [1, 2, 2, 3, 4, 4, 5];
const seen = new Set();
const unique = arr.reduce((acc, item) => {
if (!seen.has(item)) {
seen.add(item);
acc.push(item);
}
return acc;
}, []);
console.log(unique); // [1, 2, 3, 4, 5]
一行简洁版(函数式风格)
如果偏好更紧凑的写法,可结合扩展运算符和箭头函数(注意:每次 push 后返回新数组,非原地修改):
立即学习“Java免费学习笔记(深入)”;
- 利用
acc.concat()或[...acc, item]创建新数组 - 避免修改原 accumulator,保持纯函数特性
const arr = [1, 2, 2, 3]; const unique = arr.reduce( (acc, item) => acc.includes(item) ? acc : [...acc, item], [] ); console.log(unique); // [1, 2, 3]
注意事项
使用 reduce 去重时需留意以下几点:
-
引用类型需自定义比较逻辑:对象、数组等无法直接用
===或includes判断相等,需用JSON.stringify或深比较工具 - 原始类型默认按值去重:数字、字符串、布尔值、null、undefined、Symbol 都能正确处理
- 顺序保留:reduce 天然保持首次出现的顺序,无需额外排序

















