返回

JS中的数组去重:探究六种常用方法

前端

前言

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中数组去重有很多种方法,每种方法都有自己的优缺点和适用场景。在实际应用中,应根据具体情况选择合适的方法。