去除数组重复成员

本文列举几种去除数组重复成员的方法:

1、使用ES6中新增的Set结构:利用Set结构中没有重复元素这一特性。

function remove_duplicate(array){
	return Array.from(new Set(array));
}

还有一种类似思路,不使用Array.from,使用扩展运算符,如下:

let arr=[3,5,2,3,5,6,5];
let newarr=[...new Set(arr)];

在这里插入图片描述
但是这种思路下无法去除重复的空对象{}。因为Set内部判断两个值是否不同,使用的算法叫做“ Same-value-zero equality ” ,它类似于精确相等运算符(===),主要区别是 NaN 等于自身,而精确相等运算符任务 NaN 不等于自身。并且两个对象总是不相等的,所以无法去除重复的空对象{}
在这里插入图片描述
在这里插入图片描述

2、使用ES6中的Map结构进行去重:创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。

function remove_duplicate(arr){
    let map=new Map();
    let array=new Array();
    for(let i=0;i<arr.length;i++){
        if(map.has(arr[i])){
            map.set(arr[i],true);
        }
        else{
            map.set(arr[i],false);
            array.push(arr[i]);
        }
    }
    return array;
}

在这里插入图片描述
同样的,使用该方法也不能去除重复的空对象{}。因为Map对比的是引用地址,引用地址不同则视为不相同。只有对同一个对象的引用,Map结构才将其视为同一个键。
3、利用includes方法:

function remove_duplicate(arr){
    return arr.reduce((prev,cur)=>pre.includes(cur)?prev:[...prev,cur],[]);
}
或者
function remove_duplicate(array){
    var newArray=[];
    for(var i=0;i<array.length;i++){
        if(!newArray.includes(array[i]))
            newArray.push(array[i]);
    }
    return newArray;
}

在这里插入图片描述
该方法不能去除空对象{}。includes内部使用的不是严格相等运算符,所以能判断出NaN,但是对于对象的判断是根据引用来判断的,所以无法去除重复的空对象{}。
4、利用对象属性:由于对象的属性不能相同的特点可以用来去重。

function remove_duplicate(array){
    var newArray=[];
    var obj={};
    for(var i=1;i<array.length;i++){
        if(!obj[array[i]]){
            newArray.push(array[i]);
            obj[array[i]]=1;
        }
        else
            obj[array[i]]++;
    }
    return newArray;
}

在这里插入图片描述
一样的思路,还可以使用hasOwnProperty方法,判断是否存在对象属性。

function remove_duplicate(arr){
    var obj ={};
    return arr.filter(function(item,index,arr){
        return obj.hasOwnProperty(typeof item+item)?false:(obj[typeof item+item]= true)   
    })
}

在这里插入图片描述
这种思路可以去除所有的重复元素。
5、利用几个常用的方法去除重复元素,比较时使用相等运算符,所以无法去除NaN和空对象{}。
- splice方法去重,是ES5中最常用的方法,需要使用for循环。

function remove_duplicate(array){
    for(var i=0;i<array.length;i++){
        for(var j=i+1;j<array.length;j++){
            if(array[i]==array[j]){
                array.splice(j,1);
                j--;
            }
        }
    }
    return array;
}

在这里插入图片描述
由于使用的是相等运算符==,无法去除NaN和空对象。
- indexOf方法:新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。

function remove_duplicate(array){
    var newArray=[];
    for(var i=0;i<array.length;i++){
        if(newArray.indexOf(array[i])===-1)
            newArray.push(array[i]);
    }
    return newArray;
}

在这里插入图片描述
- sort方法:利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。

function remove_duplicate(array){
    var array=array.sort();
    var newArray=[array[0]];
    for(var i=1;i<array.length;i++){
        if(array[i]!==array[i-1])
            newArray.push(array[i]);
    }
    return newArray;
}

在这里插入图片描述
- 递归去重

function remove_duplicate(arr){
    var array=arr;
    var len=array.length;
    array.sort(function(a,b){
        return a-b;
    })
    function loop(index){
        if(index>=1){
            if(array[index]===array[index-1]){
                array.splice(index,1);
            }
            loop(index-1);
        }
    }
    loop(len-1);
    return array;
}

在这里插入图片描述
6、filter方法:

function remove_duplicate(arr){
    return arr.filter(function(item,index,arr){
        return arr.indexOf(item,0)===index;   
    });
}

在这里插入图片描述
该方法不能去除空对象{}。且NaN直接被去掉了。这里不太理解为什么直接去掉了NaN,大家懂的话评论里讲一下呀!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值