实现数组去重的方法


# 实现数组去重的方法

# 功能描述

去除数组中的重复元素。

# 手写实现

# 思路一

双层 for 循环:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;因为它的时间复杂度是 O(n^2),如果数组长度很大,效率会很低。

function distinct(arr) {
  for (let i = 0, len = arr.length; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
      if (arr[i] == arr[j]) {
        arr.splice(j, 1);
        // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
        len--;
        j--;
      }
    }
  }
  return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 思路二

reduce 实现数组去重:利用高阶函数 reduce 进行去重,需要注意该函数的第二个参数 initialValue 得放一个空数组 [],不然没法 push

function distinct(arr) {
  return arr.reduce((acc, value) => {
    if (!acc.includes(value)) {
      acc.push(value);
    }
    return acc;
  }, [])
}
1
2
3
4
5
6
7
8

# 思路三

ES6 中的 Set 去重:例如 ES6 中新的数据结构 Set,它的一个特性就是成员值都是唯一的,没有重复的值。

function distinct(arr) {
  return [...new Set(arr)];
}
1
2
3

# 测试用例

let arr = [1, 2, 2, 3, 3, 3, 4, 5, 5];

console.log(distinct(arr));
// [1, 2, 3, 4, 5]
1
2
3
4

(完)