1.利用ES6新特性set的属性
function a(arr){
return [...new Set(arr)] or Array.from(new Set(arr))
}
Array.from 作用:将类数组对象或者可遍历对象转换成一个真正的数组。
...拓展运算符作用:扩展运算符还可以将字符串转为真正的数组
缺点是不考虑兼容性,不能去除空对象。
2.利用for嵌套for循环
functionunique(arr){
for(vari=0; I<arr.length;i++){
for(var j=I+1;j<arr.length;j++{
if(arr[I]==arr[j]){
arr.splice(j,1);
j--;}}}
return arr;}
双层循环外层循环与内层循环相互对比,值相同,删除这个值(利用数组的方法splice)
NaN和{} 空对象不会去除 两个null全部删除
3.利用indexOf去重
function unique(arr){
if(!Array.isArray(arr)){
console.log('type error')
return
}
var array = [];
for (var I=0; I<arr.length; I++){
if(array.indexOf(arr[I]) === -1){
array.push(arr[i])
}
}
return array;
}
//NaN、{} 没有去重。 新建空的结果数组。for循环原数组 判断结果数组中是否存在当前元素,有值就会跳过,没有值就push
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
如果没有找到匹配的字符串则返回 -1。
4.利用sort方法
function unique(arr){
if(!Array.isArray(arr)){
console.log('type error')
return
}
arr = arr.sort()
var array = [arr[0]]
for(var I=1;i<arr.length;i++){
if(arr[I] !== arr[i-1]){
array.push(arr[i]);
}
return array;
}
相邻对比,没有就添加到数组里
5.利用includes(检测数组中是否包含某一个值)
function unique(arr){
if(!Array.isArray(arr)){
console.log('type error')
return
}
var array = []
for(var I=0;i<arr.length;i++){
if(!array.includes(arr[i])){
array.push(arr[i])
}
}
//{}没有去重
6.利用hasOwnProperty
function unique(arr){
var obj = {};
return arr.filter(function(item, index,arr){
return obj.hasOwnProperty(typeof item + item)?false :(obj[typeof item+item] =true)})
}
//所有的都去重了
obj.hasOwnProperty就是检测下对象是不是有个属性
用for...in循环会获取到原型链上的可枚举属性,不过可以使用hasOwnProperty()方法过滤掉。
这里的typeof item + item可以输出"item数据类型 + item值"的字符串结果,然后通过hasOwnPrototype()来判断obj内是否有这个数据类型的数据(hasOwnPrototype()不会攀升原型链),如果有那么就直接返回false,根据filter()的用法,这个数据就会被过滤掉。
如果这个obj内没有这个类型的数据,那么就会通过obj[数据类型]的方式将这个类型存入obj中,并且设定值为true,同时这个数据根据filter()的用法,会保留。
7.利用filter 过滤器
function unique(arr){
return arr.filter(function(item, index,arr){
//当前元素,在原始数组中的第一个索引 == 当前索引值,否则返回当前元素
return arr.indexOf(item,0) === index;
})
8.使用map特性
functionarrayNonRepeatfy(arr) {
letmap=newMap();
letarray=newArray();// 数组用于返回结果
for(let i =0; i < arr.length; i++) {
if(map.has(arr[i])) {
// 如果有该key值 map.set(arr[i],true);
}else{
map.set(arr[i],false);// 如果没有该key值
array.push(arr[i]);
} }
return array;
}
创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。