JavaScript 数组去重技巧大全:高效方法一览

在前端开发中,数组中存在重复元素是常见问题。有效且高性能地去除重复项不仅能提升程序可读性,也能优化性能。以下我们介绍几种实用且高效的 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 数组去重方法后,无论是处理简单数据还是优化复杂流程,都能灵活选用最合适的方案,为项目添加又高效又清晰的代码逻辑。

评论