第 113 题:根据以下要求,写一个数组去重函数

47 阅读3分钟

数组去重函数

在 JavaScript 中,数组去重是一个常见的需求。下面我们将实现一个简单的数组去重函数,支持不同类型的数据,并且保持原来的顺序。

实现思路

我们可以使用以下几种方式来实现数组去重:

  1. 使用 Set:Set 是 ES6 提供的一种新的数据结构,它只允许存储唯一值。我们可以直接将数组转换为 Set,然后再转换回数组。
  2. 使用 filter 和 indexOf:通过 filter 方法结合 indexOf 方法来实现去重。
  3. 使用对象映射:利用对象的键值唯一性来去重。

下面依次展示这三种方法的实现。

方法一:使用 Set

使用 Set 实现去重是最简单也是最常用的方法:

function uniqueArray(arr) {
  return Array.from(new Set(arr));
}

// 示例
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = uniqueArray(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

解释:

  • new Set(arr) 创建一个新的 Set 实例,自动去重。
  • Array.from() 将 Set 转换回数组。

方法二:使用 filter 和 indexOf

利用 filter 方法和 indexOf 方法可以实现去重,保持原有顺序:

function uniqueArray(arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index);
}

// 示例
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = uniqueArray(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

解释:

  • filter 方法遍历数组,对每个元素执行一个函数。
  • indexOf(item) 返回当前元素在数组中第一次出现的位置,如果当前元素的索引与第一次出现的位置相同,则保留该元素。

方法三:使用对象映射

通过创建一个对象来存储已经出现的元素,这样可以实现去重:

function uniqueArray(arr) {
  const result = [];
  const seen = {};

  for (const item of arr) {
    if (!seen[item]) {
      seen[item] = true; // 标记该元素为已见过
      result.push(item); // 添加到结果数组
    }
  }
  
  return result;
}

// 示例
const arr = [1, 2, 2, 3, 4, 4, 5];
const uniqueArr = uniqueArray(arr);
console.log(uniqueArr); // 输出: [1, 2, 3, 4, 5]

解释:

  • seen 对象用于存储已出现的元素。
  • 遍历数组时,检查该元素是否已经在 seen 对象中,如果没有,则将其添加到结果数组中。

性能比较

  • Set 方法的时间复杂度为 O(n),因为它的去重操作是基于哈希表实现的,效率较高。
  • filter + indexOf 方法的时间复杂度为 O(n^2),因为 indexOf 在每次调用时要遍历数组,性能较低。
  • 对象映射方法的时间复杂度为 O(n),同样高效。

在实际开发中,推荐使用 Set 方法,因为它简单且性能优越。

总结

通过上述三种方法,我们实现了数组的去重功能。根据数据量的不同,选择合适的去重方案可以有效提升性能。一般情况下,使用 Set 是最推荐的方式,而对于兼容性要求较高的场景,可以考虑使用对象映射的方法。希望这篇文章对你理解数组去重有所帮助!