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
同样的,使用该方法也不能去除重复的空对象{}。因为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
该方法不能去除空对象{}。includes内部使用的不是严格相等运算符,所以能判断出NaN,但是对于对象的判断是根据引用来判断的,所以无法去除重复的空对象{}。
4、利用对象属性:由于对象的属性不能相同的特点可以用来去重。
function remove_duplicate(array){
var newArray=[];
var obj={};
for(var i=1;i
一样的思路,还可以使用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
由于使用的是相等运算符==,无法去除NaN和空对象。
- indexOf方法:新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。
function remove_duplicate(array){
var newArray=[];
for(var i=0;i
- sort方法:利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。
function remove_duplicate(array){
var array=array.sort();
var newArray=[array[0]];
for(var i=1;i
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;
}
function remove_duplicate(arr){
return arr.filter(function(item,index,arr){
return arr.indexOf(item,0)===index;
});
}