JavaScript中includes与reduce配合可实现数组去重:用reduce遍历原数组,通过includes检查当前元素是否已在累加器数组中,若未存在则push加入;但存在O(n²)性能问题且不适用于引用类型。

JavaScript 中 includes 和 reduce 可以配合使用实现数组去重,核心思路是:用 reduce 遍历原数组,每次检查当前元素是否已存在于累加器(新数组)中,若不存在则用 push 添加进去。
基本写法(适用于简单类型)
对数字、字符串等基础类型,可直接用 includes 判断是否存在:
const arr = [1, 2, 2, 3, 4, 4, 5];
const unique = arr.reduce((acc, current) => {
if (!acc.includes(current)) {
acc.push(current);
}
return acc;
}, []);
console.log(unique); // [1, 2, 3, 4, 5]
注意点与常见问题
-
性能考虑:每次调用
includes都要遍历累加器数组,时间复杂度为 O(n²),大数据量时不推荐 -
引用类型不适用:对象、数组等引用类型用
includes判断恒为false(除非是同一引用),无法真正去重 -
累加器需为数组:初始值必须是空数组
[],否则push或includes会报错
优化建议(兼顾可读与效率)
如果仍想用 reduce + includes,可先用 Set 提前去重再转回数组,或改用 filter + indexOf 等更简洁方式。但若坚持用 reduce,可结合 Set 缓存已见元素提升性能:
const arr = [1, 2, 2, 3, 4, 4, 5];
const seen = new Set();
const unique = arr.reduce((acc, current) => {
if (!seen.has(current)) {
seen.add(current);
acc.push(current);
}
return acc;
}, []);
替代方案(更常用、更高效)
-
一行式 Set 去重:
[...new Set(arr)]—— 最简洁,适合基础类型 -
filter + indexOf:
arr.filter((item, i) => arr.indexOf(item) === i)—— 兼容性好,语义清晰 -
reduce + Object 键去重(针对对象数组):按某个字段(如
id)判断是否重复
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











