在前端开发中,数组中存在重复元素是常见问题。有效且高性能地去除重复项不仅能提升程序可读性,也能优化性能。以下我们介绍几种实用且高效的 JavaScript 数组去重方法,适用于不同开发场景。
6 种 JavaScript 数组去重方法示例
1. 使用 Set(推荐简洁高效)
ES6 引入的 Set 数据结构天然去重,将数组转换为 Set 再展开回数组,是最简洁的方式:
const uniqueArray = [...new Set(array)];
此方法快速、兼容现代浏览器,是首选方案。
2. 使用 filter + indexOf(经典兼容方案)
借助 filter() 方法结合 indexOf() 判断每个元素是否首次出现,适配更老环境:
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
简单易懂,是纯原生 JavaScript 的常见写法。
3. 使用 forEach + includes(直观手写方式)
通过遍历原数组,再用 includes() 判断是否已收录,逻辑直观:
const uniqueArray = [];
array.forEach(item => {
if (!uniqueArray.includes(item)) {
uniqueArray.push(item);
}
});
适合希望手动控制流程的场景,也便于扩展额外逻辑。
4. 使用 reduce + includes(函数式风格)
使用 reduce() 在累加过程中判断并构建新数组,风格优雅:
const uniqueArray = array.reduce((acc, curr) => {
return acc.includes(curr) ? acc : [...acc, curr];
}, []);
适合追求函数式编程风格的开发者。
5. 使用对象或 Map 记录(适用于性能优化)
使用临时对象或 Map 来判断元素是否已处理过,从而跳过重复项:
const seen = {};
const uniqueArray = array.filter(item => {
if (seen[item]) return false;
seen[item] = true;
return true;
});
此方法减少重复判断,可提高大型数据集的性能表现。
6. ES5 双重循环 + splice(古老但直观)
通过嵌套循环比对每个元素,如重复则通过 splice() 删除:
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
逻辑清晰,但时间复杂度较高,容易影响性能。
总结建议:选择适合你的去重方式
- 追求简洁与现代兼容性:首选 Set 写法,代码最少且高效。
- 广泛浏览器支持:filter + indexOf 是安全兼容的经典选择。
- 希望灵活扩展或调试:使用 forEach 或 reduce,便于插入逻辑。
- 面对大规模数据:可考虑对象/Map 记录方式提升性能。
- 面对旧代码或学习目的:双重循环 + splice 虽然低效,但逻辑明了。
掌握这些 JavaScript 数组去重方法后,无论是处理简单数据还是优化复杂流程,都能灵活选用最合适的方案,为项目添加又高效又清晰的代码逻辑。