数组去重函数
在 JavaScript 中,数组去重是一个常见的需求。下面我们将实现一个简单的数组去重函数,支持不同类型的数据,并且保持原来的顺序。
实现思路
我们可以使用以下几种方式来实现数组去重:
- 使用 Set:Set 是 ES6 提供的一种新的数据结构,它只允许存储唯一值。我们可以直接将数组转换为 Set,然后再转换回数组。
- 使用 filter 和 indexOf:通过
filter方法结合indexOf方法来实现去重。 - 使用对象映射:利用对象的键值唯一性来去重。
下面依次展示这三种方法的实现。
方法一:使用 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 是最推荐的方式,而对于兼容性要求较高的场景,可以考虑使用对象映射的方法。希望这篇文章对你理解数组去重有所帮助!