JS中的数组去重:探究六种常用方法
2023-09-23 19:11:33
前言
JavaScript中数组去重是一个非常常见的问题,解决这个问题有好多种方法。面试时面试官也经常会问,你能不能写一个数组去重的办法呢?接下来我们就来聊聊JS中的数组去重问题。
方法
一、两层for循环
最朴素、最简单的去重方法就是使用两层for循环。
function unique(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
let isUnique = true;
for (let j = 0; j < i; j++) {
if (arr[i] === arr[j]) {
isUnique = false;
break;
}
}
if (isUnique) {
result.push(arr[i]);
}
}
return result;
}
这种方法的时间复杂度为O(n^2),空间复杂度为O(n)。
二、filter
可以使用filter方法来实现数组去重。
function unique(arr) {
return arr.filter((item, index, self) => self.indexOf(item) === index);
}
这种方法的时间复杂度为O(n^2),空间复杂度为O(n)。
三、set
可以使用set来实现数组去重。
function unique(arr) {
return [...new Set(arr)];
}
这种方法的时间复杂度为O(n),空间复杂度为O(n)。
四、Set
也可以使用Set来实现数组去重。
function unique(arr) {
const set = new Set(arr);
return Array.from(set);
}
这种方法的时间复杂度为O(n),空间复杂度为O(n)。
五、扩展运算符
可以使用扩展运算符来实现数组去重。
function unique(arr) {
return [...new Set(...arr)];
}
这种方法的时间复杂度为O(n),空间复杂度为O(n)。
六、Array.from()
可以使用Array.from()方法来实现数组去重。
function unique(arr) {
return Array.from(new Set(arr));
}
这种方法的时间复杂度为O(n),空间复杂度为O(n)。
比较
下表比较了以上六种数组去重方法的时间复杂度和空间复杂度。
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
两层for循环 | O(n^2) | O(n) |
filter | O(n^2) | O(n) |
set | O(n) | O(n) |
Set | O(n) | O(n) |
扩展运算符 | O(n) | O(n) |
Array.from() | O(n) | O(n) |
适用场景
两层for循环
两层for循环是一种最简单的数组去重方法,但是时间复杂度较高,不适合处理大型数组。
filter
filter方法是一种比较常用的数组去重方法,时间复杂度为O(n^2),空间复杂度为O(n)。
set
set是一种数据结构,可以自动去除重复元素。使用set来实现数组去重非常方便,时间复杂度为O(n),空间复杂度为O(n)。
Set
Set是一种数据结构,可以自动去除重复元素。使用Set来实现数组去重非常方便,时间复杂度为O(n),空间复杂度为O(n)。
扩展运算符
扩展运算符可以将一个数组展开为另一个数组。使用扩展运算符来实现数组去重非常方便,时间复杂度为O(n),空间复杂度为O(n)。
Array.from()
Array.from()方法可以将一个可迭代对象转换为数组。使用Array.from()方法来实现数组去重非常方便,时间复杂度为O(n),空间复杂度为O(n)。
总结
JavaScript中数组去重有很多种方法,每种方法都有自己的优缺点和适用场景。在实际应用中,应根据具体情况选择合适的方法。