实现数组去重的方法


# 实现数组去重的方法

# 功能描述

去除数组中的重复元素。

# 手写实现

# 思路一(ES5 时代常用)

注意:因为用到了 splice,所以该方法会改变原数组。

双层 for 循环:外层循环一次,内层从数组当前项的下一项开始循环。也就是外层从数组的第一项开始,分别在内层循环中,和数组的下一项开始逐一进行比较,如果出现重复元素就删掉。这种方法逻辑复杂且性能低,不推荐

function distinct(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        // arr 删除重复元素
        arr.splice(j, 1);
        // splice 会改变数组长度,所以每删除一个数 arr.length 就比原先少了 1,故 j 的值要减 1
        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

# 测试用例

针对上述思路二和思路三,在 ES6 出现后思路一已不再推荐使用。

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

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

(完)