美文网首页@IT·互联网
JavaScript 数组去重的多种实现方式

JavaScript 数组去重的多种实现方式

作者: vvilkin | 来源:发表于2025-03-12 09:46 被阅读0次

在实际开发中,我们经常会遇到需要对数组进行去重的场景。JavaScript 提供了多种方式来实现数组去重,本文将介绍几种常见的方法,并分析它们的优缺点,帮助你在不同场景下选择最合适的方案。


1. 使用 Set 去重

Set 是 ES6 引入的一种数据结构,它只允许存储唯一的值。利用这一特性,可以非常简洁地实现数组去重。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 代码简洁,易于理解。
  • 性能较好,时间复杂度为 O(n)。

缺点:

  • 无法直接处理对象数组的去重(因为对象是引用类型)。

2. 使用 filterindexOf

通过 filter 方法结合 indexOf,可以过滤掉数组中重复的元素。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.filter((item, index) => array.indexOf(item) === index);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 兼容性好,支持 ES5 及更早的环境。
  • 适用于简单数据类型的去重。

缺点:

  • 性能较差,时间复杂度为 O(n²),因为 indexOf 需要遍历数组。

3. 使用 reduce

reduce 方法可以将数组中的元素累积到一个新数组中,同时过滤掉重复的值。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = array.reduce((acc, item) => {
  if (!acc.includes(item)) {
    acc.push(item);
  }
  return acc;
}, []);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 灵活性高,可以在累积过程中添加额外逻辑。
  • 适用于复杂场景。

缺点:

  • 代码稍显冗长。
  • 性能不如 Set,因为 includes 需要遍历数组。

4. 使用 forEachincludes

通过 forEach 遍历数组,并使用 includes 检查元素是否已经存在于新数组中。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [];
array.forEach(item => {
  if (!uniqueArray.includes(item)) {
    uniqueArray.push(item);
  }
});
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 逻辑清晰,易于理解。
  • 适用于简单场景。

缺点:

  • 性能较差,时间复杂度为 O(n²)。

5. 使用 Map

Map 是一种键值对数据结构,可以利用它来存储唯一值,然后将 Map 转换回数组。

const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = Array.from(new Map(array.map(item => [item, item])).map(([key]) => key);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 性能较好,时间复杂度为 O(n)。
  • 适用于需要更复杂操作的场景。

缺点:

  • 代码稍显复杂。

6. 使用 lodash

如果你不介意使用第三方库,lodash 提供了一个非常方便的 uniq 方法。

const _ = require('lodash');
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = _.uniq(array);
console.log(uniqueArray); // 输出: [1, 2, 3, 4, 5]

优点:

  • 代码简洁,功能强大。
  • 支持对象数组的去重。

缺点:

  • 需要引入第三方库,增加项目体积。

总结

方法 优点 缺点 适用场景
Set 简洁、性能好 无法直接处理对象数组 简单数据类型去重
filter + indexOf 兼容性好 性能较差 兼容性要求高的场景
reduce 灵活性高 代码稍显冗长 复杂逻辑场景
forEach + includes 逻辑清晰 性能较差 简单场景
Map 性能较好 代码稍显复杂 需要复杂操作的场景
lodash 功能强大、简洁 需要引入第三方库 项目中已使用 lodash 的场景

在实际开发中,推荐优先使用 Set,因为它简洁且性能优异。如果需要兼容性更好的方案,可以选择 filterindexOf。对于复杂场景,reduceMap 是不错的选择。如果项目中已经使用了 lodash,可以直接使用它的 uniq 方法。

希望本文能帮助你更好地理解和掌握 JavaScript 数组去重的多种实现方式!如果你有其他更好的方法,欢迎在评论区分享!

相关文章

  • JavaScript 数组去重的多种方式

    1、Set Object 或一行搞定 2、filter() 3、reduce() & includes() 4、r...

  • JavaScript编码能力

    1.多种方式实现数组去重、扁平化、对比优缺点 数组去重 扁平化 2.多种方式实现深拷贝、对比优缺点 3.手写函数柯...

  • JavaScript实现数组去重的方式

    1.使用ES6的Set进行去重 使用此方法非常简单,通俗易懂。该方法主要利用了Set内部结构的原理,然后通过Arr...

  • JavaScript 数组去重的多种方法原理详解

    JavaScript 数组去重的多种方法原理详解 说明 数组去重,这是一个面试经常会遇见的问题,网上讲数组去重的文...

  • JavaScript编码能力篇

    1.多种方式实现数组去重,扁平化、对比优缺点 数组去重 var arr =[1,43,2,4,5,7,4,2,3,...

  • JavaScript 实现数组去重

    方法一:双重遍历 方法二:借助indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等 方...

  • JavaScript实现数组去重

    前言 数组去重方法老生常谈,既然是常谈,我也来谈谈。 双层循环 indexOf 我们可以用 indexOf 简化内...

  • Array集结号

    实现数组去重的几种方法 数组去重一 数组去重二 利用数组indexof+push实现数组去重 数组去重三 利用对象...

  • 【JavaScript】数组去重

    话说面试常会碰到面试官会问JavaScript实现数组去重的问题,最近刚好在学习有关于JavaScript数组相关...

  • JavaScript数组去重算法实例

    本文主要介绍了JavaScript数组去重算法,结合实例形式总结分析了JavaScript数组去重相关的读写、遍历...

网友评论

    本文标题:JavaScript 数组去重的多种实现方式

    本文链接:https://www.haomeiwen.com/subject/txjymjtx.html