数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码 在真实的项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。虽然日常项目用到的概率比较低,但还是需要了解一下,以防面试的时候可能回被问到。

【1】利用ES6 Set去重(ES6中最常用)性能也可以

  1. function unique (arr) {
  2. return Array.from(new Set(arr))
  3. }
  4. var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
  5. console.log(unique(arr))
  6. //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {}, {}]

使用 Set 又需要多久时间来处理 15W 的数据呢?
数组去重 - 图1
然后我在两个数组长度后面分别加了一个 0,在 150W 的数据量之下…
数组去重 - 图2
居然有如此高性能且简洁的数组去重办法?!

【2】for…of + Object

这个方法我只在一些文章里见过,实际工作中倒没怎么用
首先创建一个空对象,然后用 for 循环遍历
利用对象的属性不会重复这一特性,校验数组元素是否重复

  1. function distinct(arr) {
  2. let result = []
  3. let obj = {}
  4. for (let i of arr) {
  5. if (!obj[i]) {
  6. result.push(i)
  7. obj[i] = 1 //这里1只是为了obj的值为1 不一定只是1可以为任何值
  8. }
  9. }
  10. return result
  11. }

当我看到这个方法的处理时长,我又傻眼了
数组去重 - 图3
15W 的数据居然只要 16ms ??? 比 Set () 还快???
然后我又试了试 150W 的数据量…
数组去重 - 图4

【3】双重 for 循环

最容易理解的方法,外层循环遍历元素,内层循环检查是否重复
当有重复值的时候,可以使用 push (),也可以使用 splice ()

  1. function unique(arr){
  2. for(var i=0; i<arr.length; i++){
  3. for(var j=i+1; j<arr.length; j++){
  4. if(arr[i]==arr[j]){ //第一个等同于第二个,splice方法删除第二个
  5. arr.splice(j,1);
  6. j--;
  7. }
  8. }
  9. }
  10. return arr;
  11. }
  12. var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
  13. console.log(unique(arr))
  14. //[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}] //NaN和{}没有去重,两个null直接消失了

但这种方法占用的内存较高,效率也是最低的

【4】Array.prototype.indexOf()

基本思路:如果索引不是第一个索引,说明是重复值。
实现一:

  • 利用Array.prototype.filter()过滤功能
  • Array.prototype.indexOf()返回的是第一个索引值
  • 只将数组中元素第一次出现的返回
  • 之后出现的将被过滤掉
    1. Array.prototype.unique = function () {
    2. return this.filter((item, index) => {
    3. return this.indexOf(item) === index;
    4. })
    5. }
    6. 复制代码
    实现二:
    1. let arr = [1, 2, 3, 22, 233, 22, 2, 233, 'a', 3, 'b', 'a'];
    2. Array.prototype.unique = function () {
    3. const newArray = [];
    4. this.forEach(item => {
    5. if (newArray.indexOf(item) === -1) {
    6. newArray.push(item);
    7. }
    8. });
    9. return newArray;
    10. }