数组去重的12种方法

 方法一:set:不是一种数据类型,始终数据结构;成员唯一

1 let  arr =[12,1,12,3,1,88,66,66,88,999];
2 function unique(ary){
3    let s = new Set(ary);
4     //Array.from:讲set数据类型结构转成真正的数组;
5     return Array.from(s)
6 }
7 unique(arr);

  方法二:对象属性名不能重复

let arr = [12,1,1,22,12,1,55,66,99,88,44]
 funciton unqiue(ary){
        let obj ={};
        for(let i = o ; i < ary.length; i++){
             let cur =ary[i];
             if(obj[cur]){
               //ary.splice(i,1)//导致数组塌陷
               ary[i] = ary[ary.length-1];
               ary.length--; //删除最后一项
              i--continue;
          }
          obj[cur]=cur;//给obj新增键值对;属性名和属性值一样
    }            
}    
 unique(arr);

   方法三:indexOf

 1 let arr = [12,1,12,3,1,88,66,9,66];
 2  function unique(ary) {
 3         let newAry = [];
 4         for(let i=0;i<ary.length;i++){
 5             let  cur = ary[i];
 6             if(newAry.indexOf(cur)===-1){
 7                 newAry.push(cur);
 8             }
 9         }
10         return newAry;
11     }
12     unique(arr)

  方法四: sort

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
       let a = ary.sort(function (a,b) {
           return a-b;
       });
       for(let i=0;i<a.length;i++){
           if(a[i]===a[i+1]){
               a.splice(i+1,1);
               i--;
           }
       }
       return a;
   }
   unique(arr)

  方法五:includes:包含;如果数组包含哪一样,返回true;不包含返回false;

 1 let arr = [12,1,12,3,1,88,66,9,66];
 2 function unique(ary) {
 3         let newAry = [];
 4         let len = ary.length;
 5         for(let i=0;i<len;i++){
 6             let cur = ary[i];
 7             if(!newAry.includes(cur)){
 8                 newAry.push(cur);
 9             }
10         }
11         return newAry;
12     }
13     console.log(unique(arr));

  方法六:hasOwnProperty:检测属性名对象的一个私有属性;返回一个布尔值

 1 let arr = [12,1,12,3,1,88,66,9,66];
 2 function unique(ary) {
 3         let obj = {};
 4         return ary.filter(function (item,index,a) {
 5             // item : 数组每一个成员
 6             // index: 成员对应的索引
 7             // a : 整个数组
 8             // hasOwnProperty来校验的该属性是否出现过;
 9            return  obj.hasOwnProperty(typeof item+item)?false:obj[typeof item+item]=true;
10            if(obj.hasOwnProperty(typeof item+item)){
11                return false
12            }else{
13                obj[typeof item+item]=true;
14                return true;
15            }
16         })
17     }
18     console.log(unique(arr))

  方法七:filter+indexOf

1 let arr = [12,1,12,3,1,88,66,9,66];
2     function unique(ary) {
3         return ary.filter(function (item,index,a) {
4             return ary.indexOf(item)===index;
5         })
6     }
7     console.log(unique(arr));

  方法八:splice

let arr = [12,1,12,3,1,88,66,9,66];
 function unique(ary) {
        for(let i=0;i<ary.length;i++){
            for(j=i+1;j<ary.length;j++){
                if(ary[i]===ary[j]){
                    ary.splice(j,1);
                    j--;
                }
            }
        }
        return ary;
    }
    unique(arr);

  方法九:递归

 1 let arr = [12,1,12,3,1,88,66,9,66];
 2 function unique(ary) {
 3         let  len= ary.length;
 4         ary = ary.sort(function (a,b) {
 5             return a-b;
 6         });
 7         function loop(index) {
 8             if(index>=1){
 9                 if(ary[index]===ary[index-1]){
10                     ary.splice(index,1);
11                 }
12                 loop(index-1)
13             }
14         }
15         loop(len-1);
16         return ary;
17     }
18     console.log(unique(arr));

  方法十:Map:利用map数据结构存值的特点

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        let newAry =[];
        let map = new Map();
        for(let i=0;i<ary.length;i++){
            if(!map.has(ary[i])){
                map.set(ary[i],true);
                newAry.push(ary[i]);
            }
        }
    }
    unique(arr);

  方法十一:reduce

let arr = [12,1,12,3,1,88,66,9,66];
function unique(ary) {
        // reduce : 第一个是函数,第二个参数会传给第一次回调的prev;
        return ary.reduce((prev,next)=>{
            // 该函数返回值是下一次执行的prev;
            return prev.includes(next)?prev:[...prev,next];
        },[])
    }
    console.log(unique(arr));

  方法十二:类似于方法一的set,用了剩余运算符...

let  arr = [12,1,12,3,1,88,66,9,66];
    let a = [...new Set(arr)];
    console.log(a);
原文地址:https://www.cnblogs.com/ly1368489670/p/12831176.html